ZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL0RhdGEuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL0RhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjE0NzZjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvRGF0YS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFjdGl2ZTsKKworLyoqCisgKiBUaGlzIGFubm90YXRpb24gaXMgdXNlZCBieSB0aGUgWHRlbmQgY29tcGlsZXIuCisgKiBJdCB0dXJucyBhbiBhbm5vdGF0ZWQgY2xhc3MgaW50byBhbiBpbW11dGFibGUgdmFsdWUgb2JqZWN0LgorICogCisgKiBBbGwgZmllbGRzIGJlY29tZSBmaW5hbCBhbmQgYSBnZXR0ZXIgbWV0aG9kIGlzIGFkZGVkLgorICogVGhlIGZpZWxkcycgbmFtZSBhcmUgcHJlcGVuZGVkIHdpdGggYW4gdW5kZXJzY29yZSAoaS5lLiA8dHQ+bXlGaWVsZDwvdHQ+IGJlY29tZXMgPHR0Pl9teUZpZWxkPC90dD4pCisgKiBPbmUgY29uc3RydWN0b3IgZm9yIGluaXRpYWxpemluZyB0aGUgdW5pbml0aWFsaXplZCBmaWVsZHMgaXMgYWRkZWQuCisgKiB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfSBhbmQge0BsaW5rIE9iamVjdCNoYXNoQ29kZSgpfSBpbXBsZW1lbnRhdGlvbnMgYXJlIGFkZGVkLgorICoge0BsaW5rIE9iamVjdCN0b1N0cmluZygpfSBpbXBsZW1lbnRhdGlvbiBpcyBhZGRlZC4KKyAqIAorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9ucy5EYXRhfSBpbnN0ZWFkCisgKi8KK0BUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkKK0BBY3RpdmUoRGF0YVByb2Nlc3Nvci5jbGFzcykKK0BEZXByZWNhdGVkCitARG9jdW1lbnRlZAorQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgQGludGVyZmFjZSBEYXRhIHsKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL0RhdGEueHRlbmQgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9EYXRhLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MjJjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9EYXRhLnh0ZW5kCkBAIC0wLDAgKzEsMTEwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYgorCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZAoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zLkFjY2Vzc29yc1Byb2Nlc3NvcgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9ucy5FcXVhbHNIYXNoQ29kZVByb2Nlc3NvcgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9ucy5GaW5hbEZpZWxkc0NvbnN0cnVjdG9yUHJvY2Vzc29yCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zLlRvU3RyaW5nUHJvY2Vzc29yCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFic3RyYWN0Q2xhc3NQcm9jZXNzb3IKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uQWN0aXZlCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLlRyYW5zZm9ybWF0aW9uQ29udGV4dAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVDbGFzc0RlY2xhcmF0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLlZpc2liaWxpdHkKKworLyoqCisgKiBUaGlzIGFubm90YXRpb24gaXMgdXNlZCBieSB0aGUgWHRlbmQgY29tcGlsZXIuCisgKiBJdCB0dXJucyBhbiBhbm5vdGF0ZWQgY2xhc3MgaW50byBhbiBpbW11dGFibGUgdmFsdWUgb2JqZWN0LgorICogCisgKiBBbGwgZmllbGRzIGJlY29tZSBmaW5hbCBhbmQgYSBnZXR0ZXIgbWV0aG9kIGlzIGFkZGVkLgorICogVGhlIGZpZWxkcycgbmFtZSBhcmUgcHJlcGVuZGVkIHdpdGggYW4gdW5kZXJzY29yZSAoaS5lLiA8dHQ+bXlGaWVsZDwvdHQ+IGJlY29tZXMgPHR0Pl9teUZpZWxkPC90dD4pCisgKiBPbmUgY29uc3RydWN0b3IgZm9yIGluaXRpYWxpemluZyB0aGUgdW5pbml0aWFsaXplZCBmaWVsZHMgaXMgYWRkZWQuCisgKiB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfSBhbmQge0BsaW5rIE9iamVjdCNoYXNoQ29kZSgpfSBpbXBsZW1lbnRhdGlvbnMgYXJlIGFkZGVkLgorICoge0BsaW5rIE9iamVjdCN0b1N0cmluZygpfSBpbXBsZW1lbnRhdGlvbiBpcyBhZGRlZC4gIAorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zLkRhdGF9IGluc3RlYWQKKyAqLworQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQorQEFjdGl2ZShEYXRhUHJvY2Vzc29yKQorQERlcHJlY2F0ZWQKK0BEb2N1bWVudGVkCithbm5vdGF0aW9uIERhdGEgeworfQorCisvKioKKyAqIEBzaW5jZSAyLjcKKyAqIEBub2V4dGVuZAorICogQG5vcmVmZXJlbmNlCisgKi8KK0BEZXByZWNhdGVkCitjbGFzcyBEYXRhUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDbGFzc1Byb2Nlc3NvciB7CisJb3ZlcnJpZGUgZG9UcmFuc2Zvcm0oTXV0YWJsZUNsYXNzRGVjbGFyYXRpb24gaXQsIGV4dGVuc2lvbiBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworCQlleHRlbnNpb24gdmFsIHV0aWwgPSBuZXcgRGF0YVByb2Nlc3Nvci5VdGlsKGNvbnRleHQpCisJCWV4dGVuc2lvbiB2YWwgZ2V0dGVyVXRpbCA9IG5ldyBBY2Nlc3NvcnNQcm9jZXNzb3IuVXRpbChjb250ZXh0KQorCQlleHRlbnNpb24gdmFsIGVoVXRpbCA9IG5ldyBFcXVhbHNIYXNoQ29kZVByb2Nlc3Nvci5VdGlsKGNvbnRleHQpCisJCWV4dGVuc2lvbiB2YWwgdG9TdHJpbmdVdGlsID0gbmV3IFRvU3RyaW5nUHJvY2Vzc29yLlV0aWwoY29udGV4dCkKKwkJZXh0ZW5zaW9uIHZhbCByZXF1aXJlZEFyZ3NVdGlsID0gbmV3IEZpbmFsRmllbGRzQ29uc3RydWN0b3JQcm9jZXNzb3IuVXRpbChjb250ZXh0KQorCisJCWRhdGFGaWVsZHMuZm9yRWFjaCBbCisJCQlmaW5hbCA9IHRydWUKKwkJXQorCQlpZiAobmVlZHNGaW5hbEZpZWxkQ29uc3RydWN0b3IpIHsKKwkJCWFkZEZpbmFsRmllbGRzQ29uc3RydWN0b3IKKwkJfQorCQlpZiAoIWhhc0hhc2hDb2RlKSB7CisJCQlhZGRIYXNoQ29kZShkYXRhRmllbGRzLCBoYXNTdXBlckhhc2hDb2RlKQorCQl9CisJCWlmICghaGFzRXF1YWxzKSB7CisJCQlhZGRFcXVhbHMoZGF0YUZpZWxkcywgaGFzU3VwZXJFcXVhbHMpCisJCX0KKwkJaWYgKCFoYXNUb1N0cmluZykgeworCQkJYWRkRGF0YVRvU3RyaW5nCisJCX0KKwkJZGF0YUZpZWxkcy5mb3JFYWNoIFsKKwkJCWlmIChzaG91bGRBZGRHZXR0ZXIpIHsKKwkJCQlhZGRHZXR0ZXIoVmlzaWJpbGl0eS5QVUJMSUMpCisJCQl9CisJCQlzaW1wbGVOYW1lID0gIl8iICsgc2ltcGxlTmFtZS50b0ZpcnN0TG93ZXIKKwkJXQorCX0KKworCS8qKgorCSAqIEBzaW5jZSAyLjcKKwkgKiBAbm9leHRlbmQKKwkgKiBAbm9yZWZlcmVuY2UKKyAJICovCisJQERlcHJlY2F0ZWQKKwlzdGF0aWMgY2xhc3MgVXRpbCB7CisKKwkJZXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0CisKKwkJbmV3KFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0CisJCX0KKworCQlkZWYgZ2V0RGF0YUZpZWxkcyhDbGFzc0RlY2xhcmF0aW9uIGl0KSB7CisJCQlkZWNsYXJlZEZpZWxkcy5maWx0ZXJbIXN0YXRpYyAmJiBpc1RoZVByaW1hcnlHZW5lcmF0ZWRKYXZhRWxlbWVudF0KKwkJfQorCisJCWRlZiBnZXREYXRhRmllbGRzKE11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGl0KSB7CisJCQlkZWNsYXJlZEZpZWxkcy5maWx0ZXJbIXN0YXRpYyAmJiBpc1RoZVByaW1hcnlHZW5lcmF0ZWRKYXZhRWxlbWVudF0KKwkJfQorCQkKKwkJZGVmIHZvaWQgYWRkRGF0YVRvU3RyaW5nKE11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGNscykgeworCQkJY2xzLmFkZE1ldGhvZCgidG9TdHJpbmciKSBbCisJCQkJcHJpbWFyeVNvdXJjZUVsZW1lbnQgPSBjbHMucHJpbWFyeVNvdXJjZUVsZW1lbnQKKwkJCQlyZXR1cm5UeXBlID0gc3RyaW5nCisJCQkJYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uUmVmZXJlbmNlKE92ZXJyaWRlKSkKKwkJCQlhZGRBbm5vdGF0aW9uKG5ld0Fubm90YXRpb25SZWZlcmVuY2UoUHVyZSkpCisJCQkJYm9keSA9ICcnJworCQkJCQlTdHJpbmcgcmVzdWx0ID0gbmV3IKtvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIudXRpbC5Ub1N0cmluZ0hlbHBlcrsoKS50b1N0cmluZyh0aGlzKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQknJycKKwkJCV0KKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvRGF0YVByb2Nlc3Nvci5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvRGF0YVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYTJjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9EYXRhUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9ucy5BY2Nlc3NvcnNQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zLkVxdWFsc0hhc2hDb2RlUHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9ucy5GaW5hbEZpZWxkc0NvbnN0cnVjdG9yUHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9ucy5Ub1N0cmluZ1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uQWJzdHJhY3RDbGFzc1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uVHJhbnNmb3JtYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTXV0YWJsZUZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVmlzaWJpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuSXRlcmFibGVFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzLlByb2NlZHVyZTE7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlB1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlN0cmluZ0V4dGVuc2lvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLnV0aWwuVG9TdHJpbmdIZWxwZXI7CisKKy8qKgorICogQHNpbmNlIDIuNworICogQG5vZXh0ZW5kCisgKiBAbm9yZWZlcmVuY2UKKyAqLworQERlcHJlY2F0ZWQKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIERhdGFQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdENsYXNzUHJvY2Vzc29yIHsKKyAgLyoqCisgICAqIEBzaW5jZSAyLjcKKyAgICogQG5vZXh0ZW5kCisgICAqIEBub3JlZmVyZW5jZQorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBVdGlsIHsKKyAgICBARXh0ZW5zaW9uCisgICAgcHJpdmF0ZSBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dDsKKyAgICAKKyAgICBwdWJsaWMgVXRpbChmaW5hbCBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICB9CisgICAgCisgICAgcHVibGljIEl0ZXJhYmxlPD8gZXh0ZW5kcyBGaWVsZERlY2xhcmF0aW9uPiBnZXREYXRhRmllbGRzKGZpbmFsIENsYXNzRGVjbGFyYXRpb24gaXQpIHsKKyAgICAgIGZpbmFsIEZ1bmN0aW9uMTxGaWVsZERlY2xhcmF0aW9uLCBCb29sZWFuPiBfZnVuY3Rpb24gPSAoRmllbGREZWNsYXJhdGlvbiBpdF8xKSAtPiB7CisgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKCghaXRfMS5pc1N0YXRpYygpKSAmJiB0aGlzLmNvbnRleHQuaXNUaGVQcmltYXJ5R2VuZXJhdGVkSmF2YUVsZW1lbnQoaXRfMSkpKTsKKyAgICAgIH07CisgICAgICByZXR1cm4gSXRlcmFibGVFeHRlbnNpb25zLmZpbHRlcihpdC5nZXREZWNsYXJlZEZpZWxkcygpLCBfZnVuY3Rpb24pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgSXRlcmFibGU8PyBleHRlbmRzIE11dGFibGVGaWVsZERlY2xhcmF0aW9uPiBnZXREYXRhRmllbGRzKGZpbmFsIE11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGl0KSB7CisgICAgICBmaW5hbCBGdW5jdGlvbjE8TXV0YWJsZUZpZWxkRGVjbGFyYXRpb24sIEJvb2xlYW4+IF9mdW5jdGlvbiA9IChNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBpdF8xKSAtPiB7CisgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKCghaXRfMS5pc1N0YXRpYygpKSAmJiB0aGlzLmNvbnRleHQuaXNUaGVQcmltYXJ5R2VuZXJhdGVkSmF2YUVsZW1lbnQoaXRfMSkpKTsKKyAgICAgIH07CisgICAgICByZXR1cm4gSXRlcmFibGVFeHRlbnNpb25zLmZpbHRlcihpdC5nZXREZWNsYXJlZEZpZWxkcygpLCBfZnVuY3Rpb24pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGREYXRhVG9TdHJpbmcoZmluYWwgTXV0YWJsZUNsYXNzRGVjbGFyYXRpb24gY2xzKSB7CisgICAgICBmaW5hbCBQcm9jZWR1cmUxPE11dGFibGVNZXRob2REZWNsYXJhdGlvbj4gX2Z1bmN0aW9uID0gKE11dGFibGVNZXRob2REZWNsYXJhdGlvbiBpdCkgLT4geworICAgICAgICB0aGlzLmNvbnRleHQuc2V0UHJpbWFyeVNvdXJjZUVsZW1lbnQoaXQsIHRoaXMuY29udGV4dC5nZXRQcmltYXJ5U291cmNlRWxlbWVudChjbHMpKTsKKyAgICAgICAgaXQuc2V0UmV0dXJuVHlwZSh0aGlzLmNvbnRleHQuZ2V0U3RyaW5nKCkpOworICAgICAgICBpdC5hZGRBbm5vdGF0aW9uKHRoaXMuY29udGV4dC5uZXdBbm5vdGF0aW9uUmVmZXJlbmNlKE92ZXJyaWRlLmNsYXNzKSk7CisgICAgICAgIGl0LmFkZEFubm90YXRpb24odGhpcy5jb250ZXh0Lm5ld0Fubm90YXRpb25SZWZlcmVuY2UoUHVyZS5jbGFzcykpOworICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IF9jbGllbnQgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCgpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRUbyhTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50LlRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIpIHsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiU3RyaW5nIHJlc3VsdCA9IG5ldyAiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChUb1N0cmluZ0hlbHBlci5jbGFzcyk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIigpLnRvU3RyaW5nKHRoaXMpOyIpOworICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuIHJlc3VsdDsiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGl0LnNldEJvZHkoX2NsaWVudCk7CisgICAgICB9OworICAgICAgY2xzLmFkZE1ldGhvZCgidG9TdHJpbmciLCBfZnVuY3Rpb24pOworICAgIH0KKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGRvVHJhbnNmb3JtKGZpbmFsIE11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGl0LCBARXh0ZW5zaW9uIGZpbmFsIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgQEV4dGVuc2lvbgorICAgIGZpbmFsIERhdGFQcm9jZXNzb3IuVXRpbCB1dGlsID0gbmV3IERhdGFQcm9jZXNzb3IuVXRpbChjb250ZXh0KTsKKyAgICBARXh0ZW5zaW9uCisgICAgZmluYWwgQWNjZXNzb3JzUHJvY2Vzc29yLlV0aWwgZ2V0dGVyVXRpbCA9IG5ldyBBY2Nlc3NvcnNQcm9jZXNzb3IuVXRpbChjb250ZXh0KTsKKyAgICBARXh0ZW5zaW9uCisgICAgZmluYWwgRXF1YWxzSGFzaENvZGVQcm9jZXNzb3IuVXRpbCBlaFV0aWwgPSBuZXcgRXF1YWxzSGFzaENvZGVQcm9jZXNzb3IuVXRpbChjb250ZXh0KTsKKyAgICBARXh0ZW5zaW9uCisgICAgZmluYWwgVG9TdHJpbmdQcm9jZXNzb3IuVXRpbCB0b1N0cmluZ1V0aWwgPSBuZXcgVG9TdHJpbmdQcm9jZXNzb3IuVXRpbChjb250ZXh0KTsKKyAgICBARXh0ZW5zaW9uCisgICAgZmluYWwgRmluYWxGaWVsZHNDb25zdHJ1Y3RvclByb2Nlc3Nvci5VdGlsIHJlcXVpcmVkQXJnc1V0aWwgPSBuZXcgRmluYWxGaWVsZHNDb25zdHJ1Y3RvclByb2Nlc3Nvci5VdGlsKGNvbnRleHQpOworICAgIGZpbmFsIENvbnN1bWVyPE11dGFibGVGaWVsZERlY2xhcmF0aW9uPiBfZnVuY3Rpb24gPSAoTXV0YWJsZUZpZWxkRGVjbGFyYXRpb24gaXRfMSkgLT4geworICAgICAgaXRfMS5zZXRGaW5hbCh0cnVlKTsKKyAgICB9OworICAgIHV0aWwuZ2V0RGF0YUZpZWxkcyhpdCkuZm9yRWFjaChfZnVuY3Rpb24pOworICAgIGJvb2xlYW4gX25lZWRzRmluYWxGaWVsZENvbnN0cnVjdG9yID0gcmVxdWlyZWRBcmdzVXRpbC5uZWVkc0ZpbmFsRmllbGRDb25zdHJ1Y3RvcihpdCk7CisgICAgaWYgKF9uZWVkc0ZpbmFsRmllbGRDb25zdHJ1Y3RvcikgeworICAgICAgcmVxdWlyZWRBcmdzVXRpbC5hZGRGaW5hbEZpZWxkc0NvbnN0cnVjdG9yKGl0KTsKKyAgICB9CisgICAgYm9vbGVhbiBfaGFzSGFzaENvZGUgPSBlaFV0aWwuaGFzSGFzaENvZGUoaXQpOworICAgIGJvb2xlYW4gX25vdCA9ICghX2hhc0hhc2hDb2RlKTsKKyAgICBpZiAoX25vdCkgeworICAgICAgZWhVdGlsLmFkZEhhc2hDb2RlKGl0LCB1dGlsLmdldERhdGFGaWVsZHMoaXQpLCBlaFV0aWwuaGFzU3VwZXJIYXNoQ29kZShpdCkpOworICAgIH0KKyAgICBib29sZWFuIF9oYXNFcXVhbHMgPSBlaFV0aWwuaGFzRXF1YWxzKGl0KTsKKyAgICBib29sZWFuIF9ub3RfMSA9ICghX2hhc0VxdWFscyk7CisgICAgaWYgKF9ub3RfMSkgeworICAgICAgZWhVdGlsLmFkZEVxdWFscyhpdCwgdXRpbC5nZXREYXRhRmllbGRzKGl0KSwgZWhVdGlsLmhhc1N1cGVyRXF1YWxzKGl0KSk7CisgICAgfQorICAgIGJvb2xlYW4gX2hhc1RvU3RyaW5nID0gdG9TdHJpbmdVdGlsLmhhc1RvU3RyaW5nKGl0KTsKKyAgICBib29sZWFuIF9ub3RfMiA9ICghX2hhc1RvU3RyaW5nKTsKKyAgICBpZiAoX25vdF8yKSB7CisgICAgICB1dGlsLmFkZERhdGFUb1N0cmluZyhpdCk7CisgICAgfQorICAgIGZpbmFsIENvbnN1bWVyPE11dGFibGVGaWVsZERlY2xhcmF0aW9uPiBfZnVuY3Rpb25fMSA9IChNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBpdF8xKSAtPiB7CisgICAgICBib29sZWFuIF9zaG91bGRBZGRHZXR0ZXIgPSBnZXR0ZXJVdGlsLnNob3VsZEFkZEdldHRlcihpdF8xKTsKKyAgICAgIGlmIChfc2hvdWxkQWRkR2V0dGVyKSB7CisgICAgICAgIGdldHRlclV0aWwuYWRkR2V0dGVyKGl0XzEsIFZpc2liaWxpdHkuUFVCTElDKTsKKyAgICAgIH0KKyAgICAgIFN0cmluZyBfZmlyc3RMb3dlciA9IFN0cmluZ0V4dGVuc2lvbnMudG9GaXJzdExvd2VyKGl0XzEuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgIFN0cmluZyBfcGx1cyA9ICgiXyIgKyBfZmlyc3RMb3dlcik7CisgICAgICBpdF8xLnNldFNpbXBsZU5hbWUoX3BsdXMpOworICAgIH07CisgICAgdXRpbC5nZXREYXRhRmllbGRzKGl0KS5mb3JFYWNoKF9mdW5jdGlvbl8xKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvTGliLmd3dC54bWwgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9MaWIuZ3d0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjlmODA4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvTGliLmd3dC54bWwKQEAgLTAsMCArMSw2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIG1vZHVsZSBQVUJMSUMgIi0vL0dvb2dsZSBJbmMuLy9EVEQgR29vZ2xlIFdlYiBUb29sa2l0IDIuNC4wLy9FTiIgImh0dHA6Ly9nb29nbGUtd2ViLXRvb2xraXQuZ29vZ2xlY29kZS5jb20vc3ZuL3RhZ3MvMi40LjAvZGlzdHJvLXNvdXJjZS9jb3JlL3NyYy9nd3QtbW9kdWxlLmR0ZCI+Cis8bW9kdWxlPgorCTxzb3VyY2UgcGF0aD0iIi8+CisJPGluaGVyaXRzIG5hbWU9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5MaWIiIC8+Cis8L21vZHVsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9Qcm9wZXJ0eS5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvUHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjI4ZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvUHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zLkFjY2Vzc29yczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uQWN0aXZlOworCisvKioKKyAqIENyZWF0ZXMgYSBnZXR0ZXIgYW5kIHNldHRlciBtZXRob2QgZm9yIHRoZSBhbm5vdGF0ZWQgZmllbGQuCisgKiBQcmVwZW5kcyB0aGUgZmllbGQgbmFtZSB3aXRoIGFuIHVuZGVyc2NvcmUgKGUuZy4gPGNvZGU+X215RmllbGQ8L2NvZGU+KQorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgQWNjZXNzb3JzfSBpbnN0ZWFkCisgKi8KK0BHd3RDb21wYXRpYmxlCitAVGFyZ2V0KEVsZW1lbnRUeXBlLkZJRUxEKQorQEFjdGl2ZShQcm9wZXJ0eVByb2Nlc3Nvci5jbGFzcykKK0BEZXByZWNhdGVkCitARG9jdW1lbnRlZAorQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgQGludGVyZmFjZSBQcm9wZXJ0eSB7Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9Qcm9wZXJ0eS54dGVuZCBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL1Byb3BlcnR5Lnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYjc0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9Qcm9wZXJ0eS54dGVuZApAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYgorCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZQoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zLkFjY2Vzc29ycworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9ucy5BY2Nlc3NvcnNQcm9jZXNzb3IKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uQWJzdHJhY3RGaWVsZFByb2Nlc3NvcgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5BY3RpdmUKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uVHJhbnNmb3JtYXRpb25Db250ZXh0CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVGaWVsZERlY2xhcmF0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLlZpc2liaWxpdHkKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkCisKKy8qKgorICogQ3JlYXRlcyBhIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZCBmb3IgdGhlIGFubm90YXRlZCBmaWVsZC4KKyAqIFByZXBlbmRzIHRoZSBmaWVsZCBuYW1lIHdpdGggYW4gdW5kZXJzY29yZSAoZS5nLiA8Y29kZT5fbXlGaWVsZDwvY29kZT4pCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBBY2Nlc3NvcnN9IGluc3RlYWQKKyAqLworQEd3dENvbXBhdGlibGUKK0BUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCitAQWN0aXZlKFByb3BlcnR5UHJvY2Vzc29yKQorQERlcHJlY2F0ZWQKK0BEb2N1bWVudGVkCithbm5vdGF0aW9uIFByb3BlcnR5IHsKK30KKworLyoqCisgKiBAc2luY2UgMi43CisgKiBAbm9leHRlbmQKKyAqIEBub3JlZmVyZW5jZQorICovCitARGVwcmVjYXRlZAorY2xhc3MgUHJvcGVydHlQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdEZpZWxkUHJvY2Vzc29yIHsKKwkKKwlvdmVycmlkZSBkb1RyYW5zZm9ybShNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBpdCwgZXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWV4dGVuc2lvbiB2YWwgdXRpbCA9IG5ldyBBY2Nlc3NvcnNQcm9jZXNzb3IuVXRpbChjb250ZXh0KQorCQlpZiAoIWhhc0dldHRlcikgeworCQkJYWRkR2V0dGVyKFZpc2liaWxpdHkuUFVCTElDKQorCQl9CisJCWlmICghZmluYWwgJiYgIWhhc1NldHRlcikgeworCQkJYWRkU2V0dGVyKFZpc2liaWxpdHkuUFVCTElDKQorCQl9CisJCXNpbXBsZU5hbWUgPSAiXyIgKyBzaW1wbGVOYW1lLnRvRmlyc3RMb3dlcgorCX0KK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL1Byb3BlcnR5UHJvY2Vzc29yLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9Qcm9wZXJ0eVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZTc0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9Qcm9wZXJ0eVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zLkFjY2Vzc29yc1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uQWJzdHJhY3RGaWVsZFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uVHJhbnNmb3JtYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVmlzaWJpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRXh0ZW5zaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5TdHJpbmdFeHRlbnNpb25zOworCisvKioKKyAqIEBzaW5jZSAyLjcKKyAqIEBub2V4dGVuZAorICogQG5vcmVmZXJlbmNlCisgKi8KK0BEZXByZWNhdGVkCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eVByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0RmllbGRQcm9jZXNzb3IgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZG9UcmFuc2Zvcm0oZmluYWwgTXV0YWJsZUZpZWxkRGVjbGFyYXRpb24gaXQsIEBFeHRlbnNpb24gZmluYWwgVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKyAgICBARXh0ZW5zaW9uCisgICAgZmluYWwgQWNjZXNzb3JzUHJvY2Vzc29yLlV0aWwgdXRpbCA9IG5ldyBBY2Nlc3NvcnNQcm9jZXNzb3IuVXRpbChjb250ZXh0KTsKKyAgICBib29sZWFuIF9oYXNHZXR0ZXIgPSB1dGlsLmhhc0dldHRlcihpdCk7CisgICAgYm9vbGVhbiBfbm90ID0gKCFfaGFzR2V0dGVyKTsKKyAgICBpZiAoX25vdCkgeworICAgICAgdXRpbC5hZGRHZXR0ZXIoaXQsIFZpc2liaWxpdHkuUFVCTElDKTsKKyAgICB9CisgICAgaWYgKCgoIWl0LmlzRmluYWwoKSkgJiYgKCF1dGlsLmhhc1NldHRlcihpdCkpKSkgeworICAgICAgdXRpbC5hZGRTZXR0ZXIoaXQsIFZpc2liaWxpdHkuUFVCTElDKTsKKyAgICB9CisgICAgU3RyaW5nIF9maXJzdExvd2VyID0gU3RyaW5nRXh0ZW5zaW9ucy50b0ZpcnN0TG93ZXIoaXQuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICBTdHJpbmcgX3BsdXMgPSAoIl8iICsgX2ZpcnN0TG93ZXIpOworICAgIGl0LnNldFNpbXBsZU5hbWUoX3BsdXMpOworICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9BY2Nlc3NvclR5cGUuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0FjY2Vzc29yVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNjBlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9BY2Nlc3NvclR5cGUuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKiAKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlOworCisvKioKKyAqIEBzaW5jZSAyLjcKKyAqIEBub3JlZmVyZW5jZQorICovCitAQmV0YQorQEd3dENvbXBhdGlibGUKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGVudW0gQWNjZXNzb3JUeXBlIHsKKyAgUFVCTElDX0dFVFRFUiwKKyAgCisgIFBST1RFQ1RFRF9HRVRURVIsCisgIAorICBQQUNLQUdFX0dFVFRFUiwKKyAgCisgIFBSSVZBVEVfR0VUVEVSLAorICAKKyAgUFVCTElDX1NFVFRFUiwKKyAgCisgIFBST1RFQ1RFRF9TRVRURVIsCisgIAorICBQQUNLQUdFX1NFVFRFUiwKKyAgCisgIFBSSVZBVEVfU0VUVEVSLAorICAKKyAgTk9ORTsKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0FjY2Vzc29ycy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvQWNjZXNzb3JzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjMjVmZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0FjY2Vzc29ycy5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqIAorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFjdGl2ZTsKKworLyoqCisgKiBDcmVhdGVzIGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGFubm90YXRlZCBmaWVsZHMgb3IgZm9yIGFsbCBmaWVsZHMgaW4gYW4gYW5ub3RhdGVkIGNsYXNzLgorICogPHA+CisgKiBBbm5vdGF0ZWQgb24gYSBmaWVsZAorICogPHVsPgorICogPGxpPkNyZWF0ZXMgYSBnZXR0ZXIgZm9yIHRoYXQgZmllbGQgaWYgbm9uZSBleGlzdHMuIEZvciBwcmltaXRpdmUgYm9vbGVhbiBwcm9wZXJ0aWVzLCB0aGUgImlzIi1wcmVmaXggaXMgdXNlZC48L2xpPgorICogPGxpPkNyZWF0ZXMgYSBzZXR0ZXIgZm9yIHRoYXQgZmllbGQgaWYgaXQgaXMgbm90IGZpbmFsIGFuZCBubyBzZXR0ZXIgZXhpc3RzPC9saT4KKyAqIDxsaT5CeSBkZWZhdWx0IHRoZSBhY2Nlc3NvcnMgYXJlIHB1YmxpYzwvbGk+CisgKiA8bGk+SWYgdGhlIHtAbGluayBBY2Nlc3NvclR5cGV9W10gYXJndW1lbnQgaXMgZ2l2ZW4sIG9ubHkgdGhlIGxpc3RlZAorICogYWNjZXNzb3JzIHdpdGggdGhlIHNwZWNpZmllZCB2aXNpYmlsaXR5IHdpbGwgYmUgZ2VuZXJhdGVkPC9saT4KKyAqIDxsaT5CeSBkZWZhdWx0IHRoZSBhY2Nlc3NvcnMgd2lsbCBiZSBkZXByZWNhdGVkIGlmIHRoZSBmaWVsZCBpcyBhbm5vdGF0ZWQgYXMgc3VjaC4KKyAqIFRoaXMgY2FuIGJlIGNoYW5nZWQgYnkgZXhwbGljaXRseSBwcm92aWRpbmcge0BsaW5rIEFjY2Vzc29ycyNkZXByZWNhdGlvblBvbGljeSBkZXByZWNhdGlvblBvbGljeX08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIDxwPgorICogQW5ub3RhdGVkIG9uIGEgY2xhc3MKKyAqIDx1bD4KKyAqIDxsaT5DcmVhdGVzIGFjY2Vzc29ycyBmb3IgYWxsIG5vbi1zdGF0aWMgZmllbGRzIG9mIHRoYXQgY2xhc3MgYXMgc3BlY2lmaWVkCisgKiBhYm92ZTwvbGk+CisgKiA8bGk+Q3JlYXRlcyBhIGNvbnN0cnVjdG9yIHRha2luZyBhbGwgZmluYWwgZmllbGRzIG9mIHRoZSBjbGFzcyBpZiBubworICogY29uc3RydWN0b3IgZXhpc3RzIHlldC4gSWYgdGhlcmUgYWxyZWFkeSBpcyBhIGNvbnN0cnVjdG9yIGFuZCB5b3Ugd2FudCB0aGUKKyAqIGRlZmF1bHQgb25lIG9uIHRvcCBvZiB0aGF0LCB5b3UgY2FuIHVzZSB0aGUge0BsaW5rIEZpbmFsRmllbGRzQ29uc3RydWN0b3J9CisgKiBhbm5vdGF0aW9uLjwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogRmllbGQtbGV2ZWwgYW5ub3RhdGlvbnMgaGF2ZSBwcmVjZWRlbmNlIG92ZXIgYSBjbGFzcy1sZXZlbCBhbm5vdGF0aW9uLiBBY2Nlc3NvcnMgY2FuIGJlIHN1cHByZXNzZWQgY29tcGxldGVseSBieSB1c2luZyB7QGxpbmsgQWNjZXNzb3JUeXBlI05PTkV9LgorICogVGhpcyBhbm5vdGF0aW9uIGNhbiBhbHNvIGJlIHVzZWQgdG8gZmluZS10dW5lIHRoZSBnZXR0ZXJzIGdlbmVyYXRlZCBieSB7QGxpbmsgRGF0YX0uCisgKiBAc2luY2UgMi43CisgKi8KK0BHd3RDb21wYXRpYmxlCitAVGFyZ2V0KHsgRWxlbWVudFR5cGUuRklFTEQsIEVsZW1lbnRUeXBlLlRZUEUgfSkKK0BBY3RpdmUoQWNjZXNzb3JzUHJvY2Vzc29yLmNsYXNzKQorQERvY3VtZW50ZWQKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIEBpbnRlcmZhY2UgQWNjZXNzb3JzIHsKKyAgLyoqCisgICAqIERlc2NyaWJlcyB0aGUgYWNjZXNzIG1vZGlmaWVycyBmb3IgZ2VuZXJhdGVkIGFjY2Vzc29ycy4gVmFsaWQgY29tYmluYXRpb25zCisgICAqIGluY2x1ZGUgYXQgbW9zdCBvbmUgdHlwZSBmb3IgZ2V0dGVycyBhbmQgb25lIGZvciBzZXR0ZXJzLgorICAgKiBBY2Nlc3NvcnMgbWF5IGJlIHN1cHByZXNzZWQgYnkgcGFzc2luZyB7QGxpbmsgQWNjZXNzb3JUeXBlI05PTkV9LgorICAgKi8KKyAgcHVibGljIEFjY2Vzc29yVHlwZVtdIHZhbHVlKCkgZGVmYXVsdCB7IEFjY2Vzc29yVHlwZS5QVUJMSUNfR0VUVEVSLCBBY2Nlc3NvclR5cGUuUFVCTElDX1NFVFRFUiB9OworICAvKioKKyAgICogRGVzY3JpYmVzIHdoZW4ge0Bjb2RlIEBEZXByZWNhdGVkfSB3aWxsIGJlIGFkZGVkIHRvIGdlbmVyYXRlZCBhY2Nlc3NvcnMuPGJyPgorICAgKiBJZiBpdCBpcyBub3Qgd2FudGVkIG9yIG5lZWRlZCwgcGFzcyB7QGxpbmsgQWNjZXNzb3JzRGVwcmVjYXRpb25Qb2xpY3kjTkVWRVJ9IHRvIHByZXZlbnQgdGhlIGFubm90YXRpb24gZnJvbSBiZWluZyBhZGRlZC4KKyAgICogQHNpbmNlIDIuMjMKKyAgICovCisgIEBCZXRhCisgIHB1YmxpYyBBY2Nlc3NvcnNEZXByZWNhdGlvblBvbGljeSBkZXByZWNhdGlvblBvbGljeSgpIGRlZmF1bHQgQWNjZXNzb3JzRGVwcmVjYXRpb25Qb2xpY3kuU0FNRV9BU19GSUVMRDsKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0FjY2Vzc29ycy54dGVuZCBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0FjY2Vzc29ycy54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTI5ZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvQWNjZXNzb3JzLnh0ZW5kCkBAIC0wLDAgKzEsMzYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9ucworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YQoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGUKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZQoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldAoraW1wb3J0IGphdmEudXRpbC5MaXN0CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFjdGl2ZQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5UcmFuc2Zvcm1hdGlvbkNvbnRleHQKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uVHJhbnNmb3JtYXRpb25QYXJ0aWNpcGFudAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uUmVmZXJlbmNlCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkFubm90YXRpb25UYXJnZXQKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uRmllbGREZWNsYXJhdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlRmllbGREZWNsYXJhdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlTWVtYmVyRGVjbGFyYXRpb24KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVHlwZVJlZmVyZW5jZQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5WaXNpYmlsaXR5CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZAorCisvKioKKyAqIENyZWF0ZXMgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgYW5ub3RhdGVkIGZpZWxkcyBvciBmb3IgYWxsIGZpZWxkcyBpbiBhbiBhbm5vdGF0ZWQgY2xhc3MuCisgKiA8cD4KKyAqIEFubm90YXRlZCBvbiBhIGZpZWxkCisgKiA8dWw+CisgKiA8bGk+Q3JlYXRlcyBhIGdldHRlciBmb3IgdGhhdCBmaWVsZCBpZiBub25lIGV4aXN0cy4gRm9yIHByaW1pdGl2ZSBib29sZWFuIHByb3BlcnRpZXMsIHRoZSAiaXMiLXByZWZpeCBpcyB1c2VkLjwvbGk+CisgKiA8bGk+Q3JlYXRlcyBhIHNldHRlciBmb3IgdGhhdCBmaWVsZCBpZiBpdCBpcyBub3QgZmluYWwgYW5kIG5vIHNldHRlciBleGlzdHM8L2xpPgorICogPGxpPkJ5IGRlZmF1bHQgdGhlIGFjY2Vzc29ycyBhcmUgcHVibGljPC9saT4KKyAqIDxsaT5JZiB0aGUge0BsaW5rIEFjY2Vzc29yVHlwZX1bXSBhcmd1bWVudCBpcyBnaXZlbiwgb25seSB0aGUgbGlzdGVkCisgKiBhY2Nlc3NvcnMgd2l0aCB0aGUgc3BlY2lmaWVkIHZpc2liaWxpdHkgd2lsbCBiZSBnZW5lcmF0ZWQ8L2xpPgorICogPGxpPkJ5IGRlZmF1bHQgdGhlIGFjY2Vzc29ycyB3aWxsIGJlIGRlcHJlY2F0ZWQgaWYgdGhlIGZpZWxkIGlzIGFubm90YXRlZCBhcyBzdWNoLgorICogVGhpcyBjYW4gYmUgY2hhbmdlZCBieSBleHBsaWNpdGx5IHByb3ZpZGluZyB7QGxpbmsgQWNjZXNzb3JzI2RlcHJlY2F0aW9uUG9saWN5IGRlcHJlY2F0aW9uUG9saWN5fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogPHA+CisgKiBBbm5vdGF0ZWQgb24gYSBjbGFzcworICogPHVsPgorICogPGxpPkNyZWF0ZXMgYWNjZXNzb3JzIGZvciBhbGwgbm9uLXN0YXRpYyBmaWVsZHMgb2YgdGhhdCBjbGFzcyBhcyBzcGVjaWZpZWQKKyAqIGFib3ZlPC9saT4KKyAqIDxsaT5DcmVhdGVzIGEgY29uc3RydWN0b3IgdGFraW5nIGFsbCBmaW5hbCBmaWVsZHMgb2YgdGhlIGNsYXNzIGlmIG5vCisgKiBjb25zdHJ1Y3RvciBleGlzdHMgeWV0LiBJZiB0aGVyZSBhbHJlYWR5IGlzIGEgY29uc3RydWN0b3IgYW5kIHlvdSB3YW50IHRoZQorICogZGVmYXVsdCBvbmUgb24gdG9wIG9mIHRoYXQsIHlvdSBjYW4gdXNlIHRoZSB7QGxpbmsgRmluYWxGaWVsZHNDb25zdHJ1Y3Rvcn0KKyAqIGFubm90YXRpb24uPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBGaWVsZC1sZXZlbCBhbm5vdGF0aW9ucyBoYXZlIHByZWNlZGVuY2Ugb3ZlciBhIGNsYXNzLWxldmVsIGFubm90YXRpb24uIEFjY2Vzc29ycyBjYW4gYmUgc3VwcHJlc3NlZCBjb21wbGV0ZWx5IGJ5IHVzaW5nIHtAbGluayBBY2Nlc3NvclR5cGUjTk9ORX0uCisgKiBUaGlzIGFubm90YXRpb24gY2FuIGFsc28gYmUgdXNlZCB0byBmaW5lLXR1bmUgdGhlIGdldHRlcnMgZ2VuZXJhdGVkIGJ5IHtAbGluayBEYXRhfS4KKyAqIEBzaW5jZSAyLjcKKyAqLworQEd3dENvbXBhdGlibGUKK0BUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQsIEVsZW1lbnRUeXBlLlRZUEUpCitAQWN0aXZlKEFjY2Vzc29yc1Byb2Nlc3NvcikKK0BEb2N1bWVudGVkCithbm5vdGF0aW9uIEFjY2Vzc29ycyB7CisJLyoqCisJICogRGVzY3JpYmVzIHRoZSBhY2Nlc3MgbW9kaWZpZXJzIGZvciBnZW5lcmF0ZWQgYWNjZXNzb3JzLiBWYWxpZCBjb21iaW5hdGlvbnMKKwkgKiBpbmNsdWRlIGF0IG1vc3Qgb25lIHR5cGUgZm9yIGdldHRlcnMgYW5kIG9uZSBmb3Igc2V0dGVycy4KKwkgKiBBY2Nlc3NvcnMgbWF5IGJlIHN1cHByZXNzZWQgYnkgcGFzc2luZyB7QGxpbmsgQWNjZXNzb3JUeXBlI05PTkV9LgorCSAqLworCUFjY2Vzc29yVHlwZVtdIHZhbHVlID0gI1tBY2Nlc3NvclR5cGUuUFVCTElDX0dFVFRFUiwgQWNjZXNzb3JUeXBlLlBVQkxJQ19TRVRURVJdCisJLyoqCisJICogRGVzY3JpYmVzIHdoZW4ge0Bjb2RlIEBEZXByZWNhdGVkfSB3aWxsIGJlIGFkZGVkIHRvIGdlbmVyYXRlZCBhY2Nlc3NvcnMuPGJyPgorCSAqIElmIGl0IGlzIG5vdCB3YW50ZWQgb3IgbmVlZGVkLCBwYXNzIHtAbGluayBBY2Nlc3NvcnNEZXByZWNhdGlvblBvbGljeSNORVZFUn0gdG8gcHJldmVudCB0aGUgYW5ub3RhdGlvbiBmcm9tIGJlaW5nIGFkZGVkLgorCSAqIEBzaW5jZSAyLjIzCisJICovCisJQEJldGEKKwlBY2Nlc3NvcnNEZXByZWNhdGlvblBvbGljeSBkZXByZWNhdGlvblBvbGljeSA9IEFjY2Vzc29yc0RlcHJlY2F0aW9uUG9saWN5LlNBTUVfQVNfRklFTEQKK30KKworLyoqCisgKiBAc2luY2UgMi43CisgKiBAbm9yZWZlcmVuY2UKKyAqLworQEJldGEKK0BHd3RDb21wYXRpYmxlCitlbnVtIEFjY2Vzc29yVHlwZSB7CisJUFVCTElDX0dFVFRFUiwKKwlQUk9URUNURURfR0VUVEVSLAorCVBBQ0tBR0VfR0VUVEVSLAorCVBSSVZBVEVfR0VUVEVSLAorCVBVQkxJQ19TRVRURVIsCisJUFJPVEVDVEVEX1NFVFRFUiwKKwlQQUNLQUdFX1NFVFRFUiwKKwlQUklWQVRFX1NFVFRFUiwKKwlOT05FCit9CisKKy8qKgorICogQHNpbmNlIDIuMjMKKyAqLworQEJldGEKK0BHd3RDb21wYXRpYmxlCitlbnVtIEFjY2Vzc29yc0RlcHJlY2F0aW9uUG9saWN5IHsKKwlTQU1FX0FTX0ZJRUxELAorCU9OTFlfR0VUVEVSLAorCU9OTFlfU0VUVEVSLAorCUFMV0FZUywKKwlORVZFUgorfQorCisvKioKKyAqIEBzaW5jZSAyLjcKKyAqIEBub2V4dGVuZAorICogQG5vcmVmZXJlbmNlCisgKi8KK0BCZXRhCitjbGFzcyBBY2Nlc3NvcnNQcm9jZXNzb3IgaW1wbGVtZW50cyBUcmFuc2Zvcm1hdGlvblBhcnRpY2lwYW50PE11dGFibGVNZW1iZXJEZWNsYXJhdGlvbj4geworCisJb3ZlcnJpZGUgZG9UcmFuc2Zvcm0oTGlzdDw/IGV4dGVuZHMgTXV0YWJsZU1lbWJlckRlY2xhcmF0aW9uPiBlbGVtZW50cywgZXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWVsZW1lbnRzLmZvckVhY2hbdHJhbnNmb3JtKGNvbnRleHQpXQorCX0KKworCWRlZiBkaXNwYXRjaCB2b2lkIHRyYW5zZm9ybShNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBpdCwgZXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWV4dGVuc2lvbiB2YWwgdXRpbCA9IG5ldyBBY2Nlc3NvcnNQcm9jZXNzb3IuVXRpbChjb250ZXh0KQorCQl2YWwgYW5ub3QgPSBhY2Nlc3NvcnNBbm5vdGF0aW9uCisKKwkJaWYgKHNob3VsZEFkZEdldHRlcikgeworCQkJYWRkR2V0dGVyKGdldHRlclR5cGUudG9WaXNpYmlsaXR5KQorCQl9CisJCWVsc2UgaWYgKGFubm90ICE9PSBudWxsICYmIGFubm90LmRlcHJlY2F0aW9uUG9saWN5QXNFbnVtID09PSBBY2Nlc3NvcnNEZXByZWNhdGlvblBvbGljeS5PTkxZX0dFVFRFUil7CisJCQlpdC5hZGRXYXJuaW5nKAorCQkJCQknJycKKwkJCQkJRmllbGQgq3NpbXBsZU5hbWW7IG5lZWRzIG5vIGdldHRlciwgYnV0IGRlcHJlY2F0aW9uUG9saWN5IGlzIE9OTFlfR0VUVEVSLgorCQkJCQlFeHBsaWNpdGx5IHNldHRpbmcgaXQgaGFzIG5vIGVmZmVjdCwgYXMgbm8gZ2V0dGVyIHdpbGwgYmUgZ2VuZXJhdGVkLgorCQkJCQlVc2UgZGVwcmVjYXRpb24gcG9saWN5IE5FVkVSIHRvIGRpc2FibGUgYWNjZXNzb3JzIGRlcHJlY2F0aW9uIGFuZCByZW1vdmUgdGhpcyB3YXJuaW5nLgorCQkJCQknJycKKwkJCQkpCisJCX0KKworCQlpZiAoc2hvdWxkQWRkU2V0dGVyKSB7CisJCQlhZGRTZXR0ZXIoc2V0dGVyVHlwZS50b1Zpc2liaWxpdHkpCisJCX0KKwkJZWxzZSBpZihhbm5vdCAhPT0gbnVsbCAmJiBhbm5vdC5kZXByZWNhdGlvblBvbGljeUFzRW51bSA9PT0gQWNjZXNzb3JzRGVwcmVjYXRpb25Qb2xpY3kuT05MWV9TRVRURVIpeworCQkJaXQuYWRkV2FybmluZygKKwkJCQknJycKKwkJCQlGaWVsZCCrc2ltcGxlTmFtZbsgbmVlZHMgbm8gc2V0dGVyLCBidXQgZGVwcmVjYXRpb25Qb2xpY3kgaXMgT05MWV9TRVRURVIuCisJCQkJRXhwbGljaXRseSBzZXR0aW5nIGl0IGhhcyBubyBlZmZlY3QsIGFzIG5vIHNldHRlciB3aWxsIGJlIGdlbmVyYXRlZC4KKwkJCQlVc2UgZGVwcmVjYXRpb24gcG9saWN5IE5FVkVSIHRvIGRpc2FibGUgYWNjZXNzb3JzIGRlcHJlY2F0aW9uIGFuZCByZW1vdmUgdGhpcyB3YXJuaW5nLgorCQkJCScnJworCQkJKQorCQl9CisJfQorCisJZGVmIGRpc3BhdGNoIHZvaWQgdHJhbnNmb3JtKE11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGl0LCBleHRlbnNpb24gVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKwkJaWYgKGZpbmRBbm5vdGF0aW9uKERhdGEuZmluZFR5cGVHbG9iYWxseSkgIT09IG51bGwpIHsKKwkJCXJldHVybgorCQl9CisJCXZhbCBleHRlbnNpb24gcmVxdWlyZWRBcmdzVXRpbCA9IG5ldyBGaW5hbEZpZWxkc0NvbnN0cnVjdG9yUHJvY2Vzc29yLlV0aWwoY29udGV4dCkKKwkJaWYgKG5lZWRzRmluYWxGaWVsZENvbnN0cnVjdG9yIHx8IGZpbmRBbm5vdGF0aW9uKEZpbmFsRmllbGRzQ29uc3RydWN0b3IuZmluZFR5cGVHbG9iYWxseSkgIT09IG51bGwpIHsKKwkJCWFkZEZpbmFsRmllbGRzQ29uc3RydWN0b3IKKwkJfQorCQlkZWNsYXJlZEZpZWxkcy5maWx0ZXJbIXN0YXRpYyAmJiB0aGVQcmltYXJ5R2VuZXJhdGVkSmF2YUVsZW1lbnRdLmZvckVhY2hbX3RyYW5zZm9ybShjb250ZXh0KV0KKwl9CisKKwkvKioKKwkgKiBAc2luY2UgMi43CisJICogQG5vZXh0ZW5kCisJICogQG5vcmVmZXJlbmNlCisJICovCisJQEJldGEKKwlzdGF0aWMgY2xhc3MgVXRpbCB7CisJCWV4dGVuc2lvbiBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dAorCisJCW5ldyhUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworCQkJdGhpcy5jb250ZXh0ID0gY29udGV4dAorCQl9CisKKwkJZGVmIHRvVmlzaWJpbGl0eShBY2Nlc3NvclR5cGUgdHlwZSkgeworCQkJc3dpdGNoIHR5cGUgeworCQkJCWNhc2UgUFVCTElDX0dFVFRFUjogVmlzaWJpbGl0eS5QVUJMSUMKKwkJCQljYXNlIFBST1RFQ1RFRF9HRVRURVI6IFZpc2liaWxpdHkuUFJPVEVDVEVECisJCQkJY2FzZSBQQUNLQUdFX0dFVFRFUjogVmlzaWJpbGl0eS5ERUZBVUxUCisJCQkJY2FzZSBQUklWQVRFX0dFVFRFUjogVmlzaWJpbGl0eS5QUklWQVRFCisJCQkJY2FzZSBQVUJMSUNfU0VUVEVSOiBWaXNpYmlsaXR5LlBVQkxJQworCQkJCWNhc2UgUFJPVEVDVEVEX1NFVFRFUjogVmlzaWJpbGl0eS5QUk9URUNURUQKKwkJCQljYXNlIFBBQ0tBR0VfU0VUVEVSOiBWaXNpYmlsaXR5LkRFRkFVTFQKKwkJCQljYXNlIFBSSVZBVEVfU0VUVEVSOiBWaXNpYmlsaXR5LlBSSVZBVEUKKwkJCQlkZWZhdWx0OiB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCcnJ0Nhbm5vdCBjb252ZXJ0IKt0eXBluycnJykKKwkJCX0KKwkJfQorCisJCWRlZiBoYXNHZXR0ZXIoRmllbGREZWNsYXJhdGlvbiBpdCkgeworCQkJcG9zc2libGVHZXR0ZXJOYW1lcy5leGlzdHNbbmFtZXwgZGVjbGFyaW5nVHlwZS5maW5kRGVjbGFyZWRNZXRob2QobmFtZSkgIT09IG51bGxdCisJCX0KKworCQlkZWYgc2hvdWxkQWRkR2V0dGVyKEZpZWxkRGVjbGFyYXRpb24gaXQpIHsKKwkJCSFoYXNHZXR0ZXIgJiYgZ2V0dGVyVHlwZSAhPT0gQWNjZXNzb3JUeXBlLk5PTkUKKwkJfQorCisJCUBTdXBwcmVzc1dhcm5pbmdzKCd1bmNoZWNrZWQnKQorCQlkZWYgZ2V0R2V0dGVyVHlwZShGaWVsZERlY2xhcmF0aW9uIGl0KSB7CisJCQl2YWwgYW5ub3RhdGlvbiA9IGFjY2Vzc29yc0Fubm90YXRpb24gPzogZGVjbGFyaW5nVHlwZS5hY2Nlc3NvcnNBbm5vdGF0aW9uCisJCQlpZiAoYW5ub3RhdGlvbiAhPT0gbnVsbCkgeworCQkJCXZhbCB0eXBlcyA9IGFubm90YXRpb24uZ2V0RW51bUFycmF5VmFsdWUoInZhbHVlIikubWFwW0FjY2Vzc29yVHlwZS52YWx1ZU9mKHNpbXBsZU5hbWUpXQorCQkJCXJldHVybiB0eXBlcy5maW5kRmlyc3RbbmFtZS5lbmRzV2l0aCgiR0VUVEVSIildID86IEFjY2Vzc29yVHlwZS5OT05FCisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCWRlZiBnZXRBY2Nlc3NvcnNBbm5vdGF0aW9uKEFubm90YXRpb25UYXJnZXQgaXQpIHsKKwkJCWZpbmRBbm5vdGF0aW9uKEFjY2Vzc29ycy5maW5kVHlwZUdsb2JhbGx5KQorCQl9CisKKwkJZGVmIGdldERlcHJlY2F0ZWRBbm5vdGF0aW9uKEFubm90YXRpb25UYXJnZXQgaXQpIHsKKwkJCWZpbmRBbm5vdGF0aW9uKERlcHJlY2F0ZWQuZmluZFR5cGVHbG9iYWxseSkKKwkJfQorCisJCWRlZiBnZXREZXByZWNhdGlvblBvbGljeUFzRW51bShBbm5vdGF0aW9uUmVmZXJlbmNlIGFubm90KXsKKwkJCUFjY2Vzc29yc0RlcHJlY2F0aW9uUG9saWN5LnZhbHVlT2YoYW5ub3QuZ2V0RW51bVZhbHVlKCdkZXByZWNhdGlvblBvbGljeScpLnNpbXBsZU5hbWUpIAorCQl9CisKKwkJZGVmIHZhbGlkYXRlR2V0dGVyKE11dGFibGVGaWVsZERlY2xhcmF0aW9uIGZpZWxkKSB7CisJCX0KKworCQlkZWYgZ2V0R2V0dGVyTmFtZShGaWVsZERlY2xhcmF0aW9uIGl0KSB7CisJCQlwb3NzaWJsZUdldHRlck5hbWVzLmhlYWQKKwkJfQorCQkKKwkJZGVmIExpc3Q8U3RyaW5nPiBnZXRQb3NzaWJsZUdldHRlck5hbWVzKEZpZWxkRGVjbGFyYXRpb24gaXQpIHsKKwkJCXZhbCBuYW1lcyA9IG5ld0FycmF5TGlzdAorCQkJLy8gY29tbW9uIGNhc2U6IGEgYm9vbGVhbiBmaWVsZCBhbHJlYWR5IHN0YXJ0cyB3aXRoICdpcycuIEFsbG93IGZpZWxkIG5hbWUgYXMgZ2V0dGVyIG1ldGhvZCBuYW1lCisJCQlpZiAodHlwZS5vck9iamVjdC5pc0Jvb2xlYW5UeXBlICYmIHNpbXBsZU5hbWUuc3RhcnRzV2l0aCgnaXMnKSAmJiBzaW1wbGVOYW1lLmxlbmd0aD4yICYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzaW1wbGVOYW1lLmNoYXJBdCgyKSkpIHsKKwkJCQluYW1lcyArPSBzaW1wbGVOYW1lCisJCQl9CisJCQluYW1lcy5hZGRBbGwoKGlmKHR5cGUub3JPYmplY3QuaXNCb29sZWFuVHlwZSkgI1siaXMiLCAiZ2V0Il0gZWxzZSAjWyJnZXQiXSkubWFwW3ByZWZpeHxwcmVmaXggKyBzaW1wbGVOYW1lLnRvRmlyc3RVcHBlcl0pCisJCQlyZXR1cm4gbmFtZXMKKwkJfQorCisJCWRlZiBpc0Jvb2xlYW5UeXBlKFR5cGVSZWZlcmVuY2UgaXQpIHsKKwkJCSFpbmZlcnJlZCAmJiBpdCA9PSBwcmltaXRpdmVCb29sZWFuCisJCX0KKworCQlkZWYgdm9pZCBhZGRHZXR0ZXIoTXV0YWJsZUZpZWxkRGVjbGFyYXRpb24gZmllbGQsIFZpc2liaWxpdHkgdmlzaWJpbGl0eSkgeworCQkJZmllbGQudmFsaWRhdGVHZXR0ZXIKKwkJCWZpZWxkLm1hcmtBc1JlYWQKKwkJCWZpZWxkLmRlY2xhcmluZ1R5cGUuYWRkTWV0aG9kKGZpZWxkLmdldHRlck5hbWUpIFsKKwkJCQlwcmltYXJ5U291cmNlRWxlbWVudCA9IGZpZWxkLnByaW1hcnlTb3VyY2VFbGVtZW50CisJCQkJYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uUmVmZXJlbmNlKFB1cmUpKQorCQkJCQorCQkJCS8vIEdlbmVyYXRlIE92ZXJyaWRlIGlmIG5vdCBvdmVycmlkaW5nIGEgZmluYWwgbWV0aG9kCisJCQkJdmFsIHN1cGVyR2V0dGVycyA9IG92ZXJyaWRkZW5PckltcGxlbWVudGVkTWV0aG9kcworCQkJCWlmKCFzdXBlckdldHRlcnMuZW1wdHkpeworCQkJCQlpZihzdXBlckdldHRlcnMuZXhpc3RzW2ZpbmFsXSkgeworCQkJCQkJZmllbGQuYWRkRXJyb3IoJycnQWRkaW5nIGEgZ2V0dGVyIHRvIHRoZSBmaWVsZCCrZmllbGQuc2ltcGxlTmFtZbsgd291bGQgb3ZlcnJpZGUgYSBmaW5hbCBtZXRob2QuJycnKQorCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uUmVmZXJlbmNlKE92ZXJyaWRlKSkKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQl2YWwgYW5ub3QgPSBmaWVsZC5hY2Nlc3NvcnNBbm5vdGF0aW9uCisJCQkJaWYoYW5ub3QgIT09IG51bGwpIHsKKwkJCQkJLy8gRW5mb3JjZSBkZXByZWNhdGlvbiBwb2xpY3kgZm9yIGdldHRlcgorCQkJCQlzd2l0Y2ggYW5ub3QuZGVwcmVjYXRpb25Qb2xpY3lBc0VudW0geworCQkJCQljYXNlIEFMV0FZUywKKwkJCQkJY2FzZSBPTkxZX0dFVFRFUjoKKwkJCQkJCWFkZEFubm90YXRpb24obmV3QW5ub3RhdGlvblJlZmVyZW5jZShEZXByZWNhdGVkKSkKKwkJCQkJY2FzZSBTQU1FX0FTX0ZJRUxEOgorCQkJCQkJaWYoZmllbGQuZGVwcmVjYXRlZEFubm90YXRpb24gIT09IG51bGwpCisJCQkJCQkJYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uUmVmZXJlbmNlKERlcHJlY2F0ZWQpKQorCQkJCQljYXNlIE9OTFlfU0VUVEVSLAorCQkJCQljYXNlIE5FVkVSOiB7fSAvLyBOby1vcAorCQkJCQlkZWZhdWx0OiB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCcnJ0Nhbm5vdCBkZXRlcm1pbmUgZGVwcmVjYXRpb24gcG9saWN5IGZvciBmaWVsZCCrZmllbGQuc2ltcGxlTmFtZbsnJycpCisJCQkJCX0KKwkJCQl9IC8vIGlmKGFubm90ICE9PSBudWxsKQorCisJCQkJcmV0dXJuVHlwZSA9IGZpZWxkLnR5cGUub3JPYmplY3QKKwkJCQlib2R5ID0gJycncmV0dXJuIKtmaWVsZC5maWVsZE93bmVyuy6rZmllbGQuc2ltcGxlTmFtZbs7JycnCisJCQkJc3RhdGljID0gZmllbGQuc3RhdGljCisJCQkJaXQudmlzaWJpbGl0eSA9IHZpc2liaWxpdHkKKwkJCV0KKwkJfQorCisJCUBTdXBwcmVzc1dhcm5pbmdzKCd1bmNoZWNrZWQnKQorCQlkZWYgZ2V0U2V0dGVyVHlwZShGaWVsZERlY2xhcmF0aW9uIGl0KSB7CisJCQl2YWwgYW5ub3RhdGlvbiA9IGFjY2Vzc29yc0Fubm90YXRpb24gPzogZGVjbGFyaW5nVHlwZS5hY2Nlc3NvcnNBbm5vdGF0aW9uCisJCQlpZiAoYW5ub3RhdGlvbiAhPT0gbnVsbCkgeworCQkJCXZhbCB0eXBlcyA9IGFubm90YXRpb24uZ2V0RW51bUFycmF5VmFsdWUoInZhbHVlIikubWFwW0FjY2Vzc29yVHlwZS52YWx1ZU9mKHNpbXBsZU5hbWUpXQorCQkJCXJldHVybiB0eXBlcy5maW5kRmlyc3RbbmFtZS5lbmRzV2l0aCgiU0VUVEVSIildID86IEFjY2Vzc29yVHlwZS5OT05FCisJCQl9CisJCQlyZXR1cm4gbnVsbAorCQl9CisKKwkJcHJpdmF0ZSBkZWYgZmllbGRPd25lcihNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBpdCkgeworCQkJaWYoc3RhdGljKSBkZWNsYXJpbmdUeXBlLm5ld1R5cGVSZWZlcmVuY2UgZWxzZSAidGhpcyIKKwkJfQorCisJCWRlZiBoYXNTZXR0ZXIoRmllbGREZWNsYXJhdGlvbiBpdCkgeworCQkJZGVjbGFyaW5nVHlwZS5maW5kRGVjbGFyZWRNZXRob2Qoc2V0dGVyTmFtZSwgdHlwZS5vck9iamVjdCkgIT09IG51bGwKKwkJfQorCisJCWRlZiBnZXRTZXR0ZXJOYW1lKEZpZWxkRGVjbGFyYXRpb24gaXQpIHsKKwkJCSJzZXQiICsgc2ltcGxlTmFtZS50b0ZpcnN0VXBwZXIKKwkJfQorCisJCWRlZiBzaG91bGRBZGRTZXR0ZXIoRmllbGREZWNsYXJhdGlvbiBpdCkgeworCQkJIWZpbmFsICYmICFoYXNTZXR0ZXIgJiYgc2V0dGVyVHlwZSAhPT0gQWNjZXNzb3JUeXBlLk5PTkUKKwkJfQorCisJCWRlZiB2YWxpZGF0ZVNldHRlcihNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBmaWVsZCkgeworCQkJaWYgKGZpZWxkLmZpbmFsKSB7CisJCQkJZmllbGQuYWRkRXJyb3IoIkNhbm5vdCBzZXQgYSBmaW5hbCBmaWVsZCIpCisJCQl9CisJCQlpZiAoZmllbGQudHlwZSA9PT0gbnVsbCB8fCBmaWVsZC50eXBlLmluZmVycmVkKSB7CisJCQkJZmllbGQuYWRkRXJyb3IoIlR5cGUgY2Fubm90IGJlIGluZmVycmVkLiIpCisJCQkJcmV0dXJuCisJCQl9CisJCX0KKworCQlkZWYgdm9pZCBhZGRTZXR0ZXIoTXV0YWJsZUZpZWxkRGVjbGFyYXRpb24gZmllbGQsIFZpc2liaWxpdHkgdmlzaWJpbGl0eSkgeworCQkJZmllbGQudmFsaWRhdGVTZXR0ZXIKKwkJCWZpZWxkLmRlY2xhcmluZ1R5cGUuYWRkTWV0aG9kKGZpZWxkLnNldHRlck5hbWUpIFsKKwkJCQlwcmltYXJ5U291cmNlRWxlbWVudCA9IGZpZWxkLnByaW1hcnlTb3VyY2VFbGVtZW50CisJCQkJcmV0dXJuVHlwZSA9IHByaW1pdGl2ZVZvaWQKKwkJCQkKKwkJCQkvLyBHZW5lcmF0ZSBPdmVycmlkZSBpZiBub3Qgb3ZlcnJpZGluZyBhIGZpbmFsIG1ldGhvZAorCQkJCXZhbCBzdXBlclNldHRlcnMgPSBvdmVycmlkZGVuT3JJbXBsZW1lbnRlZE1ldGhvZHMKKwkJCQlpZighc3VwZXJTZXR0ZXJzLmVtcHR5KXsKKwkJCQkJaWYoc3VwZXJTZXR0ZXJzLmV4aXN0c1tmaW5hbF0pIHsKKwkJCQkJCWZpZWxkLmFkZEVycm9yKCcnJ0FkZGluZyBhIHNldHRlciB0byB0aGUgZmllbGQgq2ZpZWxkLnNpbXBsZU5hbWW7IHdvdWxkIG92ZXJyaWRlIGEgZmluYWwgbWV0aG9kLicnJykKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCWFkZEFubm90YXRpb24obmV3QW5ub3RhdGlvblJlZmVyZW5jZShPdmVycmlkZSkpCisJCQkJCX0KKwkJCQl9CisKKwkJCQl2YWwgYW5ub3QgPSBmaWVsZC5hY2Nlc3NvcnNBbm5vdGF0aW9uCisJCQkJaWYoYW5ub3QgIT09IG51bGwpIHsKKwkJCQkJLy8gRW5mb3JjZSBkZXByZWNhdGlvbiBwb2xpY3kgZm9yIHNldHRlcgorCQkJCQlzd2l0Y2ggYW5ub3QuZGVwcmVjYXRpb25Qb2xpY3lBc0VudW0geworCQkJCQljYXNlIEFMV0FZUywKKwkJCQkJY2FzZSBPTkxZX1NFVFRFUjoKKwkJCQkJCWFkZEFubm90YXRpb24obmV3QW5ub3RhdGlvblJlZmVyZW5jZShEZXByZWNhdGVkKSkKKwkJCQkJY2FzZSBTQU1FX0FTX0ZJRUxEOgorCQkJCQkJaWYoZmllbGQuZGVwcmVjYXRlZEFubm90YXRpb24gIT09IG51bGwpCisJCQkJCQkJYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uUmVmZXJlbmNlKERlcHJlY2F0ZWQpKQorCQkJCQljYXNlIE9OTFlfR0VUVEVSLAorCQkJCQljYXNlIE5FVkVSOiB7fSAvLyBOby1vcAorCQkJCQlkZWZhdWx0OiB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCcnJ0Nhbm5vdCBkZXRlcm1pbmUgZGVwcmVjYXRpb24gcG9saWN5IGZvciBmaWVsZCCrZmllbGQuc2ltcGxlTmFtZbsnJycpCisJCQkJCX0KKwkJCQl9IC8vIGlmKGFubm90ICE9PSBudWxsKQorCisJCQkJdmFsIHBhcmFtID0gYWRkUGFyYW1ldGVyKGZpZWxkLnNpbXBsZU5hbWUsIGZpZWxkLnR5cGUub3JPYmplY3QpCisJCQkJYm9keSA9ICcnJ6tmaWVsZC5maWVsZE93bmVyuy6rZmllbGQuc2ltcGxlTmFtZbsgPSCrcGFyYW0uc2ltcGxlTmFtZbs7JycnCisJCQkJc3RhdGljID0gZmllbGQuc3RhdGljCisJCQkJaXQudmlzaWJpbGl0eSA9IHZpc2liaWxpdHkKKwkJCV0KKwkJfQorCQkKKwkJcHJpdmF0ZSBkZWYgb3JPYmplY3QoVHlwZVJlZmVyZW5jZSByZWYpIHsKKwkJCWlmIChyZWYgPT09IG51bGwpIG9iamVjdCBlbHNlIHJlZgorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9BY2Nlc3NvcnNEZXByZWNhdGlvblBvbGljeS5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvQWNjZXNzb3JzRGVwcmVjYXRpb25Qb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjUzN2RkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvQWNjZXNzb3JzRGVwcmVjYXRpb25Qb2xpY3kuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKiAKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlOworCisvKioKKyAqIEBzaW5jZSAyLjIzCisgKi8KK0BCZXRhCitAR3d0Q29tcGF0aWJsZQorQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgZW51bSBBY2Nlc3NvcnNEZXByZWNhdGlvblBvbGljeSB7CisgIFNBTUVfQVNfRklFTEQsCisgIAorICBPTkxZX0dFVFRFUiwKKyAgCisgIE9OTFlfU0VUVEVSLAorICAKKyAgQUxXQVlTLAorICAKKyAgTkVWRVI7Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9BY2Nlc3NvcnNQcm9jZXNzb3IuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0FjY2Vzc29yc1Byb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmEzZTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9BY2Nlc3NvcnNQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDUxNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICogCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9uczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9ucy5GaW5hbEZpZWxkc0NvbnN0cnVjdG9yUHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5UcmFuc2Zvcm1hdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLlRyYW5zZm9ybWF0aW9uUGFydGljaXBhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkFubm90YXRpb25SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkFubm90YXRpb25UYXJnZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkVudW1lcmF0aW9uVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTXV0YWJsZU1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVmlzaWJpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQyLmxpYi5TdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Db2xsZWN0aW9uTGl0ZXJhbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkNvbnZlcnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5FeHRlbnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjE7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkl0ZXJhYmxlRXh0ZW5zaW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuTGlzdEV4dGVuc2lvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXMuUHJvY2VkdXJlMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuU3RyaW5nRXh0ZW5zaW9uczsKKworLyoqCisgKiBAc2luY2UgMi43CisgKiBAbm9leHRlbmQKKyAqIEBub3JlZmVyZW5jZQorICovCitAQmV0YQorQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQWNjZXNzb3JzUHJvY2Vzc29yIGltcGxlbWVudHMgVHJhbnNmb3JtYXRpb25QYXJ0aWNpcGFudDxNdXRhYmxlTWVtYmVyRGVjbGFyYXRpb24+IHsKKyAgLyoqCisgICAqIEBzaW5jZSAyLjcKKyAgICogQG5vZXh0ZW5kCisgICAqIEBub3JlZmVyZW5jZQorICAgKi8KKyAgQEJldGEKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBVdGlsIHsKKyAgICBARXh0ZW5zaW9uCisgICAgcHJpdmF0ZSBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dDsKKyAgICAKKyAgICBwdWJsaWMgVXRpbChmaW5hbCBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICB9CisgICAgCisgICAgcHVibGljIFZpc2liaWxpdHkgdG9WaXNpYmlsaXR5KGZpbmFsIEFjY2Vzc29yVHlwZSB0eXBlKSB7CisgICAgICBWaXNpYmlsaXR5IF9zd2l0Y2hSZXN1bHQgPSBudWxsOworICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICBjYXNlIFBVQkxJQ19HRVRURVI6CisgICAgICAgICAgICBfc3dpdGNoUmVzdWx0ID0gVmlzaWJpbGl0eS5QVUJMSUM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFBST1RFQ1RFRF9HRVRURVI6CisgICAgICAgICAgICBfc3dpdGNoUmVzdWx0ID0gVmlzaWJpbGl0eS5QUk9URUNURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFBBQ0tBR0VfR0VUVEVSOgorICAgICAgICAgICAgX3N3aXRjaFJlc3VsdCA9IFZpc2liaWxpdHkuREVGQVVMVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgUFJJVkFURV9HRVRURVI6CisgICAgICAgICAgICBfc3dpdGNoUmVzdWx0ID0gVmlzaWJpbGl0eS5QUklWQVRFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBQVUJMSUNfU0VUVEVSOgorICAgICAgICAgICAgX3N3aXRjaFJlc3VsdCA9IFZpc2liaWxpdHkuUFVCTElDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBQUk9URUNURURfU0VUVEVSOgorICAgICAgICAgICAgX3N3aXRjaFJlc3VsdCA9IFZpc2liaWxpdHkuUFJPVEVDVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBQQUNLQUdFX1NFVFRFUjoKKyAgICAgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSBWaXNpYmlsaXR5LkRFRkFVTFQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFBSSVZBVEVfU0VUVEVSOgorICAgICAgICAgICAgX3N3aXRjaFJlc3VsdCA9IFZpc2liaWxpdHkuUFJJVkFURTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiQ2Fubm90IGNvbnZlcnQgIik7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQodHlwZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKF9idWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJDYW5ub3QgY29udmVydCAiKTsKKyAgICAgICAgX2J1aWxkZXIuYXBwZW5kKHR5cGUpOworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKF9idWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgfQorICAgICAgcmV0dXJuIF9zd2l0Y2hSZXN1bHQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGhhc0dldHRlcihmaW5hbCBGaWVsZERlY2xhcmF0aW9uIGl0KSB7CisgICAgICBmaW5hbCBGdW5jdGlvbjE8U3RyaW5nLCBCb29sZWFuPiBfZnVuY3Rpb24gPSAoU3RyaW5nIG5hbWUpIC0+IHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gX2ZpbmREZWNsYXJlZE1ldGhvZCA9IGl0LmdldERlY2xhcmluZ1R5cGUoKS5maW5kRGVjbGFyZWRNZXRob2QobmFtZSk7CisgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKF9maW5kRGVjbGFyZWRNZXRob2QgIT0gbnVsbCkpOworICAgICAgfTsKKyAgICAgIHJldHVybiBJdGVyYWJsZUV4dGVuc2lvbnMuPFN0cmluZz5leGlzdHModGhpcy5nZXRQb3NzaWJsZUdldHRlck5hbWVzKGl0KSwgX2Z1bmN0aW9uKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkQWRkR2V0dGVyKGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gaXQpIHsKKyAgICAgIHJldHVybiAoKCF0aGlzLmhhc0dldHRlcihpdCkpICYmICh0aGlzLmdldEdldHRlclR5cGUoaXQpICE9IEFjY2Vzc29yVHlwZS5OT05FKSk7CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBBY2Nlc3NvclR5cGUgZ2V0R2V0dGVyVHlwZShmaW5hbCBGaWVsZERlY2xhcmF0aW9uIGl0KSB7CisgICAgICBBbm5vdGF0aW9uUmVmZXJlbmNlIF9lbHZpcyA9IG51bGw7CisgICAgICBBbm5vdGF0aW9uUmVmZXJlbmNlIF9hY2Nlc3NvcnNBbm5vdGF0aW9uID0gdGhpcy5nZXRBY2Nlc3NvcnNBbm5vdGF0aW9uKGl0KTsKKyAgICAgIGlmIChfYWNjZXNzb3JzQW5ub3RhdGlvbiAhPSBudWxsKSB7CisgICAgICAgIF9lbHZpcyA9IF9hY2Nlc3NvcnNBbm5vdGF0aW9uOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQW5ub3RhdGlvblJlZmVyZW5jZSBfYWNjZXNzb3JzQW5ub3RhdGlvbl8xID0gdGhpcy5nZXRBY2Nlc3NvcnNBbm5vdGF0aW9uKGl0LmdldERlY2xhcmluZ1R5cGUoKSk7CisgICAgICAgIF9lbHZpcyA9IF9hY2Nlc3NvcnNBbm5vdGF0aW9uXzE7CisgICAgICB9CisgICAgICBmaW5hbCBBbm5vdGF0aW9uUmVmZXJlbmNlIGFubm90YXRpb24gPSBfZWx2aXM7CisgICAgICBpZiAoKGFubm90YXRpb24gIT0gbnVsbCkpIHsKKyAgICAgICAgZmluYWwgRnVuY3Rpb24xPEVudW1lcmF0aW9uVmFsdWVEZWNsYXJhdGlvbiwgQWNjZXNzb3JUeXBlPiBfZnVuY3Rpb24gPSAoRW51bWVyYXRpb25WYWx1ZURlY2xhcmF0aW9uIGl0XzEpIC0+IHsKKyAgICAgICAgICByZXR1cm4gQWNjZXNzb3JUeXBlLnZhbHVlT2YoaXRfMS5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICB9OworICAgICAgICBmaW5hbCBMaXN0PEFjY2Vzc29yVHlwZT4gdHlwZXMgPSBMaXN0RXh0ZW5zaW9ucy48RW51bWVyYXRpb25WYWx1ZURlY2xhcmF0aW9uLCBBY2Nlc3NvclR5cGU+bWFwKCgoTGlzdDxFbnVtZXJhdGlvblZhbHVlRGVjbGFyYXRpb24+KUNvbnZlcnNpb25zLmRvV3JhcEFycmF5KGFubm90YXRpb24uZ2V0RW51bUFycmF5VmFsdWUoInZhbHVlIikpKSwgX2Z1bmN0aW9uKTsKKyAgICAgICAgQWNjZXNzb3JUeXBlIF9lbHZpc18xID0gbnVsbDsKKyAgICAgICAgZmluYWwgRnVuY3Rpb24xPEFjY2Vzc29yVHlwZSwgQm9vbGVhbj4gX2Z1bmN0aW9uXzEgPSAoQWNjZXNzb3JUeXBlIGl0XzEpIC0+IHsKKyAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGl0XzEubmFtZSgpLmVuZHNXaXRoKCJHRVRURVIiKSk7CisgICAgICAgIH07CisgICAgICAgIEFjY2Vzc29yVHlwZSBfZmluZEZpcnN0ID0gSXRlcmFibGVFeHRlbnNpb25zLjxBY2Nlc3NvclR5cGU+ZmluZEZpcnN0KHR5cGVzLCBfZnVuY3Rpb25fMSk7CisgICAgICAgIGlmIChfZmluZEZpcnN0ICE9IG51bGwpIHsKKyAgICAgICAgICBfZWx2aXNfMSA9IF9maW5kRmlyc3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgX2VsdmlzXzEgPSBBY2Nlc3NvclR5cGUuTk9ORTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2VsdmlzXzE7CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFubm90YXRpb25SZWZlcmVuY2UgZ2V0QWNjZXNzb3JzQW5ub3RhdGlvbihmaW5hbCBBbm5vdGF0aW9uVGFyZ2V0IGl0KSB7CisgICAgICByZXR1cm4gaXQuZmluZEFubm90YXRpb24odGhpcy5jb250ZXh0LmZpbmRUeXBlR2xvYmFsbHkoQWNjZXNzb3JzLmNsYXNzKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBbm5vdGF0aW9uUmVmZXJlbmNlIGdldERlcHJlY2F0ZWRBbm5vdGF0aW9uKGZpbmFsIEFubm90YXRpb25UYXJnZXQgaXQpIHsKKyAgICAgIHJldHVybiBpdC5maW5kQW5ub3RhdGlvbih0aGlzLmNvbnRleHQuZmluZFR5cGVHbG9iYWxseShEZXByZWNhdGVkLmNsYXNzKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBY2Nlc3NvcnNEZXByZWNhdGlvblBvbGljeSBnZXREZXByZWNhdGlvblBvbGljeUFzRW51bShmaW5hbCBBbm5vdGF0aW9uUmVmZXJlbmNlIGFubm90KSB7CisgICAgICByZXR1cm4gQWNjZXNzb3JzRGVwcmVjYXRpb25Qb2xpY3kudmFsdWVPZihhbm5vdC5nZXRFbnVtVmFsdWUoImRlcHJlY2F0aW9uUG9saWN5IikuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIE9iamVjdCB2YWxpZGF0ZUdldHRlcihmaW5hbCBNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBmaWVsZCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0R2V0dGVyTmFtZShmaW5hbCBGaWVsZERlY2xhcmF0aW9uIGl0KSB7CisgICAgICByZXR1cm4gSXRlcmFibGVFeHRlbnNpb25zLjxTdHJpbmc+aGVhZCh0aGlzLmdldFBvc3NpYmxlR2V0dGVyTmFtZXMoaXQpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQb3NzaWJsZUdldHRlck5hbWVzKGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gaXQpIHsKKyAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzID0gQ29sbGVjdGlvbkxpdGVyYWxzLjxTdHJpbmc+bmV3QXJyYXlMaXN0KCk7CisgICAgICBpZiAoKCgodGhpcy5pc0Jvb2xlYW5UeXBlKHRoaXMub3JPYmplY3QoaXQuZ2V0VHlwZSgpKSkgJiYgaXQuZ2V0U2ltcGxlTmFtZSgpLnN0YXJ0c1dpdGgoImlzIikpICYmIChpdC5nZXRTaW1wbGVOYW1lKCkubGVuZ3RoKCkgPiAyKSkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGl0LmdldFNpbXBsZU5hbWUoKS5jaGFyQXQoMikpKSkgeworICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWUgPSBpdC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIG5hbWVzLmFkZChfc2ltcGxlTmFtZSk7CisgICAgICB9CisgICAgICBMaXN0PFN0cmluZz4gX3hpZmV4cHJlc3Npb24gPSBudWxsOworICAgICAgYm9vbGVhbiBfaXNCb29sZWFuVHlwZSA9IHRoaXMuaXNCb29sZWFuVHlwZSh0aGlzLm9yT2JqZWN0KGl0LmdldFR5cGUoKSkpOworICAgICAgaWYgKF9pc0Jvb2xlYW5UeXBlKSB7CisgICAgICAgIF94aWZleHByZXNzaW9uID0gQ29sbGVjdGlvbnMuPFN0cmluZz51bm1vZGlmaWFibGVMaXN0KENvbGxlY3Rpb25MaXRlcmFscy48U3RyaW5nPm5ld0FycmF5TGlzdCgiaXMiLCAiZ2V0IikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3hpZmV4cHJlc3Npb24gPSBDb2xsZWN0aW9ucy48U3RyaW5nPnVubW9kaWZpYWJsZUxpc3QoQ29sbGVjdGlvbkxpdGVyYWxzLjxTdHJpbmc+bmV3QXJyYXlMaXN0KCJnZXQiKSk7CisgICAgICB9CisgICAgICBmaW5hbCBGdW5jdGlvbjE8U3RyaW5nLCBTdHJpbmc+IF9mdW5jdGlvbiA9IChTdHJpbmcgcHJlZml4KSAtPiB7CisgICAgICAgIFN0cmluZyBfZmlyc3RVcHBlciA9IFN0cmluZ0V4dGVuc2lvbnMudG9GaXJzdFVwcGVyKGl0LmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgIHJldHVybiAocHJlZml4ICsgX2ZpcnN0VXBwZXIpOworICAgICAgfTsKKyAgICAgIG5hbWVzLmFkZEFsbChMaXN0RXh0ZW5zaW9ucy48U3RyaW5nLCBTdHJpbmc+bWFwKF94aWZleHByZXNzaW9uLCBfZnVuY3Rpb24pKTsKKyAgICAgIHJldHVybiBuYW1lczsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNCb29sZWFuVHlwZShmaW5hbCBUeXBlUmVmZXJlbmNlIGl0KSB7CisgICAgICByZXR1cm4gKCghaXQuaXNJbmZlcnJlZCgpKSAmJiBPYmplY3RzLmVxdWFsKGl0LCB0aGlzLmNvbnRleHQuZ2V0UHJpbWl0aXZlQm9vbGVhbigpKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZEdldHRlcihmaW5hbCBNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBmaWVsZCwgZmluYWwgVmlzaWJpbGl0eSB2aXNpYmlsaXR5KSB7CisgICAgICB0aGlzLnZhbGlkYXRlR2V0dGVyKGZpZWxkKTsKKyAgICAgIGZpZWxkLm1hcmtBc1JlYWQoKTsKKyAgICAgIGZpbmFsIFByb2NlZHVyZTE8TXV0YWJsZU1ldGhvZERlY2xhcmF0aW9uPiBfZnVuY3Rpb24gPSAoTXV0YWJsZU1ldGhvZERlY2xhcmF0aW9uIGl0KSAtPiB7CisgICAgICAgIHRoaXMuY29udGV4dC5zZXRQcmltYXJ5U291cmNlRWxlbWVudChpdCwgdGhpcy5jb250ZXh0LmdldFByaW1hcnlTb3VyY2VFbGVtZW50KGZpZWxkKSk7CisgICAgICAgIGl0LmFkZEFubm90YXRpb24odGhpcy5jb250ZXh0Lm5ld0Fubm90YXRpb25SZWZlcmVuY2UoUHVyZS5jbGFzcykpOworICAgICAgICBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IHN1cGVyR2V0dGVycyA9IGl0LmdldE92ZXJyaWRkZW5PckltcGxlbWVudGVkTWV0aG9kcygpOworICAgICAgICBib29sZWFuIF9pc0VtcHR5ID0gSXRlcmFibGVFeHRlbnNpb25zLmlzRW1wdHkoc3VwZXJHZXR0ZXJzKTsKKyAgICAgICAgYm9vbGVhbiBfbm90ID0gKCFfaXNFbXB0eSk7CisgICAgICAgIGlmIChfbm90KSB7CisgICAgICAgICAgZmluYWwgRnVuY3Rpb24xPE1ldGhvZERlY2xhcmF0aW9uLCBCb29sZWFuPiBfZnVuY3Rpb25fMSA9IChNZXRob2REZWNsYXJhdGlvbiBpdF8xKSAtPiB7CisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGl0XzEuaXNGaW5hbCgpKTsKKyAgICAgICAgICB9OworICAgICAgICAgIGJvb2xlYW4gX2V4aXN0cyA9IEl0ZXJhYmxlRXh0ZW5zaW9ucy5leGlzdHMoc3VwZXJHZXR0ZXJzLCBfZnVuY3Rpb25fMSk7CisgICAgICAgICAgaWYgKF9leGlzdHMpIHsKKyAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJBZGRpbmcgYSBnZXR0ZXIgdG8gdGhlIGZpZWxkICIpOworICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lID0gZmllbGQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiIHdvdWxkIG92ZXJyaWRlIGEgZmluYWwgbWV0aG9kLiIpOworICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFkZEVycm9yKGZpZWxkLCBfYnVpbGRlci50b1N0cmluZygpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQuYWRkQW5ub3RhdGlvbih0aGlzLmNvbnRleHQubmV3QW5ub3RhdGlvblJlZmVyZW5jZShPdmVycmlkZS5jbGFzcykpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbCBBbm5vdGF0aW9uUmVmZXJlbmNlIGFubm90ID0gdGhpcy5nZXRBY2Nlc3NvcnNBbm5vdGF0aW9uKGZpZWxkKTsKKyAgICAgICAgaWYgKChhbm5vdCAhPSBudWxsKSkgeworICAgICAgICAgIEFjY2Vzc29yc0RlcHJlY2F0aW9uUG9saWN5IF9kZXByZWNhdGlvblBvbGljeUFzRW51bSA9IHRoaXMuZ2V0RGVwcmVjYXRpb25Qb2xpY3lBc0VudW0oYW5ub3QpOworICAgICAgICAgIGlmIChfZGVwcmVjYXRpb25Qb2xpY3lBc0VudW0gIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChfZGVwcmVjYXRpb25Qb2xpY3lBc0VudW0pIHsKKyAgICAgICAgICAgICAgY2FzZSBBTFdBWVM6CisgICAgICAgICAgICAgIGNhc2UgT05MWV9HRVRURVI6CisgICAgICAgICAgICAgICAgaXQuYWRkQW5ub3RhdGlvbih0aGlzLmNvbnRleHQubmV3QW5ub3RhdGlvblJlZmVyZW5jZShEZXByZWNhdGVkLmNsYXNzKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgU0FNRV9BU19GSUVMRDoKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uUmVmZXJlbmNlIF9kZXByZWNhdGVkQW5ub3RhdGlvbiA9IHRoaXMuZ2V0RGVwcmVjYXRlZEFubm90YXRpb24oZmllbGQpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gX3RyaXBsZU5vdEVxdWFscyA9IChfZGVwcmVjYXRlZEFubm90YXRpb24gIT0gbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKF90cmlwbGVOb3RFcXVhbHMpIHsKKyAgICAgICAgICAgICAgICAgIGl0LmFkZEFubm90YXRpb24odGhpcy5jb250ZXh0Lm5ld0Fubm90YXRpb25SZWZlcmVuY2UoRGVwcmVjYXRlZC5jbGFzcykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBPTkxZX1NFVFRFUjoKKyAgICAgICAgICAgICAgY2FzZSBORVZFUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzEgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJDYW5ub3QgZGV0ZXJtaW5lIGRlcHJlY2F0aW9uIHBvbGljeSBmb3IgZmllbGQgIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lXzEgPSBmaWVsZC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoX3NpbXBsZU5hbWVfMSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihfYnVpbGRlcl8xLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzEgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoIkNhbm5vdCBkZXRlcm1pbmUgZGVwcmVjYXRpb24gcG9saWN5IGZvciBmaWVsZCAiKTsKKyAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZV8xID0gZmllbGQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoX3NpbXBsZU5hbWVfMSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKF9idWlsZGVyXzEudG9TdHJpbmcoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGl0LnNldFJldHVyblR5cGUodGhpcy5vck9iamVjdChmaWVsZC5nZXRUeXBlKCkpKTsKKyAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBfY2xpZW50ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQoKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kVG8oU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC5UYXJnZXRTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyKSB7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoInJldHVybiAiKTsKKyAgICAgICAgICAgIE9iamVjdCBfZmllbGRPd25lciA9IFV0aWwudGhpcy5maWVsZE93bmVyKGZpZWxkKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfZmllbGRPd25lcik7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZSA9IGZpZWxkLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfc2ltcGxlTmFtZSk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIjsiKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGl0LnNldEJvZHkoX2NsaWVudCk7CisgICAgICAgIGl0LnNldFN0YXRpYyhmaWVsZC5pc1N0YXRpYygpKTsKKyAgICAgICAgaXQuc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKKyAgICAgIH07CisgICAgICBmaWVsZC5nZXREZWNsYXJpbmdUeXBlKCkuYWRkTWV0aG9kKHRoaXMuZ2V0R2V0dGVyTmFtZShmaWVsZCksIF9mdW5jdGlvbik7CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBBY2Nlc3NvclR5cGUgZ2V0U2V0dGVyVHlwZShmaW5hbCBGaWVsZERlY2xhcmF0aW9uIGl0KSB7CisgICAgICBBbm5vdGF0aW9uUmVmZXJlbmNlIF9lbHZpcyA9IG51bGw7CisgICAgICBBbm5vdGF0aW9uUmVmZXJlbmNlIF9hY2Nlc3NvcnNBbm5vdGF0aW9uID0gdGhpcy5nZXRBY2Nlc3NvcnNBbm5vdGF0aW9uKGl0KTsKKyAgICAgIGlmIChfYWNjZXNzb3JzQW5ub3RhdGlvbiAhPSBudWxsKSB7CisgICAgICAgIF9lbHZpcyA9IF9hY2Nlc3NvcnNBbm5vdGF0aW9uOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQW5ub3RhdGlvblJlZmVyZW5jZSBfYWNjZXNzb3JzQW5ub3RhdGlvbl8xID0gdGhpcy5nZXRBY2Nlc3NvcnNBbm5vdGF0aW9uKGl0LmdldERlY2xhcmluZ1R5cGUoKSk7CisgICAgICAgIF9lbHZpcyA9IF9hY2Nlc3NvcnNBbm5vdGF0aW9uXzE7CisgICAgICB9CisgICAgICBmaW5hbCBBbm5vdGF0aW9uUmVmZXJlbmNlIGFubm90YXRpb24gPSBfZWx2aXM7CisgICAgICBpZiAoKGFubm90YXRpb24gIT0gbnVsbCkpIHsKKyAgICAgICAgZmluYWwgRnVuY3Rpb24xPEVudW1lcmF0aW9uVmFsdWVEZWNsYXJhdGlvbiwgQWNjZXNzb3JUeXBlPiBfZnVuY3Rpb24gPSAoRW51bWVyYXRpb25WYWx1ZURlY2xhcmF0aW9uIGl0XzEpIC0+IHsKKyAgICAgICAgICByZXR1cm4gQWNjZXNzb3JUeXBlLnZhbHVlT2YoaXRfMS5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICB9OworICAgICAgICBmaW5hbCBMaXN0PEFjY2Vzc29yVHlwZT4gdHlwZXMgPSBMaXN0RXh0ZW5zaW9ucy48RW51bWVyYXRpb25WYWx1ZURlY2xhcmF0aW9uLCBBY2Nlc3NvclR5cGU+bWFwKCgoTGlzdDxFbnVtZXJhdGlvblZhbHVlRGVjbGFyYXRpb24+KUNvbnZlcnNpb25zLmRvV3JhcEFycmF5KGFubm90YXRpb24uZ2V0RW51bUFycmF5VmFsdWUoInZhbHVlIikpKSwgX2Z1bmN0aW9uKTsKKyAgICAgICAgQWNjZXNzb3JUeXBlIF9lbHZpc18xID0gbnVsbDsKKyAgICAgICAgZmluYWwgRnVuY3Rpb24xPEFjY2Vzc29yVHlwZSwgQm9vbGVhbj4gX2Z1bmN0aW9uXzEgPSAoQWNjZXNzb3JUeXBlIGl0XzEpIC0+IHsKKyAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGl0XzEubmFtZSgpLmVuZHNXaXRoKCJTRVRURVIiKSk7CisgICAgICAgIH07CisgICAgICAgIEFjY2Vzc29yVHlwZSBfZmluZEZpcnN0ID0gSXRlcmFibGVFeHRlbnNpb25zLjxBY2Nlc3NvclR5cGU+ZmluZEZpcnN0KHR5cGVzLCBfZnVuY3Rpb25fMSk7CisgICAgICAgIGlmIChfZmluZEZpcnN0ICE9IG51bGwpIHsKKyAgICAgICAgICBfZWx2aXNfMSA9IF9maW5kRmlyc3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgX2VsdmlzXzEgPSBBY2Nlc3NvclR5cGUuTk9ORTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2VsdmlzXzE7CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBPYmplY3QgZmllbGRPd25lcihmaW5hbCBNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBpdCkgeworICAgICAgT2JqZWN0IF94aWZleHByZXNzaW9uID0gbnVsbDsKKyAgICAgIGJvb2xlYW4gX2lzU3RhdGljID0gaXQuaXNTdGF0aWMoKTsKKyAgICAgIGlmIChfaXNTdGF0aWMpIHsKKyAgICAgICAgX3hpZmV4cHJlc3Npb24gPSB0aGlzLmNvbnRleHQubmV3VHlwZVJlZmVyZW5jZShpdC5nZXREZWNsYXJpbmdUeXBlKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3hpZmV4cHJlc3Npb24gPSAidGhpcyI7CisgICAgICB9CisgICAgICByZXR1cm4gX3hpZmV4cHJlc3Npb247CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGhhc1NldHRlcihmaW5hbCBGaWVsZERlY2xhcmF0aW9uIGl0KSB7CisgICAgICBNZXRob2REZWNsYXJhdGlvbiBfZmluZERlY2xhcmVkTWV0aG9kID0gaXQuZ2V0RGVjbGFyaW5nVHlwZSgpLmZpbmREZWNsYXJlZE1ldGhvZCh0aGlzLmdldFNldHRlck5hbWUoaXQpLCB0aGlzLm9yT2JqZWN0KGl0LmdldFR5cGUoKSkpOworICAgICAgcmV0dXJuIChfZmluZERlY2xhcmVkTWV0aG9kICE9IG51bGwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNldHRlck5hbWUoZmluYWwgRmllbGREZWNsYXJhdGlvbiBpdCkgeworICAgICAgU3RyaW5nIF9maXJzdFVwcGVyID0gU3RyaW5nRXh0ZW5zaW9ucy50b0ZpcnN0VXBwZXIoaXQuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgIHJldHVybiAoInNldCIgKyBfZmlyc3RVcHBlcik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIHNob3VsZEFkZFNldHRlcihmaW5hbCBGaWVsZERlY2xhcmF0aW9uIGl0KSB7CisgICAgICByZXR1cm4gKCgoIWl0LmlzRmluYWwoKSkgJiYgKCF0aGlzLmhhc1NldHRlcihpdCkpKSAmJiAodGhpcy5nZXRTZXR0ZXJUeXBlKGl0KSAhPSBBY2Nlc3NvclR5cGUuTk9ORSkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVNldHRlcihmaW5hbCBNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBmaWVsZCkgeworICAgICAgYm9vbGVhbiBfaXNGaW5hbCA9IGZpZWxkLmlzRmluYWwoKTsKKyAgICAgIGlmIChfaXNGaW5hbCkgeworICAgICAgICB0aGlzLmNvbnRleHQuYWRkRXJyb3IoZmllbGQsICJDYW5ub3Qgc2V0IGEgZmluYWwgZmllbGQiKTsKKyAgICAgIH0KKyAgICAgIGlmICgoKGZpZWxkLmdldFR5cGUoKSA9PSBudWxsKSB8fCBmaWVsZC5nZXRUeXBlKCkuaXNJbmZlcnJlZCgpKSkgeworICAgICAgICB0aGlzLmNvbnRleHQuYWRkRXJyb3IoZmllbGQsICJUeXBlIGNhbm5vdCBiZSBpbmZlcnJlZC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRTZXR0ZXIoZmluYWwgTXV0YWJsZUZpZWxkRGVjbGFyYXRpb24gZmllbGQsIGZpbmFsIFZpc2liaWxpdHkgdmlzaWJpbGl0eSkgeworICAgICAgdGhpcy52YWxpZGF0ZVNldHRlcihmaWVsZCk7CisgICAgICBmaW5hbCBQcm9jZWR1cmUxPE11dGFibGVNZXRob2REZWNsYXJhdGlvbj4gX2Z1bmN0aW9uID0gKE11dGFibGVNZXRob2REZWNsYXJhdGlvbiBpdCkgLT4geworICAgICAgICB0aGlzLmNvbnRleHQuc2V0UHJpbWFyeVNvdXJjZUVsZW1lbnQoaXQsIHRoaXMuY29udGV4dC5nZXRQcmltYXJ5U291cmNlRWxlbWVudChmaWVsZCkpOworICAgICAgICBpdC5zZXRSZXR1cm5UeXBlKHRoaXMuY29udGV4dC5nZXRQcmltaXRpdmVWb2lkKCkpOworICAgICAgICBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IHN1cGVyU2V0dGVycyA9IGl0LmdldE92ZXJyaWRkZW5PckltcGxlbWVudGVkTWV0aG9kcygpOworICAgICAgICBib29sZWFuIF9pc0VtcHR5ID0gSXRlcmFibGVFeHRlbnNpb25zLmlzRW1wdHkoc3VwZXJTZXR0ZXJzKTsKKyAgICAgICAgYm9vbGVhbiBfbm90ID0gKCFfaXNFbXB0eSk7CisgICAgICAgIGlmIChfbm90KSB7CisgICAgICAgICAgZmluYWwgRnVuY3Rpb24xPE1ldGhvZERlY2xhcmF0aW9uLCBCb29sZWFuPiBfZnVuY3Rpb25fMSA9IChNZXRob2REZWNsYXJhdGlvbiBpdF8xKSAtPiB7CisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGl0XzEuaXNGaW5hbCgpKTsKKyAgICAgICAgICB9OworICAgICAgICAgIGJvb2xlYW4gX2V4aXN0cyA9IEl0ZXJhYmxlRXh0ZW5zaW9ucy5leGlzdHMoc3VwZXJTZXR0ZXJzLCBfZnVuY3Rpb25fMSk7CisgICAgICAgICAgaWYgKF9leGlzdHMpIHsKKyAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJBZGRpbmcgYSBzZXR0ZXIgdG8gdGhlIGZpZWxkICIpOworICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lID0gZmllbGQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiIHdvdWxkIG92ZXJyaWRlIGEgZmluYWwgbWV0aG9kLiIpOworICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFkZEVycm9yKGZpZWxkLCBfYnVpbGRlci50b1N0cmluZygpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQuYWRkQW5ub3RhdGlvbih0aGlzLmNvbnRleHQubmV3QW5ub3RhdGlvblJlZmVyZW5jZShPdmVycmlkZS5jbGFzcykpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbCBBbm5vdGF0aW9uUmVmZXJlbmNlIGFubm90ID0gdGhpcy5nZXRBY2Nlc3NvcnNBbm5vdGF0aW9uKGZpZWxkKTsKKyAgICAgICAgaWYgKChhbm5vdCAhPSBudWxsKSkgeworICAgICAgICAgIEFjY2Vzc29yc0RlcHJlY2F0aW9uUG9saWN5IF9kZXByZWNhdGlvblBvbGljeUFzRW51bSA9IHRoaXMuZ2V0RGVwcmVjYXRpb25Qb2xpY3lBc0VudW0oYW5ub3QpOworICAgICAgICAgIGlmIChfZGVwcmVjYXRpb25Qb2xpY3lBc0VudW0gIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChfZGVwcmVjYXRpb25Qb2xpY3lBc0VudW0pIHsKKyAgICAgICAgICAgICAgY2FzZSBBTFdBWVM6CisgICAgICAgICAgICAgIGNhc2UgT05MWV9TRVRURVI6CisgICAgICAgICAgICAgICAgaXQuYWRkQW5ub3RhdGlvbih0aGlzLmNvbnRleHQubmV3QW5ub3RhdGlvblJlZmVyZW5jZShEZXByZWNhdGVkLmNsYXNzKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgU0FNRV9BU19GSUVMRDoKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uUmVmZXJlbmNlIF9kZXByZWNhdGVkQW5ub3RhdGlvbiA9IHRoaXMuZ2V0RGVwcmVjYXRlZEFubm90YXRpb24oZmllbGQpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gX3RyaXBsZU5vdEVxdWFscyA9IChfZGVwcmVjYXRlZEFubm90YXRpb24gIT0gbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKF90cmlwbGVOb3RFcXVhbHMpIHsKKyAgICAgICAgICAgICAgICAgIGl0LmFkZEFubm90YXRpb24odGhpcy5jb250ZXh0Lm5ld0Fubm90YXRpb25SZWZlcmVuY2UoRGVwcmVjYXRlZC5jbGFzcykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBPTkxZX0dFVFRFUjoKKyAgICAgICAgICAgICAgY2FzZSBORVZFUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzEgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJDYW5ub3QgZGV0ZXJtaW5lIGRlcHJlY2F0aW9uIHBvbGljeSBmb3IgZmllbGQgIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lXzEgPSBmaWVsZC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoX3NpbXBsZU5hbWVfMSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihfYnVpbGRlcl8xLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzEgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoIkNhbm5vdCBkZXRlcm1pbmUgZGVwcmVjYXRpb24gcG9saWN5IGZvciBmaWVsZCAiKTsKKyAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZV8xID0gZmllbGQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoX3NpbXBsZU5hbWVfMSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKF9idWlsZGVyXzEudG9TdHJpbmcoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsIE11dGFibGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbSA9IGl0LmFkZFBhcmFtZXRlcihmaWVsZC5nZXRTaW1wbGVOYW1lKCksIHRoaXMub3JPYmplY3QoZmllbGQuZ2V0VHlwZSgpKSk7CisgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgX2NsaWVudCA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZFRvKFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQuVGFyZ2V0U3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcikgeworICAgICAgICAgICAgT2JqZWN0IF9maWVsZE93bmVyID0gVXRpbC50aGlzLmZpZWxkT3duZXIoZmllbGQpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9maWVsZE93bmVyKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLiIpOworICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lID0gZmllbGQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiID0gIik7CisgICAgICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWVfMSA9IHBhcmFtLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfc2ltcGxlTmFtZV8xKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiOyIpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgaXQuc2V0Qm9keShfY2xpZW50KTsKKyAgICAgICAgaXQuc2V0U3RhdGljKGZpZWxkLmlzU3RhdGljKCkpOworICAgICAgICBpdC5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOworICAgICAgfTsKKyAgICAgIGZpZWxkLmdldERlY2xhcmluZ1R5cGUoKS5hZGRNZXRob2QodGhpcy5nZXRTZXR0ZXJOYW1lKGZpZWxkKSwgX2Z1bmN0aW9uKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBUeXBlUmVmZXJlbmNlIG9yT2JqZWN0KGZpbmFsIFR5cGVSZWZlcmVuY2UgcmVmKSB7CisgICAgICBUeXBlUmVmZXJlbmNlIF94aWZleHByZXNzaW9uID0gbnVsbDsKKyAgICAgIGlmICgocmVmID09IG51bGwpKSB7CisgICAgICAgIF94aWZleHByZXNzaW9uID0gdGhpcy5jb250ZXh0LmdldE9iamVjdCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3hpZmV4cHJlc3Npb24gPSByZWY7CisgICAgICB9CisgICAgICByZXR1cm4gX3hpZmV4cHJlc3Npb247CisgICAgfQorICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZG9UcmFuc2Zvcm0oZmluYWwgTGlzdDw/IGV4dGVuZHMgTXV0YWJsZU1lbWJlckRlY2xhcmF0aW9uPiBlbGVtZW50cywgQEV4dGVuc2lvbiBmaW5hbCBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworICAgIGZpbmFsIENvbnN1bWVyPE11dGFibGVNZW1iZXJEZWNsYXJhdGlvbj4gX2Z1bmN0aW9uID0gKE11dGFibGVNZW1iZXJEZWNsYXJhdGlvbiBpdCkgLT4geworICAgICAgdGhpcy50cmFuc2Zvcm0oaXQsIGNvbnRleHQpOworICAgIH07CisgICAgZWxlbWVudHMuZm9yRWFjaChfZnVuY3Rpb24pOworICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCBfdHJhbnNmb3JtKGZpbmFsIE11dGFibGVGaWVsZERlY2xhcmF0aW9uIGl0LCBARXh0ZW5zaW9uIGZpbmFsIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgQEV4dGVuc2lvbgorICAgIGZpbmFsIEFjY2Vzc29yc1Byb2Nlc3Nvci5VdGlsIHV0aWwgPSBuZXcgQWNjZXNzb3JzUHJvY2Vzc29yLlV0aWwoY29udGV4dCk7CisgICAgZmluYWwgQW5ub3RhdGlvblJlZmVyZW5jZSBhbm5vdCA9IHV0aWwuZ2V0QWNjZXNzb3JzQW5ub3RhdGlvbihpdCk7CisgICAgYm9vbGVhbiBfc2hvdWxkQWRkR2V0dGVyID0gdXRpbC5zaG91bGRBZGRHZXR0ZXIoaXQpOworICAgIGlmIChfc2hvdWxkQWRkR2V0dGVyKSB7CisgICAgICB1dGlsLmFkZEdldHRlcihpdCwgdXRpbC50b1Zpc2liaWxpdHkodXRpbC5nZXRHZXR0ZXJUeXBlKGl0KSkpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKChhbm5vdCAhPSBudWxsKSAmJiAodXRpbC5nZXREZXByZWNhdGlvblBvbGljeUFzRW51bShhbm5vdCkgPT0gQWNjZXNzb3JzRGVwcmVjYXRpb25Qb2xpY3kuT05MWV9HRVRURVIpKSkgeworICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJGaWVsZCAiKTsKKyAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lID0gaXQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWUpOworICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiBuZWVkcyBubyBnZXR0ZXIsIGJ1dCBkZXByZWNhdGlvblBvbGljeSBpcyBPTkxZX0dFVFRFUi4iKTsKKyAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJFeHBsaWNpdGx5IHNldHRpbmcgaXQgaGFzIG5vIGVmZmVjdCwgYXMgbm8gZ2V0dGVyIHdpbGwgYmUgZ2VuZXJhdGVkLiIpOworICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiVXNlIGRlcHJlY2F0aW9uIHBvbGljeSBORVZFUiB0byBkaXNhYmxlIGFjY2Vzc29ycyBkZXByZWNhdGlvbiBhbmQgcmVtb3ZlIHRoaXMgd2FybmluZy4iKTsKKyAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICBjb250ZXh0LmFkZFdhcm5pbmcoaXQsIF9idWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgfQorICAgIH0KKyAgICBib29sZWFuIF9zaG91bGRBZGRTZXR0ZXIgPSB1dGlsLnNob3VsZEFkZFNldHRlcihpdCk7CisgICAgaWYgKF9zaG91bGRBZGRTZXR0ZXIpIHsKKyAgICAgIHV0aWwuYWRkU2V0dGVyKGl0LCB1dGlsLnRvVmlzaWJpbGl0eSh1dGlsLmdldFNldHRlclR5cGUoaXQpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICgoKGFubm90ICE9IG51bGwpICYmICh1dGlsLmdldERlcHJlY2F0aW9uUG9saWN5QXNFbnVtKGFubm90KSA9PSBBY2Nlc3NvcnNEZXByZWNhdGlvblBvbGljeS5PTkxZX1NFVFRFUikpKSB7CisgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMSA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJGaWVsZCAiKTsKKyAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lXzEgPSBpdC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKF9zaW1wbGVOYW1lXzEpOworICAgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiIG5lZWRzIG5vIHNldHRlciwgYnV0IGRlcHJlY2F0aW9uUG9saWN5IGlzIE9OTFlfU0VUVEVSLiIpOworICAgICAgICBfYnVpbGRlcl8xLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJFeHBsaWNpdGx5IHNldHRpbmcgaXQgaGFzIG5vIGVmZmVjdCwgYXMgbm8gc2V0dGVyIHdpbGwgYmUgZ2VuZXJhdGVkLiIpOworICAgICAgICBfYnVpbGRlcl8xLm5ld0xpbmUoKTsKKyAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoIlVzZSBkZXByZWNhdGlvbiBwb2xpY3kgTkVWRVIgdG8gZGlzYWJsZSBhY2Nlc3NvcnMgZGVwcmVjYXRpb24gYW5kIHJlbW92ZSB0aGlzIHdhcm5pbmcuIik7CisgICAgICAgIF9idWlsZGVyXzEubmV3TGluZSgpOworICAgICAgICBjb250ZXh0LmFkZFdhcm5pbmcoaXQsIF9idWlsZGVyXzEudG9TdHJpbmcoKSk7CisgICAgICB9CisgICAgfQorICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCBfdHJhbnNmb3JtKGZpbmFsIE11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGl0LCBARXh0ZW5zaW9uIGZpbmFsIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgQW5ub3RhdGlvblJlZmVyZW5jZSBfZmluZEFubm90YXRpb24gPSBpdC5maW5kQW5ub3RhdGlvbihjb250ZXh0LmZpbmRUeXBlR2xvYmFsbHkoRGF0YS5jbGFzcykpOworICAgIGJvb2xlYW4gX3RyaXBsZU5vdEVxdWFscyA9IChfZmluZEFubm90YXRpb24gIT0gbnVsbCk7CisgICAgaWYgKF90cmlwbGVOb3RFcXVhbHMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgQEV4dGVuc2lvbgorICAgIGZpbmFsIEZpbmFsRmllbGRzQ29uc3RydWN0b3JQcm9jZXNzb3IuVXRpbCByZXF1aXJlZEFyZ3NVdGlsID0gbmV3IEZpbmFsRmllbGRzQ29uc3RydWN0b3JQcm9jZXNzb3IuVXRpbChjb250ZXh0KTsKKyAgICBpZiAoKHJlcXVpcmVkQXJnc1V0aWwubmVlZHNGaW5hbEZpZWxkQ29uc3RydWN0b3IoaXQpIHx8IChpdC5maW5kQW5ub3RhdGlvbihjb250ZXh0LmZpbmRUeXBlR2xvYmFsbHkoRmluYWxGaWVsZHNDb25zdHJ1Y3Rvci5jbGFzcykpICE9IG51bGwpKSkgeworICAgICAgcmVxdWlyZWRBcmdzVXRpbC5hZGRGaW5hbEZpZWxkc0NvbnN0cnVjdG9yKGl0KTsKKyAgICB9CisgICAgZmluYWwgRnVuY3Rpb24xPE11dGFibGVGaWVsZERlY2xhcmF0aW9uLCBCb29sZWFuPiBfZnVuY3Rpb24gPSAoTXV0YWJsZUZpZWxkRGVjbGFyYXRpb24gaXRfMSkgLT4geworICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZigoKCFpdF8xLmlzU3RhdGljKCkpICYmIGNvbnRleHQuaXNUaGVQcmltYXJ5R2VuZXJhdGVkSmF2YUVsZW1lbnQoaXRfMSkpKTsKKyAgICB9OworICAgIGZpbmFsIENvbnN1bWVyPE11dGFibGVGaWVsZERlY2xhcmF0aW9uPiBfZnVuY3Rpb25fMSA9IChNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBpdF8xKSAtPiB7CisgICAgICB0aGlzLl90cmFuc2Zvcm0oaXRfMSwgY29udGV4dCk7CisgICAgfTsKKyAgICBJdGVyYWJsZUV4dGVuc2lvbnMuZmlsdGVyKGl0LmdldERlY2xhcmVkRmllbGRzKCksIF9mdW5jdGlvbikuZm9yRWFjaChfZnVuY3Rpb25fMSk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShmaW5hbCBNdXRhYmxlTWVtYmVyRGVjbGFyYXRpb24gaXQsIGZpbmFsIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgaWYgKGl0IGluc3RhbmNlb2YgTXV0YWJsZUNsYXNzRGVjbGFyYXRpb24pIHsKKyAgICAgIF90cmFuc2Zvcm0oKE11dGFibGVDbGFzc0RlY2xhcmF0aW9uKWl0LCBjb250ZXh0KTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGl0IGluc3RhbmNlb2YgTXV0YWJsZUZpZWxkRGVjbGFyYXRpb24pIHsKKyAgICAgIF90cmFuc2Zvcm0oKE11dGFibGVGaWVsZERlY2xhcmF0aW9uKWl0LCBjb250ZXh0KTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5oYW5kbGVkIHBhcmFtZXRlciB0eXBlczogIiArCisgICAgICAgIEFycmF5cy48T2JqZWN0PmFzTGlzdChpdCwgY29udGV4dCkudG9TdHJpbmcoKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9EYXRhLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9EYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMxMDEwYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0RhdGEuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9uczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFjdGl2ZTsKKworLyoqCisgKiBUdXJucyB0aGlzIGNsYXNzIGludG8gYSByZWFkLW9ubHkgRGF0YSBvYmplY3QuCisgKiAKKyAqIDxwPkFsbCBub24tc3RhdGljLCBub24tdHJhbnNpZW50IGZpZWxkcyAoImRhdGEgZmllbGRzIikgYmVjb21lIGZpbmFsIGFuZCBhIGdldHRlciBpcyBjcmVhdGVkIGZvciBlYWNoIG9uZS4gRm9yIHByaW1pdGl2ZSBib29sZWFuIHByb3BlcnRpZXMsIHRoZSAiaXMiLXByZWZpeCBpcyB1c2VkLgorICogVGhlIGdlbmVyYXRpb24gb2YgZ2V0dGVycyBjYW4gYmUgY3VzdG9taXplZCB1c2luZyB0aGUge0BsaW5rIEFjY2Vzc29yc30gYW5ub3RhdGlvbi48L3A+CisgKiA8cD5JZiB0aGVyZSBpcyBubyB1c2VyLWRlZmluZWQgY29uc3RydWN0b3IsIGEgY29uc3RydWN0b3IgdGFraW5nIGFsbCBkYXRhIGZpZWxkcyB3aWxsIGJlIGdlbmVyYXRlZC4KKyAqIElmIHRoZXJlIGFscmVhZHkgaXMgYSBjb25zdHJ1Y3RvciwgYnV0IHlvdSB3YW50IHRoZSBkZWZhdWx0IG9uZSBvbiB0b3Agb2YgdGhhdCwgeW91IGNhbiB1c2UgdGhlIHtAbGluayBGaW5hbEZpZWxkc0NvbnN0cnVjdG9yfSBhbm5vdGF0aW9uLjwvcD4KKyAqIDxwPkRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpIGVxdWFsc30gYW5kIHtAbGluayBPYmplY3QjaGFzaENvZGUgaGFzaENvZGV9IGFyZSBhZGRlZCBpZiB0aGV5IGRvbid0IGV4aXN0IHlldC4gU2VlIHtAbGluayBFcXVhbHNIYXNoQ29kZX0gZm9yIGRldGFpbHMuCisgKiBBIHtAbGluayBPYmplY3QjdG9TdHJpbmcgdG9TdHJpbmd9IG1ldGhvZCBpcyBhZGRlZCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldC4gU2VlIHtAbGluayBUb1N0cmluZ30gZm9yIGRldGFpbHMgYW5kIGN1c3RvbWl6YXRpb24gb3B0aW9ucy48L3A+CisgKiAKKyAqIDxwPk5vdGU6IEFsdGhvdWdoIG5vIHNldHRlcnMgYXJlIGdlbmVyYXRlZCwgdGhpcyBhbm5vdGF0aW9uIGRvZXMgbm90IGVuZm9yY2UgaW1tdXRhYmlsaXR5LgorICogT2JqZWN0cyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igb3IgcmV0dXJuZWQgYnkgdGhlIGdldHRlcnMgY291bGQgYmUgbW9kaWZpZWQgYnkgY2xpZW50cy4KKyAqIElmIGltbXV0YWJpbGl0eSBpcyByZXF1aXJlZCwgeW91IG5lZWQgdG8gaW1wbGVtZW50IGFwcHJvcHJpYXRlIGRlZmVuc2l2ZSBjb3B5aW5nLjwvcD4KKyAqIEBzaW5jZSAyLjcKKyAqLworQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQorQEFjdGl2ZShEYXRhUHJvY2Vzc29yLmNsYXNzKQorQERvY3VtZW50ZWQKK0BHd3RDb21wYXRpYmxlCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBAaW50ZXJmYWNlIERhdGEgeworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvRGF0YS54dGVuZCBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0RhdGEueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyNzVkNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0RhdGEueHRlbmQKQEAgLTAsMCArMSwxMDAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zCisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZQoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZQoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5BYnN0cmFjdENsYXNzUHJvY2Vzc29yCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFjdGl2ZQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5UcmFuc2Zvcm1hdGlvbkNvbnRleHQKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uRmllbGREZWNsYXJhdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5Nb2RpZmllcgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5WaXNpYmlsaXR5CisKKy8qKgorICogVHVybnMgdGhpcyBjbGFzcyBpbnRvIGEgcmVhZC1vbmx5IERhdGEgb2JqZWN0LiAKKyAqIAorICogPHA+QWxsIG5vbi1zdGF0aWMsIG5vbi10cmFuc2llbnQgZmllbGRzICgiZGF0YSBmaWVsZHMiKSBiZWNvbWUgZmluYWwgYW5kIGEgZ2V0dGVyIGlzIGNyZWF0ZWQgZm9yIGVhY2ggb25lLiBGb3IgcHJpbWl0aXZlIGJvb2xlYW4gcHJvcGVydGllcywgdGhlICJpcyItcHJlZml4IGlzIHVzZWQuCisgKiBUaGUgZ2VuZXJhdGlvbiBvZiBnZXR0ZXJzIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSB7QGxpbmsgQWNjZXNzb3JzfSBhbm5vdGF0aW9uLjwvcD4KKyAqIDxwPklmIHRoZXJlIGlzIG5vIHVzZXItZGVmaW5lZCBjb25zdHJ1Y3RvciwgYSBjb25zdHJ1Y3RvciB0YWtpbmcgYWxsIGRhdGEgZmllbGRzIHdpbGwgYmUgZ2VuZXJhdGVkLiAKKyAqIElmIHRoZXJlIGFscmVhZHkgaXMgYSBjb25zdHJ1Y3RvciwgYnV0IHlvdSB3YW50IHRoZSBkZWZhdWx0IG9uZSBvbiB0b3Agb2YgdGhhdCwgeW91IGNhbiB1c2UgdGhlIHtAbGluayBGaW5hbEZpZWxkc0NvbnN0cnVjdG9yfSBhbm5vdGF0aW9uLjwvcD4gCisgKiA8cD5EZWZhdWx0IGltcGxlbWVudGF0aW9ucyBmb3Ige0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KSBlcXVhbHN9IGFuZCB7QGxpbmsgT2JqZWN0I2hhc2hDb2RlIGhhc2hDb2RlfSBhcmUgYWRkZWQgaWYgdGhleSBkb24ndCBleGlzdCB5ZXQuIFNlZSB7QGxpbmsgRXF1YWxzSGFzaENvZGV9IGZvciBkZXRhaWxzLgorICogQSB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nIHRvU3RyaW5nfSBtZXRob2QgaXMgYWRkZWQgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQuIFNlZSB7QGxpbmsgVG9TdHJpbmd9IGZvciBkZXRhaWxzIGFuZCBjdXN0b21pemF0aW9uIG9wdGlvbnMuPC9wPgorICogCisgKiA8cD5Ob3RlOiBBbHRob3VnaCBubyBzZXR0ZXJzIGFyZSBnZW5lcmF0ZWQsIHRoaXMgYW5ub3RhdGlvbiBkb2VzIG5vdCBlbmZvcmNlIGltbXV0YWJpbGl0eS4gCisgKiBPYmplY3RzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciBvciByZXR1cm5lZCBieSB0aGUgZ2V0dGVycyBjb3VsZCBiZSBtb2RpZmllZCBieSBjbGllbnRzLiAKKyAqIElmIGltbXV0YWJpbGl0eSBpcyByZXF1aXJlZCwgeW91IG5lZWQgdG8gaW1wbGVtZW50IGFwcHJvcHJpYXRlIGRlZmVuc2l2ZSBjb3B5aW5nLjwvcD4KKyAqIEBzaW5jZSAyLjcKKyAqLworQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQorQEFjdGl2ZShEYXRhUHJvY2Vzc29yKQorQERvY3VtZW50ZWQKK0BHd3RDb21wYXRpYmxlCithbm5vdGF0aW9uIERhdGEgeworfQorCisvKioKKyAqIEBzaW5jZSAyLjcKKyAqIEBub2V4dGVuZAorICogQG5vcmVmZXJlbmNlCisgKi8KK0BCZXRhCitjbGFzcyBEYXRhUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDbGFzc1Byb2Nlc3NvciB7CisJb3ZlcnJpZGUgZG9UcmFuc2Zvcm0oTXV0YWJsZUNsYXNzRGVjbGFyYXRpb24gaXQsIGV4dGVuc2lvbiBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworCQlleHRlbnNpb24gdmFsIHV0aWwgPSBuZXcgRGF0YVByb2Nlc3Nvci5VdGlsKGNvbnRleHQpCisJCWV4dGVuc2lvbiB2YWwgZ2V0dGVyVXRpbCA9IG5ldyBBY2Nlc3NvcnNQcm9jZXNzb3IuVXRpbChjb250ZXh0KQorCQlleHRlbnNpb24gdmFsIGVoVXRpbCA9IG5ldyBFcXVhbHNIYXNoQ29kZVByb2Nlc3Nvci5VdGlsKGNvbnRleHQpCisJCWV4dGVuc2lvbiB2YWwgdG9TdHJpbmdVdGlsID0gbmV3IFRvU3RyaW5nUHJvY2Vzc29yLlV0aWwoY29udGV4dCkKKwkJZXh0ZW5zaW9uIHZhbCByZXF1aXJlZEFyZ3NVdGlsID0gbmV3IEZpbmFsRmllbGRzQ29uc3RydWN0b3JQcm9jZXNzb3IuVXRpbChjb250ZXh0KQorCisJCWRhdGFGaWVsZHMuZm9yRWFjaCBbCisJCQlpZiAoKHByaW1hcnlTb3VyY2VFbGVtZW50IGFzIEZpZWxkRGVjbGFyYXRpb24pLm1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5WQVIpKSB7CisJCQkJYWRkRXJyb3IoIkNhbm5vdCB1c2UgdGhlICd2YXInIGtleXdvcmQgb24gYSBkYXRhIGZpZWxkIikKKwkJCX0KKwkJCWZpbmFsID0gdHJ1ZQorCQldCisJCWlmIChuZWVkc0ZpbmFsRmllbGRDb25zdHJ1Y3RvciB8fCBmaW5kQW5ub3RhdGlvbihGaW5hbEZpZWxkc0NvbnN0cnVjdG9yLmZpbmRUeXBlR2xvYmFsbHkpICE9PSBudWxsKSB7CisJCQlhZGRGaW5hbEZpZWxkc0NvbnN0cnVjdG9yCisJCX0KKwkJaWYgKCFoYXNIYXNoQ29kZSkgeworCQkJYWRkSGFzaENvZGUoZGF0YUZpZWxkcywgaGFzU3VwZXJIYXNoQ29kZSkKKwkJfQorCQlpZiAoIWhhc0VxdWFscykgeworCQkJYWRkRXF1YWxzKGRhdGFGaWVsZHMsIGhhc1N1cGVyRXF1YWxzKQorCQl9CisJCWlmICghaGFzVG9TdHJpbmcpIHsKKwkJCWlmIChzdXBlckNvbnN0cnVjdG9yID09PSBudWxsKSB7CisJCQkJYWRkVG9TdHJpbmcoZGF0YUZpZWxkcywgdG9TdHJpbmdDb25maWcgPzogbmV3IFRvU3RyaW5nQ29uZmlndXJhdGlvbikKKwkJCX0gZWxzZSB7CisJCQkJYWRkUmVmbGVjdGl2ZVRvU3RyaW5nKHRvU3RyaW5nQ29uZmlnID86IG5ldyBUb1N0cmluZ0NvbmZpZ3VyYXRpb24pCisJCQl9CisJCX0KKwkJZGF0YUZpZWxkcy5mb3JFYWNoIFsKKwkJCWlmIChzaG91bGRBZGRHZXR0ZXIpIHsKKwkJCQlhZGRHZXR0ZXIoZ2V0dGVyVHlwZT8udG9WaXNpYmlsaXR5ID86IFZpc2liaWxpdHkuUFVCTElDKQorCQkJfQorCQldCisJfQorCisJLyoqCisJICogQHNpbmNlIDIuNworCSAqIEBub2V4dGVuZAorCSAqIEBub3JlZmVyZW5jZQorCSAqLworCUBCZXRhCisJc3RhdGljIGNsYXNzIFV0aWwgeworCisJCWV4dGVuc2lvbiBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dAorCisJCW5ldyhUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworCQkJdGhpcy5jb250ZXh0ID0gY29udGV4dAorCQl9CisKKwkJZGVmIGdldERhdGFGaWVsZHMoTXV0YWJsZUNsYXNzRGVjbGFyYXRpb24gaXQpIHsKKwkJCWRlY2xhcmVkRmllbGRzLmZpbHRlclshc3RhdGljICYmICEgdHJhbnNpZW50ICYmIGlzVGhlUHJpbWFyeUdlbmVyYXRlZEphdmFFbGVtZW50XQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9EYXRhUHJvY2Vzc29yLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9EYXRhUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2MTdjMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0RhdGFQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnMuQWNjZXNzb3JzUHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9ucy5FcXVhbHNIYXNoQ29kZVByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnMuRmluYWxGaWVsZHNDb25zdHJ1Y3RvclByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnMuVG9TdHJpbmdQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFic3RyYWN0Q2xhc3NQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLlRyYW5zZm9ybWF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uUmVzb2x2ZWRDb25zdHJ1Y3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVmlzaWJpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRXh0ZW5zaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5GdW5jdGlvbnMuRnVuY3Rpb24xOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5JdGVyYWJsZUV4dGVuc2lvbnM7CisKKy8qKgorICogQHNpbmNlIDIuNworICogQG5vZXh0ZW5kCisgKiBAbm9yZWZlcmVuY2UKKyAqLworQEJldGEKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIERhdGFQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdENsYXNzUHJvY2Vzc29yIHsKKyAgLyoqCisgICAqIEBzaW5jZSAyLjcKKyAgICogQG5vZXh0ZW5kCisgICAqIEBub3JlZmVyZW5jZQorICAgKi8KKyAgQEJldGEKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBVdGlsIHsKKyAgICBARXh0ZW5zaW9uCisgICAgcHJpdmF0ZSBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dDsKKyAgICAKKyAgICBwdWJsaWMgVXRpbChmaW5hbCBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICB9CisgICAgCisgICAgcHVibGljIEl0ZXJhYmxlPD8gZXh0ZW5kcyBNdXRhYmxlRmllbGREZWNsYXJhdGlvbj4gZ2V0RGF0YUZpZWxkcyhmaW5hbCBNdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbiBpdCkgeworICAgICAgZmluYWwgRnVuY3Rpb24xPE11dGFibGVGaWVsZERlY2xhcmF0aW9uLCBCb29sZWFuPiBfZnVuY3Rpb24gPSAoTXV0YWJsZUZpZWxkRGVjbGFyYXRpb24gaXRfMSkgLT4geworICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCgoKCFpdF8xLmlzU3RhdGljKCkpICYmICghaXRfMS5pc1RyYW5zaWVudCgpKSkgJiYgdGhpcy5jb250ZXh0LmlzVGhlUHJpbWFyeUdlbmVyYXRlZEphdmFFbGVtZW50KGl0XzEpKSk7CisgICAgICB9OworICAgICAgcmV0dXJuIEl0ZXJhYmxlRXh0ZW5zaW9ucy5maWx0ZXIoaXQuZ2V0RGVjbGFyZWRGaWVsZHMoKSwgX2Z1bmN0aW9uKTsKKyAgICB9CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBkb1RyYW5zZm9ybShmaW5hbCBNdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbiBpdCwgQEV4dGVuc2lvbiBmaW5hbCBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworICAgIEBFeHRlbnNpb24KKyAgICBmaW5hbCBEYXRhUHJvY2Vzc29yLlV0aWwgdXRpbCA9IG5ldyBEYXRhUHJvY2Vzc29yLlV0aWwoY29udGV4dCk7CisgICAgQEV4dGVuc2lvbgorICAgIGZpbmFsIEFjY2Vzc29yc1Byb2Nlc3Nvci5VdGlsIGdldHRlclV0aWwgPSBuZXcgQWNjZXNzb3JzUHJvY2Vzc29yLlV0aWwoY29udGV4dCk7CisgICAgQEV4dGVuc2lvbgorICAgIGZpbmFsIEVxdWFsc0hhc2hDb2RlUHJvY2Vzc29yLlV0aWwgZWhVdGlsID0gbmV3IEVxdWFsc0hhc2hDb2RlUHJvY2Vzc29yLlV0aWwoY29udGV4dCk7CisgICAgQEV4dGVuc2lvbgorICAgIGZpbmFsIFRvU3RyaW5nUHJvY2Vzc29yLlV0aWwgdG9TdHJpbmdVdGlsID0gbmV3IFRvU3RyaW5nUHJvY2Vzc29yLlV0aWwoY29udGV4dCk7CisgICAgQEV4dGVuc2lvbgorICAgIGZpbmFsIEZpbmFsRmllbGRzQ29uc3RydWN0b3JQcm9jZXNzb3IuVXRpbCByZXF1aXJlZEFyZ3NVdGlsID0gbmV3IEZpbmFsRmllbGRzQ29uc3RydWN0b3JQcm9jZXNzb3IuVXRpbChjb250ZXh0KTsKKyAgICBmaW5hbCBDb25zdW1lcjxNdXRhYmxlRmllbGREZWNsYXJhdGlvbj4gX2Z1bmN0aW9uID0gKE11dGFibGVGaWVsZERlY2xhcmF0aW9uIGl0XzEpIC0+IHsKKyAgICAgIEVsZW1lbnQgX3ByaW1hcnlTb3VyY2VFbGVtZW50ID0gY29udGV4dC5nZXRQcmltYXJ5U291cmNlRWxlbWVudChpdF8xKTsKKyAgICAgIGJvb2xlYW4gX2NvbnRhaW5zID0gKChGaWVsZERlY2xhcmF0aW9uKSBfcHJpbWFyeVNvdXJjZUVsZW1lbnQpLmdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlZBUik7CisgICAgICBpZiAoX2NvbnRhaW5zKSB7CisgICAgICAgIGNvbnRleHQuYWRkRXJyb3IoaXRfMSwgIkNhbm5vdCB1c2UgdGhlIFwndmFyXCcga2V5d29yZCBvbiBhIGRhdGEgZmllbGQiKTsKKyAgICAgIH0KKyAgICAgIGl0XzEuc2V0RmluYWwodHJ1ZSk7CisgICAgfTsKKyAgICB1dGlsLmdldERhdGFGaWVsZHMoaXQpLmZvckVhY2goX2Z1bmN0aW9uKTsKKyAgICBpZiAoKHJlcXVpcmVkQXJnc1V0aWwubmVlZHNGaW5hbEZpZWxkQ29uc3RydWN0b3IoaXQpIHx8IChpdC5maW5kQW5ub3RhdGlvbihjb250ZXh0LmZpbmRUeXBlR2xvYmFsbHkoRmluYWxGaWVsZHNDb25zdHJ1Y3Rvci5jbGFzcykpICE9IG51bGwpKSkgeworICAgICAgcmVxdWlyZWRBcmdzVXRpbC5hZGRGaW5hbEZpZWxkc0NvbnN0cnVjdG9yKGl0KTsKKyAgICB9CisgICAgYm9vbGVhbiBfaGFzSGFzaENvZGUgPSBlaFV0aWwuaGFzSGFzaENvZGUoaXQpOworICAgIGJvb2xlYW4gX25vdCA9ICghX2hhc0hhc2hDb2RlKTsKKyAgICBpZiAoX25vdCkgeworICAgICAgZWhVdGlsLmFkZEhhc2hDb2RlKGl0LCB1dGlsLmdldERhdGFGaWVsZHMoaXQpLCBlaFV0aWwuaGFzU3VwZXJIYXNoQ29kZShpdCkpOworICAgIH0KKyAgICBib29sZWFuIF9oYXNFcXVhbHMgPSBlaFV0aWwuaGFzRXF1YWxzKGl0KTsKKyAgICBib29sZWFuIF9ub3RfMSA9ICghX2hhc0VxdWFscyk7CisgICAgaWYgKF9ub3RfMSkgeworICAgICAgZWhVdGlsLmFkZEVxdWFscyhpdCwgdXRpbC5nZXREYXRhRmllbGRzKGl0KSwgZWhVdGlsLmhhc1N1cGVyRXF1YWxzKGl0KSk7CisgICAgfQorICAgIGJvb2xlYW4gX2hhc1RvU3RyaW5nID0gdG9TdHJpbmdVdGlsLmhhc1RvU3RyaW5nKGl0KTsKKyAgICBib29sZWFuIF9ub3RfMiA9ICghX2hhc1RvU3RyaW5nKTsKKyAgICBpZiAoX25vdF8yKSB7CisgICAgICBSZXNvbHZlZENvbnN0cnVjdG9yIF9zdXBlckNvbnN0cnVjdG9yID0gcmVxdWlyZWRBcmdzVXRpbC5nZXRTdXBlckNvbnN0cnVjdG9yKGl0KTsKKyAgICAgIGJvb2xlYW4gX3RyaXBsZUVxdWFscyA9IChfc3VwZXJDb25zdHJ1Y3RvciA9PSBudWxsKTsKKyAgICAgIGlmIChfdHJpcGxlRXF1YWxzKSB7CisgICAgICAgIEl0ZXJhYmxlPD8gZXh0ZW5kcyBNdXRhYmxlRmllbGREZWNsYXJhdGlvbj4gX2RhdGFGaWVsZHMgPSB1dGlsLmdldERhdGFGaWVsZHMoaXQpOworICAgICAgICBUb1N0cmluZ0NvbmZpZ3VyYXRpb24gX2VsdmlzID0gbnVsbDsKKyAgICAgICAgVG9TdHJpbmdDb25maWd1cmF0aW9uIF90b1N0cmluZ0NvbmZpZyA9IHRvU3RyaW5nVXRpbC5nZXRUb1N0cmluZ0NvbmZpZyhpdCk7CisgICAgICAgIGlmIChfdG9TdHJpbmdDb25maWcgIT0gbnVsbCkgeworICAgICAgICAgIF9lbHZpcyA9IF90b1N0cmluZ0NvbmZpZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBUb1N0cmluZ0NvbmZpZ3VyYXRpb24gX3RvU3RyaW5nQ29uZmlndXJhdGlvbiA9IG5ldyBUb1N0cmluZ0NvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICBfZWx2aXMgPSBfdG9TdHJpbmdDb25maWd1cmF0aW9uOworICAgICAgICB9CisgICAgICAgIHRvU3RyaW5nVXRpbC5hZGRUb1N0cmluZyhpdCwgX2RhdGFGaWVsZHMsIF9lbHZpcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBUb1N0cmluZ0NvbmZpZ3VyYXRpb24gX2VsdmlzXzEgPSBudWxsOworICAgICAgICBUb1N0cmluZ0NvbmZpZ3VyYXRpb24gX3RvU3RyaW5nQ29uZmlnXzEgPSB0b1N0cmluZ1V0aWwuZ2V0VG9TdHJpbmdDb25maWcoaXQpOworICAgICAgICBpZiAoX3RvU3RyaW5nQ29uZmlnXzEgIT0gbnVsbCkgeworICAgICAgICAgIF9lbHZpc18xID0gX3RvU3RyaW5nQ29uZmlnXzE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgVG9TdHJpbmdDb25maWd1cmF0aW9uIF90b1N0cmluZ0NvbmZpZ3VyYXRpb25fMSA9IG5ldyBUb1N0cmluZ0NvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICBfZWx2aXNfMSA9IF90b1N0cmluZ0NvbmZpZ3VyYXRpb25fMTsKKyAgICAgICAgfQorICAgICAgICB0b1N0cmluZ1V0aWwuYWRkUmVmbGVjdGl2ZVRvU3RyaW5nKGl0LCBfZWx2aXNfMSk7CisgICAgICB9CisgICAgfQorICAgIGZpbmFsIENvbnN1bWVyPE11dGFibGVGaWVsZERlY2xhcmF0aW9uPiBfZnVuY3Rpb25fMSA9IChNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBpdF8xKSAtPiB7CisgICAgICBib29sZWFuIF9zaG91bGRBZGRHZXR0ZXIgPSBnZXR0ZXJVdGlsLnNob3VsZEFkZEdldHRlcihpdF8xKTsKKyAgICAgIGlmIChfc2hvdWxkQWRkR2V0dGVyKSB7CisgICAgICAgIFZpc2liaWxpdHkgX2VsdmlzXzIgPSBudWxsOworICAgICAgICBBY2Nlc3NvclR5cGUgX2dldHRlclR5cGUgPSBnZXR0ZXJVdGlsLmdldEdldHRlclR5cGUoaXRfMSk7CisgICAgICAgIFZpc2liaWxpdHkgX3Zpc2liaWxpdHkgPSBudWxsOworICAgICAgICBpZiAoX2dldHRlclR5cGUhPW51bGwpIHsKKyAgICAgICAgICBfdmlzaWJpbGl0eT1nZXR0ZXJVdGlsLnRvVmlzaWJpbGl0eShfZ2V0dGVyVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF92aXNpYmlsaXR5ICE9IG51bGwpIHsKKyAgICAgICAgICBfZWx2aXNfMiA9IF92aXNpYmlsaXR5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIF9lbHZpc18yID0gVmlzaWJpbGl0eS5QVUJMSUM7CisgICAgICAgIH0KKyAgICAgICAgZ2V0dGVyVXRpbC5hZGRHZXR0ZXIoaXRfMSwgX2VsdmlzXzIpOworICAgICAgfQorICAgIH07CisgICAgdXRpbC5nZXREYXRhRmllbGRzKGl0KS5mb3JFYWNoKF9mdW5jdGlvbl8xKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvRGVsZWdhdGUuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0RlbGVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4NWFmNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0RlbGVnYXRlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFjdGl2ZTsKKworLyoqCisgKiBJbXBsZW1lbnRzIGludGVyZmFjZXMgYnkgZm9yd2FyZGluZyBtZXRob2QgY2FsbHMgdG8gYW4gYW5ub3RhdGVkIGZpZWxkIG9yIG1ldGhvZC4KKyAqIAorICogPHA+CisgKiA8cHJlPgorICogaW50ZXJmYWNlIEkgeworICogIGRlZiBTdHJpbmcgbSgpCisgKiB9CisgKiBjbGFzcyBGb28gaW1wbGVtZW50cyBJIHsKKyAqICBvdmVycmlkZSBTdHJpbmcgbSgpIHsKKyAqICAgIkZvbyIKKyAqICB9CisgKiB9CisgKiBjbGFzcyBCYXIgaW1wbGVtZW50cyBJIHsKKyAqICAvL1RoaXMgd2lsbCBnZW5lcmF0ZSBhIG1ldGhvZCBtKCksIHdoaWNoIGNhbGxzIGZvby5tKCkKKyAqICAmIzY0O0RlbGVnYXRlIHZhbCBmb28gPSBuZXcgRm9vCisgKiB9CisgKiA8L3ByZT4KKyAqIAorICogRm9yIGVhY2ggaW50ZXJmYWNlIHRoYXQgdGhlIGRlY2xhcmluZyBjbGFzcyBhbmQgdGhlIGRlbGVnYXRlIGhhdmUgaW4gY29tbW9uLAorICogYW4gaW1wbGVtZW50YXRpb24gZm9yIGVhY2ggbWV0aG9kIGlzIGFkZGVkIGlmIGl0IGRvZXMgbm90IHlldCBleGlzdC4gVGhpcworICogaW1wbGVtZW50YXRpb24gZm9yd2FyZHMgYWxsIGNhbGxzIGRpcmVjdGx5IHRvIHRoZSBkZWxlZ2F0ZS4gWW91IGNhbiByZXN0cmljdAorICogd2hpY2ggaW50ZXJmYWNlcyB0byBpbXBsZW1lbnQgdXNpbmcgdGhlIHtAbGluayBDbGFzc31bXSB2YWx1ZSBvZiB0aGlzCisgKiBhbm5vdGF0aW9uLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gdGhlcmUgYXJlIHNldmVyYWwgZGVsZWdhdGVzIHRoYXQKKyAqIGhhdmUgc29tZSBpbnRlcmZhY2VzIGluIGNvbW1vbi4KKyAqIAorICogPC9wPgorICogRGVsZWdhdGUgbWV0aG9kcyBjYW4gZWl0aGVyIHRha2UKKyAqIDx1bD4KKyAqIDxsaT5ubyBhcmd1bWVudHM8L2xpPgorICogPGxpPnRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gYmUgY2FsbGVkIChTdHJpbmcpPC9saT4KKyAqIDxsaT50aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGJlIGNhbGxlZCAoU3RyaW5nKSwgaXRzIHBhcmFtZXRlciB0eXBlcworICogKENsYXNzW10pIGFuZCB0aGUgYWN0dWFsIGFyZ3VtZW50cyAoT2JqZWN0W10pIG9mIHRoZSBjYWxsPC9saT4KKyAqIDwvdWw+CisgKiBUaGlzIGFsbG93cyB5b3UgdG8gZ2VuZXJhdGUgbWVhbmluZ2Z1bCBlcnJvciBtZXNzYWdlcyBvciB0byBkeW5hbWljYWxseQorICogZGlzcGF0Y2ggYmFzZWQgb24gdGhlIGFyZ3VtZW50cy4KKyAqIAorICogQHNpbmNlIDIuNworICovCitAQmV0YQorQEd3dENvbXBhdGlibGUKK0BUYXJnZXQoeyBFbGVtZW50VHlwZS5GSUVMRCwgRWxlbWVudFR5cGUuTUVUSE9EIH0pCitAQWN0aXZlKERlbGVnYXRlUHJvY2Vzc29yLmNsYXNzKQorQERvY3VtZW50ZWQKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIEBpbnRlcmZhY2UgRGVsZWdhdGUgeworICAvKioKKyAgICogT3B0aW9uYWwgbGlzdCBvZiBpbnRlcmZhY2VzIHRoYXQgdGhpcyBkZWxlZ2F0ZSBpcyByZXN0cmljdGVkIHRvLgorICAgKiBEZWZhdWx0cyB0byB0aGUgY29tbW9uIGludGVyZmFjZXMgb2YgdGhlIGNvbnRleHQgdHlwZSBhbmQgdGhlIGFubm90YXRlZAorICAgKiBlbGVtZW50LgorICAgKi8KKyAgcHVibGljIENsYXNzPD8+W10gdmFsdWUoKSBkZWZhdWx0IHt9OworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvRGVsZWdhdGUueHRlbmQgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9EZWxlZ2F0ZS54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzBiNzQxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvRGVsZWdhdGUueHRlbmQKQEAgLTAsMCArMSwzMDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zCisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZQoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0cworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0CitpbXBvcnQgamF2YS51dGlsLkxpc3QKK2ltcG9ydCBqYXZhLnV0aWwuU2V0CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFjdGl2ZQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5UcmFuc2Zvcm1hdGlvbkNvbnRleHQKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uVHJhbnNmb3JtYXRpb25QYXJ0aWNpcGFudAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5GaWVsZERlY2xhcmF0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkludGVyZmFjZURlY2xhcmF0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk1lbWJlckRlY2xhcmF0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVNZW1iZXJEZWNsYXJhdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5SZXNvbHZlZE1ldGhvZAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb24KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVHlwZVJlZmVyZW5jZQoraW1wb3J0IGphdmEudXRpbC5NYXAKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkCisKKy8qKgorICogSW1wbGVtZW50cyBpbnRlcmZhY2VzIGJ5IGZvcndhcmRpbmcgbWV0aG9kIGNhbGxzIHRvIGFuIGFubm90YXRlZCBmaWVsZCBvciBtZXRob2QuCisgKiAKKyAqIDxwPgorICogPHByZT4KKyAqIGludGVyZmFjZSBJIHsKKyAqICBkZWYgU3RyaW5nIG0oKQorICogfQorICogY2xhc3MgRm9vIGltcGxlbWVudHMgSSB7CisgKiAgb3ZlcnJpZGUgU3RyaW5nIG0oKSB7CisgKiAgICJGb28iCisgKiAgfQorICogfQorICogY2xhc3MgQmFyIGltcGxlbWVudHMgSSB7CisgKiAgLy9UaGlzIHdpbGwgZ2VuZXJhdGUgYSBtZXRob2QgbSgpLCB3aGljaCBjYWxscyBmb28ubSgpCisgKiAgJiM2NDtEZWxlZ2F0ZSB2YWwgZm9vID0gbmV3IEZvbworICogfQorICogPC9wcmU+CisgKiAKKyAqIEZvciBlYWNoIGludGVyZmFjZSB0aGF0IHRoZSBkZWNsYXJpbmcgY2xhc3MgYW5kIHRoZSBkZWxlZ2F0ZSBoYXZlIGluIGNvbW1vbiwKKyAqIGFuIGltcGxlbWVudGF0aW9uIGZvciBlYWNoIG1ldGhvZCBpcyBhZGRlZCBpZiBpdCBkb2VzIG5vdCB5ZXQgZXhpc3QuIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIGZvcndhcmRzIGFsbCBjYWxscyBkaXJlY3RseSB0byB0aGUgZGVsZWdhdGUuIFlvdSBjYW4gcmVzdHJpY3QKKyAqIHdoaWNoIGludGVyZmFjZXMgdG8gaW1wbGVtZW50IHVzaW5nIHRoZSB7QGxpbmsgQ2xhc3N9W10gdmFsdWUgb2YgdGhpcworICogYW5ub3RhdGlvbi4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIHRoZXJlIGFyZSBzZXZlcmFsIGRlbGVnYXRlcyB0aGF0CisgKiBoYXZlIHNvbWUgaW50ZXJmYWNlcyBpbiBjb21tb24uCisgKiAKKyAqIDwvcD4KKyAqIERlbGVnYXRlIG1ldGhvZHMgY2FuIGVpdGhlciB0YWtlCisgKiA8dWw+CisgKiA8bGk+bm8gYXJndW1lbnRzPC9saT4KKyAqIDxsaT50aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGJlIGNhbGxlZCAoU3RyaW5nKTwvbGk+CisgKiA8bGk+dGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBiZSBjYWxsZWQgKFN0cmluZyksIGl0cyBwYXJhbWV0ZXIgdHlwZXMKKyAqIChDbGFzc1tdKSBhbmQgdGhlIGFjdHVhbCBhcmd1bWVudHMgKE9iamVjdFtdKSBvZiB0aGUgY2FsbDwvbGk+CisgKiA8L3VsPgorICogVGhpcyBhbGxvd3MgeW91IHRvIGdlbmVyYXRlIG1lYW5pbmdmdWwgZXJyb3IgbWVzc2FnZXMgb3IgdG8gZHluYW1pY2FsbHkKKyAqIGRpc3BhdGNoIGJhc2VkIG9uIHRoZSBhcmd1bWVudHMuCisgKiAKKyAqIEBzaW5jZSAyLjcKKyAqLworQEJldGEKK0BHd3RDb21wYXRpYmxlCitAVGFyZ2V0KEVsZW1lbnRUeXBlLkZJRUxELCBFbGVtZW50VHlwZS5NRVRIT0QpCitAQWN0aXZlKERlbGVnYXRlUHJvY2Vzc29yKQorQERvY3VtZW50ZWQKK2Fubm90YXRpb24gRGVsZWdhdGUgeworCS8qKgorCSAqIE9wdGlvbmFsIGxpc3Qgb2YgaW50ZXJmYWNlcyB0aGF0IHRoaXMgZGVsZWdhdGUgaXMgcmVzdHJpY3RlZCB0by4KKwkgKiBEZWZhdWx0cyB0byB0aGUgY29tbW9uIGludGVyZmFjZXMgb2YgdGhlIGNvbnRleHQgdHlwZSBhbmQgdGhlIGFubm90YXRlZAorCSAqIGVsZW1lbnQuCisJICovCisJQ2xhc3M8Pz5bXSB2YWx1ZSA9ICNbXQorfQorCisvKioKKyAqIEBzaW5jZSAyLjcKKyAqIEBub2V4dGVuZAorICogQG5vcmVmZXJlbmNlCisgKi8KK0BCZXRhCitjbGFzcyBEZWxlZ2F0ZVByb2Nlc3NvciBpbXBsZW1lbnRzIFRyYW5zZm9ybWF0aW9uUGFydGljaXBhbnQ8TXV0YWJsZU1lbWJlckRlY2xhcmF0aW9uPiB7CisKKwlvdmVycmlkZSBkb1RyYW5zZm9ybShMaXN0PD8gZXh0ZW5kcyBNdXRhYmxlTWVtYmVyRGVjbGFyYXRpb24+IGVsZW1lbnRzLCBleHRlbnNpb24gVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKwkJdmFsIGV4dGVuc2lvbiB1dGlsID0gbmV3IERlbGVnYXRlUHJvY2Vzc29yLlV0aWwoY29udGV4dCkKKwkJZWxlbWVudHMuZm9yRWFjaCBbCisJCQlpZiAodmFsaWREZWxlZ2F0ZSkgeworCQkJCW1ldGhvZHNUb0ltcGxlbWVudC5mb3JFYWNoW21ldGhvZHxpbXBsZW1lbnRNZXRob2QobWV0aG9kKV0KKwkJCX0KKwkJXQorCX0KKworCS8qKgorCSAqIEBzaW5jZSAyLjcKKwkgKiBAbm9leHRlbmQKKwkgKiBAbm9yZWZlcmVuY2UKKyAJKi8KKyAJQEJldGEKKwlzdGF0aWMgY2xhc3MgVXRpbCB7CisJCWV4dGVuc2lvbiBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dAorCisJCW5ldyhUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworCQkJdGhpcy5jb250ZXh0ID0gY29udGV4dAorCQl9CisJCQorCQlkZWYgZGlzcGF0Y2ggaXNWYWxpZERlbGVnYXRlKEZpZWxkRGVjbGFyYXRpb24gaXQpIHsKKwkJCWhhc1ZhbGlkVHlwZSAmJiAhaGFzRGVsZWdhdGlvbkNvbmZsaWN0cyAmJiBhcmVMaXN0ZWRJbnRlcmZhY2VzVmFsaWQKKwkJfQorCisJCWRlZiBkaXNwYXRjaCBpc1ZhbGlkRGVsZWdhdGUoTWV0aG9kRGVjbGFyYXRpb24gaXQpIHsKKwkJCWhhc1ZhbGlkVHlwZSAmJiBoYXNWYWxpZFNpZ25hdHVyZSAmJiAhaGFzRGVsZWdhdGlvbkNvbmZsaWN0cyAmJiBhcmVMaXN0ZWRJbnRlcmZhY2VzVmFsaWQKKwkJfQorCisJCWRlZiBoYXNWYWxpZFR5cGUoTWVtYmVyRGVjbGFyYXRpb24gaXQpIHsKKwkJCWlmICh0eXBlID09PSBudWxsIHx8IHR5cGUuaW5mZXJyZWQpIHsKKwkJCQlhZGRFcnJvcigiQ2Fubm90IHVzZSBpbmZlcnJlZCB0eXBlcyBvbiBkZWxlZ2F0ZXMiKQorCQkJCWZhbHNlCisJCQl9IGVsc2UgeworCQkJCXRydWUKKwkJCX0KKwkJfQorCQkKKwkJZGVmIGRpc3BhdGNoIGdldFR5cGUoRmllbGREZWNsYXJhdGlvbiBpdCkgeworCQkJdHlwZQorCQl9CisKKwkJZGVmIGRpc3BhdGNoIGdldFR5cGUoTWV0aG9kRGVjbGFyYXRpb24gaXQpIHsKKwkJCXJldHVyblR5cGUKKwkJfQorCQkKKwkJZGVmIGhhc1ZhbGlkU2lnbmF0dXJlKE1ldGhvZERlY2xhcmF0aW9uIGl0KSB7CisJCQlzd2l0Y2ggcGFyYW1ldGVycy5tYXBbdHlwZV0udG9MaXN0IHsKKwkJCQljYXNlICNbXSwKKwkJCQljYXNlICNbc3RyaW5nXSwKKwkJCQljYXNlICNbc3RyaW5nLCBDbGFzcy5uZXdUeXBlUmVmZXJlbmNlKG5ld1dpbGRjYXJkVHlwZVJlZmVyZW5jZSkubmV3QXJyYXlUeXBlUmVmZXJlbmNlLCBvYmplY3QubmV3QXJyYXlUeXBlUmVmZXJlbmNlXToKKwkJCQkJdHJ1ZQorCQkJCWRlZmF1bHQ6IHsKKwkJCQkJYWRkRXJyb3IoIk5vdCBhIHZhbGlkIGRlbGVnYXRlIHNpZ25hdHVyZSwgdXNlICgpIG9yIChTdHJpbmcgbWV0aG9kTmFtZSkgb3IgKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIGFyZ3VtZW50VHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cykiKQorCQkJCQlmYWxzZQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWRlZiBoYXNEZWxlZ2F0aW9uQ29uZmxpY3RzKE1lbWJlckRlY2xhcmF0aW9uIGRlbGVnYXRlKSB7CisJCQl2YXIgY29uZmxpY3QgPSBmYWxzZQorCQkJZm9yIChvdGhlciA6IGRlbGVnYXRlLm90aGVyRGVsZWdhdGVzKSB7CisJCQkJdmFsIG90aGVySW50ZXJmYWNlcyA9IG90aGVyLmRlbGVnYXRlZEludGVyZmFjZXMKKwkJCQlmb3IgKGlmYWNlIDogZGVsZWdhdGUuZGVsZWdhdGVkSW50ZXJmYWNlcykgeworCQkJCQlpZiAob3RoZXJJbnRlcmZhY2VzLmNvbnRhaW5zKGlmYWNlKSkgeworCQkJCQkJY29uZmxpY3QgPSB0cnVlCisJCQkJCQlkZWxlZ2F0ZS5hZGRFcnJvcignJydUaGUgaW50ZXJmYWNlIKtpZmFjZS5zaW1wbGVOYW1luyBpcyBhbHNvIGltcGxlbWVudGVkIGJ5IHRoZSBkZWxlZ2F0ZSCrb3RoZXIuc2ltcGxlTmFtZbsnJycpCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljb25mbGljdAorCQl9CisJCQorCQlkZWYgb3RoZXJEZWxlZ2F0ZXMoTWVtYmVyRGVjbGFyYXRpb24gZGVsZWdhdGUpIHsKKwkJCWRlbGVnYXRlLmRlY2xhcmluZ1R5cGUuZGVsZWdhdGVzLmZpbHRlcltpdCAhPSBkZWxlZ2F0ZV0KKwkJfQorCisJCWRlZiBhcmVMaXN0ZWRJbnRlcmZhY2VzVmFsaWQoTWVtYmVyRGVjbGFyYXRpb24gZGVsZWdhdGUpIHsKKwkJCXZhbCBkZWNsYXJpbmdUeXBlID0gZGVsZWdhdGUuZGVjbGFyaW5nVHlwZS5uZXdTZWxmVHlwZVJlZmVyZW5jZQorCQkJdmFsIGludGVyZmFjZXNPZkRlY2xhcmluZ1R5cGUgPSBkZWNsYXJpbmdUeXBlLmltcGxlbWVudGVkSW50ZXJmYWNlcworCQkJdmFsIGF2YWlsYWJsZUludGVyZmFjZXMgPSBkZWxlZ2F0ZS50eXBlLmltcGxlbWVudGVkSW50ZXJmYWNlcworCQkJdmFsIGxpc3RlZEludGVyZmFjZXMgPSBkZWxlZ2F0ZS5saXN0ZWRJbnRlcmZhY2VzCisJCQl2YXIgdmFsaWQgPSB0cnVlCisJCQlmb3IoaWZhY2UgOiBsaXN0ZWRJbnRlcmZhY2VzKSB7CisJCQkJaWYgKCFhdmFpbGFibGVJbnRlcmZhY2VzLmV4aXN0c1t0eXBlID09IGlmYWNlLnR5cGVdKSB7CisJCQkJCWRlbGVnYXRlLmFkZEVycm9yKCcnJ6tkZWxlZ2F0ZS50eXBlLnNpbXBsZU5hbWW7IGRvZXMgbm90IGltcGxlbWVudCCraWZhY2Uuc2ltcGxlTmFtZbsnJycpCisJCQkJCXZhbGlkID0gZmFsc2UKKwkJCQl9CisJCQkJaWYgKCFpbnRlcmZhY2VzT2ZEZWNsYXJpbmdUeXBlLmV4aXN0c1t0eXBlID09IGlmYWNlLnR5cGVdKSB7CisJCQkJCWRlbGVnYXRlLmFkZEVycm9yKCcnJ6tkZWNsYXJpbmdUeXBlLnNpbXBsZU5hbWW7IGRvZXMgbm90IGltcGxlbWVudCCraWZhY2Uuc2ltcGxlTmFtZbsnJycpCisJCQkJCXZhbGlkID0gZmFsc2UKKwkJCQl9CisJCQl9CisJCQlpZiAobGlzdGVkSW50ZXJmYWNlcy5lbXB0eSAmJiBTZXRzLmludGVyc2VjdGlvbihpbnRlcmZhY2VzT2ZEZWNsYXJpbmdUeXBlLCBhdmFpbGFibGVJbnRlcmZhY2VzKS5lbXB0eSkgeworCQkJCWRlbGVnYXRlLmFkZEVycm9yKCcnJ6tkZWxlZ2F0ZS50eXBlLnNpbXBsZU5hbWW7IGFuZCCrZGVjbGFyaW5nVHlwZS5zaW1wbGVOYW1luyBoYXZlIG5vIGludGVyZmFjZXMgaW4gY29tbW9uJycnKQorCQkJCXZhbGlkID0gZmFsc2UKKwkJCX0KKwkJCXZhbGlkCisJCX0KKworCQlkZWYgZ2V0RGVsZWdhdGVzKFR5cGVEZWNsYXJhdGlvbiBpdCkgeworCQkJZGVjbGFyZWRNZW1iZXJzLmZpbHRlcltmaW5kQW5ub3RhdGlvbihmaW5kVHlwZUdsb2JhbGx5KERlbGVnYXRlKSkgIT09IG51bGxdCisJCX0KKwkJCisJCWRlZiBsaXN0ZWRJbnRlcmZhY2VzKE1lbWJlckRlY2xhcmF0aW9uIGl0KSB7CisJCQlmaW5kQW5ub3RhdGlvbihmaW5kVHlwZUdsb2JhbGx5KERlbGVnYXRlKSkuZ2V0Q2xhc3NBcnJheVZhbHVlKCJ2YWx1ZSIpLnRvU2V0CisJCX0KKworCQlkZWYgU2V0PFR5cGVSZWZlcmVuY2U+IGdldEltcGxlbWVudGVkSW50ZXJmYWNlcyhUeXBlUmVmZXJlbmNlIGl0KSB7CisJCQl2YWwgc2VlbiA9IG5ld0xpbmtlZEhhc2hTZXQKKwkJCWNvbGxlY3RBbGxTdXBlclR5cGVzKHNlZW4pCisJCQlzZWVuLmZpbHRlclt0eXBlIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb25dLnRvU2V0CisJCX0KKwkJCisJCXByaXZhdGUgZGVmIHZvaWQgY29sbGVjdEFsbFN1cGVyVHlwZXMoVHlwZVJlZmVyZW5jZSBpdCwgU2V0PFR5cGVSZWZlcmVuY2U+IHNlZW4pIHsKKwkJCXZhbCBjeWNsZSA9ICFzZWVuLmFkZChpdCkKKwkJCWlmIChjeWNsZSkKKwkJCQlyZXR1cm47CisJCQlkZWNsYXJlZFN1cGVyVHlwZXMuZm9yRWFjaFtjb2xsZWN0QWxsU3VwZXJUeXBlcyhzZWVuKV0KKwkJfQorCisJCWRlZiBnZXREZWxlZ2F0ZWRJbnRlcmZhY2VzKE1lbWJlckRlY2xhcmF0aW9uIGRlbGVnYXRlKSB7CisJCQl2YWwgaW50ZXJmYWNlc09mRGVjbGFyaW5nVHlwZSA9IGRlbGVnYXRlLmRlY2xhcmluZ1R5cGUubmV3U2VsZlR5cGVSZWZlcmVuY2UuaW1wbGVtZW50ZWRJbnRlcmZhY2VzCisJCQl2YWwgbGlzdGVkSW50ZXJmYWNlcyA9IGRlbGVnYXRlLmxpc3RlZEludGVyZmFjZXMKKwkJCXZhbCBhdmFpbGFibGVJbnRlcmZhY2VzID0gZGVsZWdhdGUudHlwZS5pbXBsZW1lbnRlZEludGVyZmFjZXMKKwkJCWF2YWlsYWJsZUludGVyZmFjZXMuZmlsdGVyW2lmYWNlfAorCQkJCWludGVyZmFjZXNPZkRlY2xhcmluZ1R5cGUuY29udGFpbnMoaWZhY2UpCisJCQkJJiYgKGxpc3RlZEludGVyZmFjZXMuZW1wdHkgfHwgbGlzdGVkSW50ZXJmYWNlcy5leGlzdHNbaWZhY2UuaXNBc3NpZ25hYmxlRnJvbShpdCldKQorCQkJXS50b1NldAorCQl9CisKKwkJZGVmIGdldE1ldGhvZHNUb0ltcGxlbWVudChNZW1iZXJEZWNsYXJhdGlvbiBkZWxlZ2F0ZSkgeworCQkJZGVsZWdhdGUuZGVsZWdhdGVkSW50ZXJmYWNlcy5tYXBbZGVjbGFyZWRSZXNvbHZlZE1ldGhvZHNdLmZsYXR0ZW4KKwkJCQkuZmlsdGVyW2RlbGVnYXRlLmRlY2xhcmluZ1R5cGUuZmluZERlY2xhcmVkTWV0aG9kKGRlY2xhcmF0aW9uLnNpbXBsZU5hbWUsIHJlc29sdmVkUGFyYW1ldGVycy5tYXBbcmVzb2x2ZWRUeXBlXSkgPT09IG51bGxdCisJCQkJLmZpbHRlclshaXNPYmplY3RNZXRob2RdCisJCQkJLmZpbHRlclshaXNTdGF0aWNdCisJCQkJLmdyb3VwQnlbc2ltcGxlU2lnbmF0dXJlXS52YWx1ZXMubWFwW2hlYWRdCisJCQkJLnNvcnRCeVtzaW1wbGVTaWduYXR1cmVdCisJCQkJLnRvU2V0CisJCX0KKwkKKwkJZGVmIGlzT2JqZWN0TWV0aG9kKFJlc29sdmVkTWV0aG9kIGl0KSB7CisJCQl2YWwgbmFtZSA9IGRlY2xhcmF0aW9uLnNpbXBsZU5hbWUKKwkJCXZhbCBwYXJhbWV0ZXJUeXBlcyA9IHJlc29sdmVkUGFyYW1ldGVycy5tYXBbcmVzb2x2ZWRUeXBlXS50b0xpc3QKKwkJCQorCQkJbmFtZSA9PSAiaGFzaENvZGUiICYmIHBhcmFtZXRlclR5cGVzLmVtcHR5CisJCQl8fCBuYW1lID09ICJ0b1N0cmluZyIgJiYgcGFyYW1ldGVyVHlwZXMuZW1wdHkKKwkJCXx8IG5hbWUgPT0gImVxdWFscyIgJiYgcGFyYW1ldGVyVHlwZXMgPT0gI1tvYmplY3RdCisJCQl8fCBuYW1lID09ICJmaW5hbGl6ZSIgJiYgcGFyYW1ldGVyVHlwZXMuZW1wdHkKKwkJCXx8IG5hbWUgPT0gImNsb25lIiAmJiBwYXJhbWV0ZXJUeXBlcy5lbXB0eQorCQl9CisKKwkJZGVmIGlzU3RhdGljKFJlc29sdmVkTWV0aG9kIGl0KSB7CisJCQlkZWNsYXJhdGlvbi5pc1N0YXRpYworCQl9CisKKwkJZGVmIGltcGxlbWVudE1ldGhvZChNdXRhYmxlTWVtYmVyRGVjbGFyYXRpb24gZGVsZWdhdGUsIFJlc29sdmVkTWV0aG9kIHJlc29sdmVkTWV0aG9kKSB7CisJCQlkZWxlZ2F0ZS5tYXJrQXNSZWFkCisJCQl2YWwgZGVjbGFyYXRpb24gPSByZXNvbHZlZE1ldGhvZC5kZWNsYXJhdGlvbgorCQkJZGVsZWdhdGUuZGVjbGFyaW5nVHlwZS5hZGRNZXRob2QoZGVjbGFyYXRpb24uc2ltcGxlTmFtZSkgWyBpbXBsIHwKKwkJCQlpbXBsLnByaW1hcnlTb3VyY2VFbGVtZW50ID0gZGVsZWdhdGUucHJpbWFyeVNvdXJjZUVsZW1lbnQKKwkJCQl2YWwgdHlwZVBhcmFtZXRlck1hcHBpbmdzID0gbmV3SGFzaE1hcAorCQkJCXJlc29sdmVkTWV0aG9kLnJlc29sdmVkVHlwZVBhcmFtZXRlcnMuZm9yRWFjaFtwYXJhbXwKKwkJCQkJdmFsIGNvcHkgPSBpbXBsLmFkZFR5cGVQYXJhbWV0ZXIocGFyYW0uZGVjbGFyYXRpb24uc2ltcGxlTmFtZSwgcGFyYW0ucmVzb2x2ZWRVcHBlckJvdW5kcykKKwkJCQkJdHlwZVBhcmFtZXRlck1hcHBpbmdzLnB1dChwYXJhbS5kZWNsYXJhdGlvbi5uZXdUeXBlUmVmZXJlbmNlLCBjb3B5Lm5ld1R5cGVSZWZlcmVuY2UpCisJCQkJCWNvcHkudXBwZXJCb3VuZHMgPSBjb3B5LnVwcGVyQm91bmRzLm1hcFtyZXBsYWNlKHR5cGVQYXJhbWV0ZXJNYXBwaW5ncyldCisJCQkJXQorCQkJCWltcGwuZXhjZXB0aW9ucyA9IHJlc29sdmVkTWV0aG9kLnJlc29sdmVkRXhjZXB0aW9uVHlwZXMubWFwW3JlcGxhY2UodHlwZVBhcmFtZXRlck1hcHBpbmdzKV0KKwkJCQlpbXBsLnZhckFyZ3MgPSBkZWNsYXJhdGlvbi52YXJBcmdzCisJCQkJaW1wbC5yZXR1cm5UeXBlID0gcmVzb2x2ZWRNZXRob2QucmVzb2x2ZWRSZXR1cm5UeXBlLnJlcGxhY2UodHlwZVBhcmFtZXRlck1hcHBpbmdzKQorCQkJCXJlc29sdmVkTWV0aG9kLnJlc29sdmVkUGFyYW1ldGVycy5mb3JFYWNoW3B8aW1wbC5hZGRQYXJhbWV0ZXIocC5kZWNsYXJhdGlvbi5zaW1wbGVOYW1lLCBwLnJlc29sdmVkVHlwZS5yZXBsYWNlKHR5cGVQYXJhbWV0ZXJNYXBwaW5ncykpXQorCQkJCWltcGwuYm9keSA9ICcnJworCQkJCQmrcmVzb2x2ZWRNZXRob2QucmV0dXJuSWZOZWVkZWS7q2RlbGVnYXRlLmRlbGVnYXRlQWNjZXNzKGRlY2xhcmF0aW9uKbsuq2RlY2xhcmF0aW9uLnNpbXBsZU5hbWW7KKtkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLmpvaW4oIiwgIilbc2ltcGxlTmFtZV27KTsKKwkJCQknJycKKwkJCV0KKwkJfQorCQkKKwkJZGVmIFR5cGVSZWZlcmVuY2UgcmVwbGFjZShUeXBlUmVmZXJlbmNlIHRhcmdldCwgTWFwPD8gZXh0ZW5kcyBUeXBlUmVmZXJlbmNlLCA/IGV4dGVuZHMgVHlwZVJlZmVyZW5jZT4gbWFwcGluZ3MpIHsKKwkJCW1hcHBpbmdzLmVudHJ5U2V0LmZvbGQodGFyZ2V0KVtyZXN1bHQsIG1hcHBpbmd8cmVzdWx0LnJlcGxhY2UobWFwcGluZy5rZXksIG1hcHBpbmcudmFsdWUpXQorCQl9CisJCQorCQlkZWYgVHlwZVJlZmVyZW5jZSByZXBsYWNlKFR5cGVSZWZlcmVuY2UgdGFyZ2V0LCBUeXBlUmVmZXJlbmNlIG9sZFR5cGUsIFR5cGVSZWZlcmVuY2UgbmV3VHlwZSkgeworCQkJaWYgKHRhcmdldCA9PSBvbGRUeXBlKQorCQkJCXJldHVybiBuZXdUeXBlCisJCQlpZiAoIXRhcmdldC5hY3R1YWxUeXBlQXJndW1lbnRzLmlzRW1wdHkpCisJCQkJcmV0dXJuIG5ld1R5cGVSZWZlcmVuY2UodGFyZ2V0LnR5cGUsIHRhcmdldC5hY3R1YWxUeXBlQXJndW1lbnRzLm1hcFtyZXBsYWNlKG9sZFR5cGUsIG5ld1R5cGUpXSkKKwkJCWlmICh0YXJnZXQud2lsZENhcmQpIHsKKwkJCQlpZiAodGFyZ2V0LnVwcGVyQm91bmQgIT0gb2JqZWN0KQorCQkJCQlyZXR1cm4gdGFyZ2V0LnVwcGVyQm91bmQucmVwbGFjZShvbGRUeXBlLCBuZXdUeXBlKS5uZXdXaWxkY2FyZFR5cGVSZWZlcmVuY2UKKwkJCQllbHNlIGlmICghdGFyZ2V0Lmxvd2VyQm91bmQuaXNBbnlUeXBlKQorCQkJCQlyZXR1cm4gdGFyZ2V0Lmxvd2VyQm91bmQucmVwbGFjZShvbGRUeXBlLCBuZXdUeXBlKS5uZXdXaWxkY2FyZFR5cGVSZWZlcmVuY2VXaXRoTG93ZXJCb3VuZAorCQkJfQorCQkJaWYgKHRhcmdldC5pc0FycmF5KQorCQkJCXJldHVybiB0YXJnZXQuYXJyYXlDb21wb25lbnRUeXBlLnJlcGxhY2Uob2xkVHlwZSwgbmV3VHlwZSkubmV3QXJyYXlUeXBlUmVmZXJlbmNlCisJCQlyZXR1cm4gdGFyZ2V0CisJCX0KKwkJCisJCWRlZiBkaXNwYXRjaCBkZWxlZ2F0ZUFjY2VzcyhGaWVsZERlY2xhcmF0aW9uIGl0LCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpIHsKKwkJCScnJ3RoaXMuq3NpbXBsZU5hbWW7JycnCisJCX0KKworCQlkZWYgZGlzcGF0Y2ggZGVsZWdhdGVBY2Nlc3MoTWV0aG9kRGVjbGFyYXRpb24gaXQsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCkgeworCQkJc3dpdGNoIHBhcmFtZXRlcnMubWFwW3R5cGVdLnRvTGlzdCB7CisJCQkJY2FzZSAjW106IAorCQkJCQknJyd0aGlzLqtzaW1wbGVOYW1luygpJycnCisJCQkJY2FzZSAjW3N0cmluZ106IAorCQkJCQknJyd0aGlzLqtzaW1wbGVOYW1luygiq21ldGhvZC5zaW1wbGVOYW1luyIpJycnCisJCQkJY2FzZSAjW3N0cmluZywgQ2xhc3MubmV3VHlwZVJlZmVyZW5jZShuZXdXaWxkY2FyZFR5cGVSZWZlcmVuY2UpLm5ld0FycmF5VHlwZVJlZmVyZW5jZSwgb2JqZWN0Lm5ld0FycmF5VHlwZVJlZmVyZW5jZV06IHsKKwkJCQkJJycndGhpcy6rc2ltcGxlTmFtZbsoIqttZXRob2Quc2ltcGxlTmFtZbsiLCBuZXcgQ2xhc3NbXXurbWV0aG9kLnBhcmFtZXRlcnMuam9pbigiLCAiKVt0eXBlLnR5cGUuc2ltcGxlTmFtZSArICIuY2xhc3MiXbt9LCBuZXcgT2JqZWN0W117q21ldGhvZC5wYXJhbWV0ZXJzLmpvaW4oIiwgIilbc2ltcGxlTmFtZV27fSknJycKKwkJCQl9CisJCQkJZGVmYXVsdDoKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVsZWdhdGUgc2lnbmF0dXJlIikKKwkJCX0KKwkJfQorCisJCWRlZiByZXR1cm5JZk5lZWRlZChSZXNvbHZlZE1ldGhvZCBpdCkgeworCQkJaWYocmVzb2x2ZWRSZXR1cm5UeXBlLmlzVm9pZCkgIiIgZWxzZSAicmV0dXJuICIKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvRGVsZWdhdGVQcm9jZXNzb3IuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0RlbGVnYXRlUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4ZjBiNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0RlbGVnYXRlUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw1NjYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLlRyYW5zZm9ybWF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uVHJhbnNmb3JtYXRpb25QYXJ0aWNpcGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uQW5ub3RhdGlvblJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uSW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTXV0YWJsZU1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLlBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5SZXNvbHZlZE1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uUmVzb2x2ZWRQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLlJlc29sdmVkVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5UeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kMi5saWIuU3RyaW5nQ29uY2F0ZW5hdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkNvbGxlY3Rpb25MaXRlcmFsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuQ29udmVyc2lvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuSXRlcmFibGVFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5MaXN0RXh0ZW5zaW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlcy5Qcm9jZWR1cmUxOworCisvKioKKyAqIEBzaW5jZSAyLjcKKyAqIEBub2V4dGVuZAorICogQG5vcmVmZXJlbmNlCisgKi8KK0BCZXRhCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBEZWxlZ2F0ZVByb2Nlc3NvciBpbXBsZW1lbnRzIFRyYW5zZm9ybWF0aW9uUGFydGljaXBhbnQ8TXV0YWJsZU1lbWJlckRlY2xhcmF0aW9uPiB7CisgIC8qKgorICAgKiBAc2luY2UgMi43CisgICAqIEBub2V4dGVuZAorICAgKiBAbm9yZWZlcmVuY2UKKyAgICovCisgIEBCZXRhCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVXRpbCB7CisgICAgQEV4dGVuc2lvbgorICAgIHByaXZhdGUgVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQ7CisgICAgCisgICAgcHVibGljIFV0aWwoZmluYWwgVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKyAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBib29sZWFuIF9pc1ZhbGlkRGVsZWdhdGUoZmluYWwgRmllbGREZWNsYXJhdGlvbiBpdCkgeworICAgICAgcmV0dXJuICgodGhpcy5oYXNWYWxpZFR5cGUoaXQpICYmICghdGhpcy5oYXNEZWxlZ2F0aW9uQ29uZmxpY3RzKGl0KSkpICYmIHRoaXMuYXJlTGlzdGVkSW50ZXJmYWNlc1ZhbGlkKGl0KSk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBib29sZWFuIF9pc1ZhbGlkRGVsZWdhdGUoZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gaXQpIHsKKyAgICAgIHJldHVybiAoKCh0aGlzLmhhc1ZhbGlkVHlwZShpdCkgJiYgdGhpcy5oYXNWYWxpZFNpZ25hdHVyZShpdCkpICYmICghdGhpcy5oYXNEZWxlZ2F0aW9uQ29uZmxpY3RzKGl0KSkpICYmIHRoaXMuYXJlTGlzdGVkSW50ZXJmYWNlc1ZhbGlkKGl0KSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGhhc1ZhbGlkVHlwZShmaW5hbCBNZW1iZXJEZWNsYXJhdGlvbiBpdCkgeworICAgICAgYm9vbGVhbiBfeGlmZXhwcmVzc2lvbiA9IGZhbHNlOworICAgICAgaWYgKCgodGhpcy5nZXRUeXBlKGl0KSA9PSBudWxsKSB8fCB0aGlzLmdldFR5cGUoaXQpLmlzSW5mZXJyZWQoKSkpIHsKKyAgICAgICAgYm9vbGVhbiBfeGJsb2NrZXhwcmVzc2lvbiA9IGZhbHNlOworICAgICAgICB7CisgICAgICAgICAgdGhpcy5jb250ZXh0LmFkZEVycm9yKGl0LCAiQ2Fubm90IHVzZSBpbmZlcnJlZCB0eXBlcyBvbiBkZWxlZ2F0ZXMiKTsKKyAgICAgICAgICBfeGJsb2NrZXhwcmVzc2lvbiA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIF94aWZleHByZXNzaW9uID0gX3hibG9ja2V4cHJlc3Npb247CisgICAgICB9IGVsc2UgeworICAgICAgICBfeGlmZXhwcmVzc2lvbiA9IHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gX3hpZmV4cHJlc3Npb247CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBUeXBlUmVmZXJlbmNlIF9nZXRUeXBlKGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gaXQpIHsKKyAgICAgIHJldHVybiBpdC5nZXRUeXBlKCk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBUeXBlUmVmZXJlbmNlIF9nZXRUeXBlKGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIGl0KSB7CisgICAgICByZXR1cm4gaXQuZ2V0UmV0dXJuVHlwZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNWYWxpZFNpZ25hdHVyZShmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBpdCkgeworICAgICAgYm9vbGVhbiBfc3dpdGNoUmVzdWx0ID0gZmFsc2U7CisgICAgICBmaW5hbCBGdW5jdGlvbjE8UGFyYW1ldGVyRGVjbGFyYXRpb24sIFR5cGVSZWZlcmVuY2U+IF9mdW5jdGlvbiA9IChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBpdF8xKSAtPiB7CisgICAgICAgIHJldHVybiBpdF8xLmdldFR5cGUoKTsKKyAgICAgIH07CisgICAgICBMaXN0PFR5cGVSZWZlcmVuY2U+IF9saXN0ID0gSXRlcmFibGVFeHRlbnNpb25zLjxUeXBlUmVmZXJlbmNlPnRvTGlzdChJdGVyYWJsZUV4dGVuc2lvbnMubWFwKGl0LmdldFBhcmFtZXRlcnMoKSwgX2Z1bmN0aW9uKSk7CisgICAgICBib29sZWFuIF9tYXRjaGVkID0gZmFsc2U7CisgICAgICBpZiAoT2JqZWN0cy5lcXVhbChfbGlzdCwgQ29sbGVjdGlvbnMuPE9iamVjdD51bm1vZGlmaWFibGVMaXN0KENvbGxlY3Rpb25MaXRlcmFscy48T2JqZWN0Pm5ld0FycmF5TGlzdCgpKSkpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgICAgVHlwZVJlZmVyZW5jZSBfc3RyaW5nID0gdGhpcy5jb250ZXh0LmdldFN0cmluZygpOworICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbChfbGlzdCwgQ29sbGVjdGlvbnMuPFR5cGVSZWZlcmVuY2U+dW5tb2RpZmlhYmxlTGlzdChDb2xsZWN0aW9uTGl0ZXJhbHMuPFR5cGVSZWZlcmVuY2U+bmV3QXJyYXlMaXN0KF9zdHJpbmcpKSkpIHsKKyAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICAgIFR5cGVSZWZlcmVuY2UgX3N0cmluZ18xID0gdGhpcy5jb250ZXh0LmdldFN0cmluZygpOworICAgICAgICBUeXBlUmVmZXJlbmNlIF9uZXdBcnJheVR5cGVSZWZlcmVuY2UgPSB0aGlzLmNvbnRleHQubmV3QXJyYXlUeXBlUmVmZXJlbmNlKHRoaXMuY29udGV4dC5uZXdUeXBlUmVmZXJlbmNlKENsYXNzLmNsYXNzLCB0aGlzLmNvbnRleHQubmV3V2lsZGNhcmRUeXBlUmVmZXJlbmNlKCkpKTsKKyAgICAgICAgVHlwZVJlZmVyZW5jZSBfbmV3QXJyYXlUeXBlUmVmZXJlbmNlXzEgPSB0aGlzLmNvbnRleHQubmV3QXJyYXlUeXBlUmVmZXJlbmNlKHRoaXMuY29udGV4dC5nZXRPYmplY3QoKSk7CisgICAgICAgIGlmIChPYmplY3RzLmVxdWFsKF9saXN0LCBDb2xsZWN0aW9ucy48VHlwZVJlZmVyZW5jZT51bm1vZGlmaWFibGVMaXN0KENvbGxlY3Rpb25MaXRlcmFscy48VHlwZVJlZmVyZW5jZT5uZXdBcnJheUxpc3QoX3N0cmluZ18xLCBfbmV3QXJyYXlUeXBlUmVmZXJlbmNlLCBfbmV3QXJyYXlUeXBlUmVmZXJlbmNlXzEpKSkpIHsKKyAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoX21hdGNoZWQpIHsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRydWU7CisgICAgICB9CisgICAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICAgIGJvb2xlYW4gX3hibG9ja2V4cHJlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgeworICAgICAgICAgIHRoaXMuY29udGV4dC5hZGRFcnJvcihpdCwgIk5vdCBhIHZhbGlkIGRlbGVnYXRlIHNpZ25hdHVyZSwgdXNlICgpIG9yIChTdHJpbmcgbWV0aG9kTmFtZSkgb3IgKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIGFyZ3VtZW50VHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cykiKTsKKyAgICAgICAgICBfeGJsb2NrZXhwcmVzc2lvbiA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSBfeGJsb2NrZXhwcmVzc2lvbjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfc3dpdGNoUmVzdWx0OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNEZWxlZ2F0aW9uQ29uZmxpY3RzKGZpbmFsIE1lbWJlckRlY2xhcmF0aW9uIGRlbGVnYXRlKSB7CisgICAgICBib29sZWFuIF94YmxvY2tleHByZXNzaW9uID0gZmFsc2U7CisgICAgICB7CisgICAgICAgIGJvb2xlYW4gY29uZmxpY3QgPSBmYWxzZTsKKyAgICAgICAgSXRlcmFibGU8PyBleHRlbmRzIE1lbWJlckRlY2xhcmF0aW9uPiBfb3RoZXJEZWxlZ2F0ZXMgPSB0aGlzLm90aGVyRGVsZWdhdGVzKGRlbGVnYXRlKTsKKyAgICAgICAgZm9yIChmaW5hbCBNZW1iZXJEZWNsYXJhdGlvbiBvdGhlciA6IF9vdGhlckRlbGVnYXRlcykgeworICAgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFNldDxUeXBlUmVmZXJlbmNlPiBvdGhlckludGVyZmFjZXMgPSB0aGlzLmdldERlbGVnYXRlZEludGVyZmFjZXMob3RoZXIpOworICAgICAgICAgICAgU2V0PFR5cGVSZWZlcmVuY2U+IF9kZWxlZ2F0ZWRJbnRlcmZhY2VzID0gdGhpcy5nZXREZWxlZ2F0ZWRJbnRlcmZhY2VzKGRlbGVnYXRlKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgVHlwZVJlZmVyZW5jZSBpZmFjZSA6IF9kZWxlZ2F0ZWRJbnRlcmZhY2VzKSB7CisgICAgICAgICAgICAgIGJvb2xlYW4gX2NvbnRhaW5zID0gb3RoZXJJbnRlcmZhY2VzLmNvbnRhaW5zKGlmYWNlKTsKKyAgICAgICAgICAgICAgaWYgKF9jb250YWlucykgeworICAgICAgICAgICAgICAgIGNvbmZsaWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlRoZSBpbnRlcmZhY2UgIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lID0gaWZhY2UuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfc2ltcGxlTmFtZSk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgaXMgYWxzbyBpbXBsZW1lbnRlZCBieSB0aGUgZGVsZWdhdGUgIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lXzEgPSBvdGhlci5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lXzEpOworICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hZGRFcnJvcihkZWxlZ2F0ZSwgX2J1aWxkZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX3hibG9ja2V4cHJlc3Npb24gPSBjb25mbGljdDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfeGJsb2NrZXhwcmVzc2lvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIEl0ZXJhYmxlPD8gZXh0ZW5kcyBNZW1iZXJEZWNsYXJhdGlvbj4gb3RoZXJEZWxlZ2F0ZXMoZmluYWwgTWVtYmVyRGVjbGFyYXRpb24gZGVsZWdhdGUpIHsKKyAgICAgIGZpbmFsIEZ1bmN0aW9uMTxNZW1iZXJEZWNsYXJhdGlvbiwgQm9vbGVhbj4gX2Z1bmN0aW9uID0gKE1lbWJlckRlY2xhcmF0aW9uIGl0KSAtPiB7CisgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKCFPYmplY3RzLmVxdWFsKGl0LCBkZWxlZ2F0ZSkpKTsKKyAgICAgIH07CisgICAgICByZXR1cm4gSXRlcmFibGVFeHRlbnNpb25zLmZpbHRlcih0aGlzLmdldERlbGVnYXRlcyhkZWxlZ2F0ZS5nZXREZWNsYXJpbmdUeXBlKCkpLCBfZnVuY3Rpb24pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBhcmVMaXN0ZWRJbnRlcmZhY2VzVmFsaWQoZmluYWwgTWVtYmVyRGVjbGFyYXRpb24gZGVsZWdhdGUpIHsKKyAgICAgIGJvb2xlYW4gX3hibG9ja2V4cHJlc3Npb24gPSBmYWxzZTsKKyAgICAgIHsKKyAgICAgICAgZmluYWwgVHlwZVJlZmVyZW5jZSBkZWNsYXJpbmdUeXBlID0gdGhpcy5jb250ZXh0Lm5ld1NlbGZUeXBlUmVmZXJlbmNlKGRlbGVnYXRlLmdldERlY2xhcmluZ1R5cGUoKSk7CisgICAgICAgIGZpbmFsIFNldDxUeXBlUmVmZXJlbmNlPiBpbnRlcmZhY2VzT2ZEZWNsYXJpbmdUeXBlID0gdGhpcy5nZXRJbXBsZW1lbnRlZEludGVyZmFjZXMoZGVjbGFyaW5nVHlwZSk7CisgICAgICAgIGZpbmFsIFNldDxUeXBlUmVmZXJlbmNlPiBhdmFpbGFibGVJbnRlcmZhY2VzID0gdGhpcy5nZXRJbXBsZW1lbnRlZEludGVyZmFjZXModGhpcy5nZXRUeXBlKGRlbGVnYXRlKSk7CisgICAgICAgIGZpbmFsIFNldDxUeXBlUmVmZXJlbmNlPiBsaXN0ZWRJbnRlcmZhY2VzID0gdGhpcy5saXN0ZWRJbnRlcmZhY2VzKGRlbGVnYXRlKTsKKyAgICAgICAgYm9vbGVhbiB2YWxpZCA9IHRydWU7CisgICAgICAgIGZvciAoZmluYWwgVHlwZVJlZmVyZW5jZSBpZmFjZSA6IGxpc3RlZEludGVyZmFjZXMpIHsKKyAgICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBGdW5jdGlvbjE8VHlwZVJlZmVyZW5jZSwgQm9vbGVhbj4gX2Z1bmN0aW9uID0gKFR5cGVSZWZlcmVuY2UgaXQpIC0+IHsKKyAgICAgICAgICAgICAgVHlwZSBfdHlwZSA9IGl0LmdldFR5cGUoKTsKKyAgICAgICAgICAgICAgVHlwZSBfdHlwZV8xID0gaWZhY2UuZ2V0VHlwZSgpOworICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKE9iamVjdHMuZXF1YWwoX3R5cGUsIF90eXBlXzEpKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBib29sZWFuIF9leGlzdHMgPSBJdGVyYWJsZUV4dGVuc2lvbnMuPFR5cGVSZWZlcmVuY2U+ZXhpc3RzKGF2YWlsYWJsZUludGVyZmFjZXMsIF9mdW5jdGlvbik7CisgICAgICAgICAgICBib29sZWFuIF9ub3QgPSAoIV9leGlzdHMpOworICAgICAgICAgICAgaWYgKF9ub3QpIHsKKyAgICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZSA9IHRoaXMuZ2V0VHlwZShkZWxlZ2F0ZSkuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWUpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiBkb2VzIG5vdCBpbXBsZW1lbnQgIik7CisgICAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZV8xID0gaWZhY2UuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWVfMSk7CisgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hZGRFcnJvcihkZWxlZ2F0ZSwgX2J1aWxkZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBGdW5jdGlvbjE8VHlwZVJlZmVyZW5jZSwgQm9vbGVhbj4gX2Z1bmN0aW9uXzEgPSAoVHlwZVJlZmVyZW5jZSBpdCkgLT4geworICAgICAgICAgICAgICBUeXBlIF90eXBlID0gaXQuZ2V0VHlwZSgpOworICAgICAgICAgICAgICBUeXBlIF90eXBlXzEgPSBpZmFjZS5nZXRUeXBlKCk7CisgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoT2JqZWN0cy5lcXVhbChfdHlwZSwgX3R5cGVfMSkpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGJvb2xlYW4gX2V4aXN0c18xID0gSXRlcmFibGVFeHRlbnNpb25zLjxUeXBlUmVmZXJlbmNlPmV4aXN0cyhpbnRlcmZhY2VzT2ZEZWNsYXJpbmdUeXBlLCBfZnVuY3Rpb25fMSk7CisgICAgICAgICAgICBib29sZWFuIF9ub3RfMSA9ICghX2V4aXN0c18xKTsKKyAgICAgICAgICAgIGlmIChfbm90XzEpIHsKKyAgICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8xID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lXzIgPSBkZWNsYXJpbmdUeXBlLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoX3NpbXBsZU5hbWVfMik7CisgICAgICAgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCIgZG9lcyBub3QgaW1wbGVtZW50ICIpOworICAgICAgICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWVfMyA9IGlmYWNlLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoX3NpbXBsZU5hbWVfMyk7CisgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hZGRFcnJvcihkZWxlZ2F0ZSwgX2J1aWxkZXJfMS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChsaXN0ZWRJbnRlcmZhY2VzLmlzRW1wdHkoKSAmJiBTZXRzLjxUeXBlUmVmZXJlbmNlPmludGVyc2VjdGlvbihpbnRlcmZhY2VzT2ZEZWNsYXJpbmdUeXBlLCBhdmFpbGFibGVJbnRlcmZhY2VzKS5pc0VtcHR5KCkpKSB7CisgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lID0gdGhpcy5nZXRUeXBlKGRlbGVnYXRlKS5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiBhbmQgIik7CisgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lXzEgPSBkZWNsYXJpbmdUeXBlLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWVfMSk7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgaGF2ZSBubyBpbnRlcmZhY2VzIGluIGNvbW1vbiIpOworICAgICAgICAgIHRoaXMuY29udGV4dC5hZGRFcnJvcihkZWxlZ2F0ZSwgX2J1aWxkZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBfeGJsb2NrZXhwcmVzc2lvbiA9IHZhbGlkOworICAgICAgfQorICAgICAgcmV0dXJuIF94YmxvY2tleHByZXNzaW9uOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgSXRlcmFibGU8PyBleHRlbmRzIE1lbWJlckRlY2xhcmF0aW9uPiBnZXREZWxlZ2F0ZXMoZmluYWwgVHlwZURlY2xhcmF0aW9uIGl0KSB7CisgICAgICBmaW5hbCBGdW5jdGlvbjE8TWVtYmVyRGVjbGFyYXRpb24sIEJvb2xlYW4+IF9mdW5jdGlvbiA9IChNZW1iZXJEZWNsYXJhdGlvbiBpdF8xKSAtPiB7CisgICAgICAgIEFubm90YXRpb25SZWZlcmVuY2UgX2ZpbmRBbm5vdGF0aW9uID0gaXRfMS5maW5kQW5ub3RhdGlvbih0aGlzLmNvbnRleHQuZmluZFR5cGVHbG9iYWxseShEZWxlZ2F0ZS5jbGFzcykpOworICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKChfZmluZEFubm90YXRpb24gIT0gbnVsbCkpOworICAgICAgfTsKKyAgICAgIHJldHVybiBJdGVyYWJsZUV4dGVuc2lvbnMuZmlsdGVyKGl0LmdldERlY2xhcmVkTWVtYmVycygpLCBfZnVuY3Rpb24pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU2V0PFR5cGVSZWZlcmVuY2U+IGxpc3RlZEludGVyZmFjZXMoZmluYWwgTWVtYmVyRGVjbGFyYXRpb24gaXQpIHsKKyAgICAgIHJldHVybiBJdGVyYWJsZUV4dGVuc2lvbnMuPFR5cGVSZWZlcmVuY2U+dG9TZXQoKChJdGVyYWJsZTxUeXBlUmVmZXJlbmNlPilDb252ZXJzaW9ucy5kb1dyYXBBcnJheShpdC5maW5kQW5ub3RhdGlvbih0aGlzLmNvbnRleHQuZmluZFR5cGVHbG9iYWxseShEZWxlZ2F0ZS5jbGFzcykpLmdldENsYXNzQXJyYXlWYWx1ZSgidmFsdWUiKSkpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFNldDxUeXBlUmVmZXJlbmNlPiBnZXRJbXBsZW1lbnRlZEludGVyZmFjZXMoZmluYWwgVHlwZVJlZmVyZW5jZSBpdCkgeworICAgICAgU2V0PFR5cGVSZWZlcmVuY2U+IF94YmxvY2tleHByZXNzaW9uID0gbnVsbDsKKyAgICAgIHsKKyAgICAgICAgZmluYWwgTGlua2VkSGFzaFNldDxUeXBlUmVmZXJlbmNlPiBzZWVuID0gQ29sbGVjdGlvbkxpdGVyYWxzLjxUeXBlUmVmZXJlbmNlPm5ld0xpbmtlZEhhc2hTZXQoKTsKKyAgICAgICAgdGhpcy5jb2xsZWN0QWxsU3VwZXJUeXBlcyhpdCwgc2Vlbik7CisgICAgICAgIGZpbmFsIEZ1bmN0aW9uMTxUeXBlUmVmZXJlbmNlLCBCb29sZWFuPiBfZnVuY3Rpb24gPSAoVHlwZVJlZmVyZW5jZSBpdF8xKSAtPiB7CisgICAgICAgICAgVHlwZSBfdHlwZSA9IGl0XzEuZ2V0VHlwZSgpOworICAgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKF90eXBlIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24pKTsKKyAgICAgICAgfTsKKyAgICAgICAgX3hibG9ja2V4cHJlc3Npb24gPSBJdGVyYWJsZUV4dGVuc2lvbnMuPFR5cGVSZWZlcmVuY2U+dG9TZXQoSXRlcmFibGVFeHRlbnNpb25zLjxUeXBlUmVmZXJlbmNlPmZpbHRlcihzZWVuLCBfZnVuY3Rpb24pKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfeGJsb2NrZXhwcmVzc2lvbjsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGNvbGxlY3RBbGxTdXBlclR5cGVzKGZpbmFsIFR5cGVSZWZlcmVuY2UgaXQsIGZpbmFsIFNldDxUeXBlUmVmZXJlbmNlPiBzZWVuKSB7CisgICAgICBib29sZWFuIF9hZGQgPSBzZWVuLmFkZChpdCk7CisgICAgICBmaW5hbCBib29sZWFuIGN5Y2xlID0gKCFfYWRkKTsKKyAgICAgIGlmIChjeWNsZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBmaW5hbCBDb25zdW1lcjxUeXBlUmVmZXJlbmNlPiBfZnVuY3Rpb24gPSAoVHlwZVJlZmVyZW5jZSBpdF8xKSAtPiB7CisgICAgICAgIHRoaXMuY29sbGVjdEFsbFN1cGVyVHlwZXMoaXRfMSwgc2Vlbik7CisgICAgICB9OworICAgICAgaXQuZ2V0RGVjbGFyZWRTdXBlclR5cGVzKCkuZm9yRWFjaChfZnVuY3Rpb24pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU2V0PFR5cGVSZWZlcmVuY2U+IGdldERlbGVnYXRlZEludGVyZmFjZXMoZmluYWwgTWVtYmVyRGVjbGFyYXRpb24gZGVsZWdhdGUpIHsKKyAgICAgIFNldDxUeXBlUmVmZXJlbmNlPiBfeGJsb2NrZXhwcmVzc2lvbiA9IG51bGw7CisgICAgICB7CisgICAgICAgIGZpbmFsIFNldDxUeXBlUmVmZXJlbmNlPiBpbnRlcmZhY2VzT2ZEZWNsYXJpbmdUeXBlID0gdGhpcy5nZXRJbXBsZW1lbnRlZEludGVyZmFjZXModGhpcy5jb250ZXh0Lm5ld1NlbGZUeXBlUmVmZXJlbmNlKGRlbGVnYXRlLmdldERlY2xhcmluZ1R5cGUoKSkpOworICAgICAgICBmaW5hbCBTZXQ8VHlwZVJlZmVyZW5jZT4gbGlzdGVkSW50ZXJmYWNlcyA9IHRoaXMubGlzdGVkSW50ZXJmYWNlcyhkZWxlZ2F0ZSk7CisgICAgICAgIGZpbmFsIFNldDxUeXBlUmVmZXJlbmNlPiBhdmFpbGFibGVJbnRlcmZhY2VzID0gdGhpcy5nZXRJbXBsZW1lbnRlZEludGVyZmFjZXModGhpcy5nZXRUeXBlKGRlbGVnYXRlKSk7CisgICAgICAgIGZpbmFsIEZ1bmN0aW9uMTxUeXBlUmVmZXJlbmNlLCBCb29sZWFuPiBfZnVuY3Rpb24gPSAoVHlwZVJlZmVyZW5jZSBpZmFjZSkgLT4geworICAgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKGludGVyZmFjZXNPZkRlY2xhcmluZ1R5cGUuY29udGFpbnMoaWZhY2UpICYmIChsaXN0ZWRJbnRlcmZhY2VzLmlzRW1wdHkoKSB8fCBJdGVyYWJsZUV4dGVuc2lvbnMuPFR5cGVSZWZlcmVuY2U+ZXhpc3RzKGxpc3RlZEludGVyZmFjZXMsICgoRnVuY3Rpb24xPFR5cGVSZWZlcmVuY2UsIEJvb2xlYW4+KSAoVHlwZVJlZmVyZW5jZSBpdCkgLT4geworICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihpZmFjZS5pc0Fzc2lnbmFibGVGcm9tKGl0KSk7CisgICAgICAgICAgfSkpKSkpOworICAgICAgICB9OworICAgICAgICBfeGJsb2NrZXhwcmVzc2lvbiA9IEl0ZXJhYmxlRXh0ZW5zaW9ucy48VHlwZVJlZmVyZW5jZT50b1NldChJdGVyYWJsZUV4dGVuc2lvbnMuPFR5cGVSZWZlcmVuY2U+ZmlsdGVyKGF2YWlsYWJsZUludGVyZmFjZXMsIF9mdW5jdGlvbikpOworICAgICAgfQorICAgICAgcmV0dXJuIF94YmxvY2tleHByZXNzaW9uOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU2V0PFJlc29sdmVkTWV0aG9kPiBnZXRNZXRob2RzVG9JbXBsZW1lbnQoZmluYWwgTWVtYmVyRGVjbGFyYXRpb24gZGVsZWdhdGUpIHsKKyAgICAgIGZpbmFsIEZ1bmN0aW9uMTxUeXBlUmVmZXJlbmNlLCBJdGVyYWJsZTw/IGV4dGVuZHMgUmVzb2x2ZWRNZXRob2Q+PiBfZnVuY3Rpb24gPSAoVHlwZVJlZmVyZW5jZSBpdCkgLT4geworICAgICAgICByZXR1cm4gaXQuZ2V0RGVjbGFyZWRSZXNvbHZlZE1ldGhvZHMoKTsKKyAgICAgIH07CisgICAgICBmaW5hbCBGdW5jdGlvbjE8UmVzb2x2ZWRNZXRob2QsIEJvb2xlYW4+IF9mdW5jdGlvbl8xID0gKFJlc29sdmVkTWV0aG9kIGl0KSAtPiB7CisgICAgICAgIGZpbmFsIEZ1bmN0aW9uMTxSZXNvbHZlZFBhcmFtZXRlciwgVHlwZVJlZmVyZW5jZT4gX2Z1bmN0aW9uXzIgPSAoUmVzb2x2ZWRQYXJhbWV0ZXIgaXRfMSkgLT4geworICAgICAgICAgIHJldHVybiBpdF8xLmdldFJlc29sdmVkVHlwZSgpOworICAgICAgICB9OworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBfZmluZERlY2xhcmVkTWV0aG9kID0gZGVsZWdhdGUuZ2V0RGVjbGFyaW5nVHlwZSgpLmZpbmREZWNsYXJlZE1ldGhvZChpdC5nZXREZWNsYXJhdGlvbigpLmdldFNpbXBsZU5hbWUoKSwgKChUeXBlUmVmZXJlbmNlW10pQ29udmVyc2lvbnMudW53cmFwQXJyYXkoSXRlcmFibGVFeHRlbnNpb25zLm1hcChpdC5nZXRSZXNvbHZlZFBhcmFtZXRlcnMoKSwgX2Z1bmN0aW9uXzIpLCBUeXBlUmVmZXJlbmNlLmNsYXNzKSkpOworICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKChfZmluZERlY2xhcmVkTWV0aG9kID09IG51bGwpKTsKKyAgICAgIH07CisgICAgICBmaW5hbCBGdW5jdGlvbjE8UmVzb2x2ZWRNZXRob2QsIEJvb2xlYW4+IF9mdW5jdGlvbl8yID0gKFJlc29sdmVkTWV0aG9kIGl0KSAtPiB7CisgICAgICAgIGJvb2xlYW4gX2lzT2JqZWN0TWV0aG9kID0gdGhpcy5pc09iamVjdE1ldGhvZChpdCk7CisgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKCFfaXNPYmplY3RNZXRob2QpKTsKKyAgICAgIH07CisgICAgICBmaW5hbCBGdW5jdGlvbjE8UmVzb2x2ZWRNZXRob2QsIEJvb2xlYW4+IF9mdW5jdGlvbl8zID0gKFJlc29sdmVkTWV0aG9kIGl0KSAtPiB7CisgICAgICAgIGJvb2xlYW4gX2lzU3RhdGljID0gdGhpcy5pc1N0YXRpYyhpdCk7CisgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKCFfaXNTdGF0aWMpKTsKKyAgICAgIH07CisgICAgICBmaW5hbCBGdW5jdGlvbjE8UmVzb2x2ZWRNZXRob2QsIFN0cmluZz4gX2Z1bmN0aW9uXzQgPSAoUmVzb2x2ZWRNZXRob2QgaXQpIC0+IHsKKyAgICAgICAgcmV0dXJuIGl0LmdldFNpbXBsZVNpZ25hdHVyZSgpOworICAgICAgfTsKKyAgICAgIGZpbmFsIEZ1bmN0aW9uMTxMaXN0PFJlc29sdmVkTWV0aG9kPiwgUmVzb2x2ZWRNZXRob2Q+IF9mdW5jdGlvbl81ID0gKExpc3Q8UmVzb2x2ZWRNZXRob2Q+IGl0KSAtPiB7CisgICAgICAgIHJldHVybiBJdGVyYWJsZUV4dGVuc2lvbnMuPFJlc29sdmVkTWV0aG9kPmhlYWQoaXQpOworICAgICAgfTsKKyAgICAgIGZpbmFsIEZ1bmN0aW9uMTxSZXNvbHZlZE1ldGhvZCwgU3RyaW5nPiBfZnVuY3Rpb25fNiA9IChSZXNvbHZlZE1ldGhvZCBpdCkgLT4geworICAgICAgICByZXR1cm4gaXQuZ2V0U2ltcGxlU2lnbmF0dXJlKCk7CisgICAgICB9OworICAgICAgcmV0dXJuIEl0ZXJhYmxlRXh0ZW5zaW9ucy48UmVzb2x2ZWRNZXRob2Q+dG9TZXQoSXRlcmFibGVFeHRlbnNpb25zLjxSZXNvbHZlZE1ldGhvZCwgU3RyaW5nPnNvcnRCeShJdGVyYWJsZUV4dGVuc2lvbnMuPExpc3Q8UmVzb2x2ZWRNZXRob2Q+LCBSZXNvbHZlZE1ldGhvZD5tYXAoSXRlcmFibGVFeHRlbnNpb25zLjxTdHJpbmcsIFJlc29sdmVkTWV0aG9kPmdyb3VwQnkoSXRlcmFibGVFeHRlbnNpb25zLjxSZXNvbHZlZE1ldGhvZD5maWx0ZXIoSXRlcmFibGVFeHRlbnNpb25zLjxSZXNvbHZlZE1ldGhvZD5maWx0ZXIoSXRlcmFibGVFeHRlbnNpb25zLjxSZXNvbHZlZE1ldGhvZD5maWx0ZXIoSXRlcmFibGVzLjxSZXNvbHZlZE1ldGhvZD5jb25jYXQoSXRlcmFibGVFeHRlbnNpb25zLjxUeXBlUmVmZXJlbmNlLCBJdGVyYWJsZTw/IGV4dGVuZHMgUmVzb2x2ZWRNZXRob2Q+Pm1hcCh0aGlzLmdldERlbGVnYXRlZEludGVyZmFjZXMoZGVsZWdhdGUpLCBfZnVuY3Rpb24pKSwgX2Z1bmN0aW9uXzEpLCBfZnVuY3Rpb25fMiksIF9mdW5jdGlvbl8zKSwgX2Z1bmN0aW9uXzQpLnZhbHVlcygpLCBfZnVuY3Rpb25fNSksIF9mdW5jdGlvbl82KSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzT2JqZWN0TWV0aG9kKGZpbmFsIFJlc29sdmVkTWV0aG9kIGl0KSB7CisgICAgICBib29sZWFuIF94YmxvY2tleHByZXNzaW9uID0gZmFsc2U7CisgICAgICB7CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gaXQuZ2V0RGVjbGFyYXRpb24oKS5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIGZpbmFsIEZ1bmN0aW9uMTxSZXNvbHZlZFBhcmFtZXRlciwgVHlwZVJlZmVyZW5jZT4gX2Z1bmN0aW9uID0gKFJlc29sdmVkUGFyYW1ldGVyIGl0XzEpIC0+IHsKKyAgICAgICAgICByZXR1cm4gaXRfMS5nZXRSZXNvbHZlZFR5cGUoKTsKKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgTGlzdDxUeXBlUmVmZXJlbmNlPiBwYXJhbWV0ZXJUeXBlcyA9IEl0ZXJhYmxlRXh0ZW5zaW9ucy48VHlwZVJlZmVyZW5jZT50b0xpc3QoSXRlcmFibGVFeHRlbnNpb25zLm1hcChpdC5nZXRSZXNvbHZlZFBhcmFtZXRlcnMoKSwgX2Z1bmN0aW9uKSk7CisgICAgICAgIF94YmxvY2tleHByZXNzaW9uID0gKCgoKChPYmplY3RzLmVxdWFsKG5hbWUsICJoYXNoQ29kZSIpICYmIHBhcmFtZXRlclR5cGVzLmlzRW1wdHkoKSkgfHwgKE9iamVjdHMuZXF1YWwobmFtZSwgInRvU3RyaW5nIikgJiYgcGFyYW1ldGVyVHlwZXMuaXNFbXB0eSgpKSkgfHwgKE9iamVjdHMuZXF1YWwobmFtZSwgImVxdWFscyIpICYmIE9iamVjdHMuZXF1YWwocGFyYW1ldGVyVHlwZXMsIENvbGxlY3Rpb25zLjxUeXBlUmVmZXJlbmNlPnVubW9kaWZpYWJsZUxpc3QoQ29sbGVjdGlvbkxpdGVyYWxzLjxUeXBlUmVmZXJlbmNlPm5ld0FycmF5TGlzdCh0aGlzLmNvbnRleHQuZ2V0T2JqZWN0KCkpKSkpKSB8fCAoT2JqZWN0cy5lcXVhbChuYW1lLCAiZmluYWxpemUiKSAmJiBwYXJhbWV0ZXJUeXBlcy5pc0VtcHR5KCkpKSB8fCAoT2JqZWN0cy5lcXVhbChuYW1lLCAiY2xvbmUiKSAmJiBwYXJhbWV0ZXJUeXBlcy5pc0VtcHR5KCkpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfeGJsb2NrZXhwcmVzc2lvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoZmluYWwgUmVzb2x2ZWRNZXRob2QgaXQpIHsKKyAgICAgIHJldHVybiBpdC5nZXREZWNsYXJhdGlvbigpLmlzU3RhdGljKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNdXRhYmxlTWV0aG9kRGVjbGFyYXRpb24gaW1wbGVtZW50TWV0aG9kKGZpbmFsIE11dGFibGVNZW1iZXJEZWNsYXJhdGlvbiBkZWxlZ2F0ZSwgZmluYWwgUmVzb2x2ZWRNZXRob2QgcmVzb2x2ZWRNZXRob2QpIHsKKyAgICAgIE11dGFibGVNZXRob2REZWNsYXJhdGlvbiBfeGJsb2NrZXhwcmVzc2lvbiA9IG51bGw7CisgICAgICB7CisgICAgICAgIGRlbGVnYXRlLm1hcmtBc1JlYWQoKTsKKyAgICAgICAgZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSByZXNvbHZlZE1ldGhvZC5nZXREZWNsYXJhdGlvbigpOworICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPE11dGFibGVNZXRob2REZWNsYXJhdGlvbj4gX2Z1bmN0aW9uID0gKE11dGFibGVNZXRob2REZWNsYXJhdGlvbiBpbXBsKSAtPiB7CisgICAgICAgICAgdGhpcy5jb250ZXh0LnNldFByaW1hcnlTb3VyY2VFbGVtZW50KGltcGwsIHRoaXMuY29udGV4dC5nZXRQcmltYXJ5U291cmNlRWxlbWVudChkZWxlZ2F0ZSkpOworICAgICAgICAgIGZpbmFsIEhhc2hNYXA8VHlwZVJlZmVyZW5jZSwgVHlwZVJlZmVyZW5jZT4gdHlwZVBhcmFtZXRlck1hcHBpbmdzID0gQ29sbGVjdGlvbkxpdGVyYWxzLjxUeXBlUmVmZXJlbmNlLCBUeXBlUmVmZXJlbmNlPm5ld0hhc2hNYXAoKTsKKyAgICAgICAgICBmaW5hbCBDb25zdW1lcjxSZXNvbHZlZFR5cGVQYXJhbWV0ZXI+IF9mdW5jdGlvbl8xID0gKFJlc29sdmVkVHlwZVBhcmFtZXRlciBwYXJhbSkgLT4geworICAgICAgICAgICAgZmluYWwgTXV0YWJsZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiBjb3B5ID0gaW1wbC5hZGRUeXBlUGFyYW1ldGVyKHBhcmFtLmdldERlY2xhcmF0aW9uKCkuZ2V0U2ltcGxlTmFtZSgpLCAoKFR5cGVSZWZlcmVuY2VbXSlDb252ZXJzaW9ucy51bndyYXBBcnJheShwYXJhbS5nZXRSZXNvbHZlZFVwcGVyQm91bmRzKCksIFR5cGVSZWZlcmVuY2UuY2xhc3MpKSk7CisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyTWFwcGluZ3MucHV0KHRoaXMuY29udGV4dC5uZXdUeXBlUmVmZXJlbmNlKHBhcmFtLmdldERlY2xhcmF0aW9uKCkpLCB0aGlzLmNvbnRleHQubmV3VHlwZVJlZmVyZW5jZShjb3B5KSk7CisgICAgICAgICAgICBmaW5hbCBGdW5jdGlvbjE8VHlwZVJlZmVyZW5jZSwgVHlwZVJlZmVyZW5jZT4gX2Z1bmN0aW9uXzIgPSAoVHlwZVJlZmVyZW5jZSBpdCkgLT4geworICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlKGl0LCB0eXBlUGFyYW1ldGVyTWFwcGluZ3MpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNvcHkuc2V0VXBwZXJCb3VuZHMoSXRlcmFibGVFeHRlbnNpb25zLm1hcChjb3B5LmdldFVwcGVyQm91bmRzKCksIF9mdW5jdGlvbl8yKSk7CisgICAgICAgICAgfTsKKyAgICAgICAgICByZXNvbHZlZE1ldGhvZC5nZXRSZXNvbHZlZFR5cGVQYXJhbWV0ZXJzKCkuZm9yRWFjaChfZnVuY3Rpb25fMSk7CisgICAgICAgICAgZmluYWwgRnVuY3Rpb24xPFR5cGVSZWZlcmVuY2UsIFR5cGVSZWZlcmVuY2U+IF9mdW5jdGlvbl8yID0gKFR5cGVSZWZlcmVuY2UgaXQpIC0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoaXQsIHR5cGVQYXJhbWV0ZXJNYXBwaW5ncyk7CisgICAgICAgICAgfTsKKyAgICAgICAgICBpbXBsLnNldEV4Y2VwdGlvbnMoKChUeXBlUmVmZXJlbmNlW10pQ29udmVyc2lvbnMudW53cmFwQXJyYXkoSXRlcmFibGVFeHRlbnNpb25zLm1hcChyZXNvbHZlZE1ldGhvZC5nZXRSZXNvbHZlZEV4Y2VwdGlvblR5cGVzKCksIF9mdW5jdGlvbl8yKSwgVHlwZVJlZmVyZW5jZS5jbGFzcykpKTsKKyAgICAgICAgICBpbXBsLnNldFZhckFyZ3MoZGVjbGFyYXRpb24uaXNWYXJBcmdzKCkpOworICAgICAgICAgIGltcGwuc2V0UmV0dXJuVHlwZSh0aGlzLnJlcGxhY2UocmVzb2x2ZWRNZXRob2QuZ2V0UmVzb2x2ZWRSZXR1cm5UeXBlKCksIHR5cGVQYXJhbWV0ZXJNYXBwaW5ncykpOworICAgICAgICAgIGZpbmFsIENvbnN1bWVyPFJlc29sdmVkUGFyYW1ldGVyPiBfZnVuY3Rpb25fMyA9IChSZXNvbHZlZFBhcmFtZXRlciBwKSAtPiB7CisgICAgICAgICAgICBpbXBsLmFkZFBhcmFtZXRlcihwLmdldERlY2xhcmF0aW9uKCkuZ2V0U2ltcGxlTmFtZSgpLCB0aGlzLnJlcGxhY2UocC5nZXRSZXNvbHZlZFR5cGUoKSwgdHlwZVBhcmFtZXRlck1hcHBpbmdzKSk7CisgICAgICAgICAgfTsKKyAgICAgICAgICByZXNvbHZlZE1ldGhvZC5nZXRSZXNvbHZlZFBhcmFtZXRlcnMoKS5mb3JFYWNoKF9mdW5jdGlvbl8zKTsKKyAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IF9jbGllbnQgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kVG8oU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC5UYXJnZXRTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyKSB7CisgICAgICAgICAgICAgIFN0cmluZyBfcmV0dXJuSWZOZWVkZWQgPSBVdGlsLnRoaXMucmV0dXJuSWZOZWVkZWQocmVzb2x2ZWRNZXRob2QpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3JldHVybklmTmVlZGVkKTsKKyAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIF9kZWxlZ2F0ZUFjY2VzcyA9IFV0aWwudGhpcy5kZWxlZ2F0ZUFjY2VzcyhkZWxlZ2F0ZSwgZGVjbGFyYXRpb24pOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2RlbGVnYXRlQWNjZXNzKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuIik7CisgICAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZSA9IGRlY2xhcmF0aW9uLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIoIik7CisgICAgICAgICAgICAgIGZpbmFsIEZ1bmN0aW9uMTxQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgQ2hhclNlcXVlbmNlPiBfZnVuY3Rpb24gPSAoUGFyYW1ldGVyRGVjbGFyYXRpb24gaXQpIC0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICBTdHJpbmcgX2pvaW4gPSBJdGVyYWJsZUV4dGVuc2lvbnMuam9pbihkZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCksICIsICIsIF9mdW5jdGlvbik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfam9pbik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKTsiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICAgIGltcGwuc2V0Qm9keShfY2xpZW50KTsKKyAgICAgICAgfTsKKyAgICAgICAgX3hibG9ja2V4cHJlc3Npb24gPSBkZWxlZ2F0ZS5nZXREZWNsYXJpbmdUeXBlKCkuYWRkTWV0aG9kKGRlY2xhcmF0aW9uLmdldFNpbXBsZU5hbWUoKSwgX2Z1bmN0aW9uKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfeGJsb2NrZXhwcmVzc2lvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFR5cGVSZWZlcmVuY2UgcmVwbGFjZShmaW5hbCBUeXBlUmVmZXJlbmNlIHRhcmdldCwgZmluYWwgTWFwPD8gZXh0ZW5kcyBUeXBlUmVmZXJlbmNlLCA/IGV4dGVuZHMgVHlwZVJlZmVyZW5jZT4gbWFwcGluZ3MpIHsKKyAgICAgIGZpbmFsIEZ1bmN0aW9uMjxUeXBlUmVmZXJlbmNlLCBNYXAuRW50cnk8PyBleHRlbmRzIFR5cGVSZWZlcmVuY2UsID8gZXh0ZW5kcyBUeXBlUmVmZXJlbmNlPiwgVHlwZVJlZmVyZW5jZT4gX2Z1bmN0aW9uID0gKFR5cGVSZWZlcmVuY2UgcmVzdWx0LCBNYXAuRW50cnk8PyBleHRlbmRzIFR5cGVSZWZlcmVuY2UsID8gZXh0ZW5kcyBUeXBlUmVmZXJlbmNlPiBtYXBwaW5nKSAtPiB7CisgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UocmVzdWx0LCBtYXBwaW5nLmdldEtleSgpLCBtYXBwaW5nLmdldFZhbHVlKCkpOworICAgICAgfTsKKyAgICAgIHJldHVybiBJdGVyYWJsZUV4dGVuc2lvbnMuZm9sZChtYXBwaW5ncy5lbnRyeVNldCgpLCB0YXJnZXQsIF9mdW5jdGlvbik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBUeXBlUmVmZXJlbmNlIHJlcGxhY2UoZmluYWwgVHlwZVJlZmVyZW5jZSB0YXJnZXQsIGZpbmFsIFR5cGVSZWZlcmVuY2Ugb2xkVHlwZSwgZmluYWwgVHlwZVJlZmVyZW5jZSBuZXdUeXBlKSB7CisgICAgICBib29sZWFuIF9lcXVhbHMgPSBPYmplY3RzLmVxdWFsKHRhcmdldCwgb2xkVHlwZSk7CisgICAgICBpZiAoX2VxdWFscykgeworICAgICAgICByZXR1cm4gbmV3VHlwZTsKKyAgICAgIH0KKyAgICAgIGJvb2xlYW4gX2lzRW1wdHkgPSB0YXJnZXQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpLmlzRW1wdHkoKTsKKyAgICAgIGJvb2xlYW4gX25vdCA9ICghX2lzRW1wdHkpOworICAgICAgaWYgKF9ub3QpIHsKKyAgICAgICAgZmluYWwgRnVuY3Rpb24xPFR5cGVSZWZlcmVuY2UsIFR5cGVSZWZlcmVuY2U+IF9mdW5jdGlvbiA9IChUeXBlUmVmZXJlbmNlIGl0KSAtPiB7CisgICAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShpdCwgb2xkVHlwZSwgbmV3VHlwZSk7CisgICAgICAgIH07CisgICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQubmV3VHlwZVJlZmVyZW5jZSh0YXJnZXQuZ2V0VHlwZSgpLCAoKFR5cGVSZWZlcmVuY2VbXSlDb252ZXJzaW9ucy51bndyYXBBcnJheShMaXN0RXh0ZW5zaW9ucy48VHlwZVJlZmVyZW5jZSwgVHlwZVJlZmVyZW5jZT5tYXAodGFyZ2V0LmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKSwgX2Z1bmN0aW9uKSwgVHlwZVJlZmVyZW5jZS5jbGFzcykpKTsKKyAgICAgIH0KKyAgICAgIGJvb2xlYW4gX2lzV2lsZENhcmQgPSB0YXJnZXQuaXNXaWxkQ2FyZCgpOworICAgICAgaWYgKF9pc1dpbGRDYXJkKSB7CisgICAgICAgIFR5cGVSZWZlcmVuY2UgX3VwcGVyQm91bmQgPSB0YXJnZXQuZ2V0VXBwZXJCb3VuZCgpOworICAgICAgICBUeXBlUmVmZXJlbmNlIF9vYmplY3QgPSB0aGlzLmNvbnRleHQuZ2V0T2JqZWN0KCk7CisgICAgICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChfdXBwZXJCb3VuZCwgX29iamVjdCkpOworICAgICAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQubmV3V2lsZGNhcmRUeXBlUmVmZXJlbmNlKHRoaXMucmVwbGFjZSh0YXJnZXQuZ2V0VXBwZXJCb3VuZCgpLCBvbGRUeXBlLCBuZXdUeXBlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYm9vbGVhbiBfaXNBbnlUeXBlID0gdGFyZ2V0LmdldExvd2VyQm91bmQoKS5pc0FueVR5cGUoKTsKKyAgICAgICAgICBib29sZWFuIF9ub3RfMSA9ICghX2lzQW55VHlwZSk7CisgICAgICAgICAgaWYgKF9ub3RfMSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5uZXdXaWxkY2FyZFR5cGVSZWZlcmVuY2VXaXRoTG93ZXJCb3VuZCh0aGlzLnJlcGxhY2UodGFyZ2V0LmdldExvd2VyQm91bmQoKSwgb2xkVHlwZSwgbmV3VHlwZSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYm9vbGVhbiBfaXNBcnJheSA9IHRhcmdldC5pc0FycmF5KCk7CisgICAgICBpZiAoX2lzQXJyYXkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5uZXdBcnJheVR5cGVSZWZlcmVuY2UodGhpcy5yZXBsYWNlKHRhcmdldC5nZXRBcnJheUNvbXBvbmVudFR5cGUoKSwgb2xkVHlwZSwgbmV3VHlwZSkpOworICAgICAgfQorICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIENoYXJTZXF1ZW5jZSBfZGVsZWdhdGVBY2Nlc3MoZmluYWwgRmllbGREZWNsYXJhdGlvbiBpdCwgZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKSB7CisgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgidGhpcy4iKTsKKyAgICAgIFN0cmluZyBfc2ltcGxlTmFtZSA9IGl0LmdldFNpbXBsZU5hbWUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZChfc2ltcGxlTmFtZSk7CisgICAgICByZXR1cm4gX2J1aWxkZXI7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBDaGFyU2VxdWVuY2UgX2RlbGVnYXRlQWNjZXNzKGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIGl0LCBmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpIHsKKyAgICAgIENoYXJTZXF1ZW5jZSBfc3dpdGNoUmVzdWx0ID0gbnVsbDsKKyAgICAgIGZpbmFsIEZ1bmN0aW9uMTxQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgVHlwZVJlZmVyZW5jZT4gX2Z1bmN0aW9uID0gKFBhcmFtZXRlckRlY2xhcmF0aW9uIGl0XzEpIC0+IHsKKyAgICAgICAgcmV0dXJuIGl0XzEuZ2V0VHlwZSgpOworICAgICAgfTsKKyAgICAgIExpc3Q8VHlwZVJlZmVyZW5jZT4gX2xpc3QgPSBJdGVyYWJsZUV4dGVuc2lvbnMuPFR5cGVSZWZlcmVuY2U+dG9MaXN0KEl0ZXJhYmxlRXh0ZW5zaW9ucy5tYXAoaXQuZ2V0UGFyYW1ldGVycygpLCBfZnVuY3Rpb24pKTsKKyAgICAgIGJvb2xlYW4gX21hdGNoZWQgPSBmYWxzZTsKKyAgICAgIGlmIChPYmplY3RzLmVxdWFsKF9saXN0LCBDb2xsZWN0aW9ucy48T2JqZWN0PnVubW9kaWZpYWJsZUxpc3QoQ29sbGVjdGlvbkxpdGVyYWxzLjxPYmplY3Q+bmV3QXJyYXlMaXN0KCkpKSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ0aGlzLiIpOworICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWUgPSBpdC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIF9idWlsZGVyLmFwcGVuZChfc2ltcGxlTmFtZSk7CisgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKCkiKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IF9idWlsZGVyOworICAgICAgfQorICAgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgICBUeXBlUmVmZXJlbmNlIF9zdHJpbmcgPSB0aGlzLmNvbnRleHQuZ2V0U3RyaW5nKCk7CisgICAgICAgIGlmIChPYmplY3RzLmVxdWFsKF9saXN0LCBDb2xsZWN0aW9ucy48VHlwZVJlZmVyZW5jZT51bm1vZGlmaWFibGVMaXN0KENvbGxlY3Rpb25MaXRlcmFscy48VHlwZVJlZmVyZW5jZT5uZXdBcnJheUxpc3QoX3N0cmluZykpKSkgeworICAgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8xID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgidGhpcy4iKTsKKyAgICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWVfMSA9IGl0LmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICBfYnVpbGRlcl8xLmFwcGVuZChfc2ltcGxlTmFtZV8xKTsKKyAgICAgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiKFwiIik7CisgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lXzIgPSBtZXRob2QuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKF9zaW1wbGVOYW1lXzIpOworICAgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJcIikiKTsKKyAgICAgICAgICBfc3dpdGNoUmVzdWx0ID0gX2J1aWxkZXJfMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgICBUeXBlUmVmZXJlbmNlIF9zdHJpbmdfMSA9IHRoaXMuY29udGV4dC5nZXRTdHJpbmcoKTsKKyAgICAgICAgVHlwZVJlZmVyZW5jZSBfbmV3QXJyYXlUeXBlUmVmZXJlbmNlID0gdGhpcy5jb250ZXh0Lm5ld0FycmF5VHlwZVJlZmVyZW5jZSh0aGlzLmNvbnRleHQubmV3VHlwZVJlZmVyZW5jZShDbGFzcy5jbGFzcywgdGhpcy5jb250ZXh0Lm5ld1dpbGRjYXJkVHlwZVJlZmVyZW5jZSgpKSk7CisgICAgICAgIFR5cGVSZWZlcmVuY2UgX25ld0FycmF5VHlwZVJlZmVyZW5jZV8xID0gdGhpcy5jb250ZXh0Lm5ld0FycmF5VHlwZVJlZmVyZW5jZSh0aGlzLmNvbnRleHQuZ2V0T2JqZWN0KCkpOworICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbChfbGlzdCwgQ29sbGVjdGlvbnMuPFR5cGVSZWZlcmVuY2U+dW5tb2RpZmlhYmxlTGlzdChDb2xsZWN0aW9uTGl0ZXJhbHMuPFR5cGVSZWZlcmVuY2U+bmV3QXJyYXlMaXN0KF9zdHJpbmdfMSwgX25ld0FycmF5VHlwZVJlZmVyZW5jZSwgX25ld0FycmF5VHlwZVJlZmVyZW5jZV8xKSkpKSB7CisgICAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCJ0aGlzLiIpOworICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZV8zID0gaXQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKF9zaW1wbGVOYW1lXzMpOworICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCIoXCIiKTsKKyAgICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWVfNCA9IG1ldGhvZC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoX3NpbXBsZU5hbWVfNCk7CisgICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoIlwiLCBuZXcgQ2xhc3NbXXsiKTsKKyAgICAgICAgICBmaW5hbCBGdW5jdGlvbjE8UGFyYW1ldGVyRGVjbGFyYXRpb24sIENoYXJTZXF1ZW5jZT4gX2Z1bmN0aW9uXzEgPSAoUGFyYW1ldGVyRGVjbGFyYXRpb24gaXRfMSkgLT4geworICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lXzUgPSBpdF8xLmdldFR5cGUoKS5nZXRUeXBlKCkuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgcmV0dXJuIChfc2ltcGxlTmFtZV81ICsgIi5jbGFzcyIpOworICAgICAgICAgIH07CisgICAgICAgICAgU3RyaW5nIF9qb2luID0gSXRlcmFibGVFeHRlbnNpb25zLmpvaW4obWV0aG9kLmdldFBhcmFtZXRlcnMoKSwgIiwgIiwgX2Z1bmN0aW9uXzEpOworICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKF9qb2luKTsKKyAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZCgifSwgbmV3IE9iamVjdFtdeyIpOworICAgICAgICAgIGZpbmFsIEZ1bmN0aW9uMTxQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgQ2hhclNlcXVlbmNlPiBfZnVuY3Rpb25fMiA9IChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBpdF8xKSAtPiB7CisgICAgICAgICAgICByZXR1cm4gaXRfMS5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgfTsKKyAgICAgICAgICBTdHJpbmcgX2pvaW5fMSA9IEl0ZXJhYmxlRXh0ZW5zaW9ucy5qb2luKG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCksICIsICIsIF9mdW5jdGlvbl8yKTsKKyAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZChfam9pbl8xKTsKKyAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZCgifSkiKTsKKyAgICAgICAgICBfc3dpdGNoUmVzdWx0ID0gX2J1aWxkZXJfMjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZWxlZ2F0ZSBzaWduYXR1cmUiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfc3dpdGNoUmVzdWx0OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIHJldHVybklmTmVlZGVkKGZpbmFsIFJlc29sdmVkTWV0aG9kIGl0KSB7CisgICAgICBTdHJpbmcgX3hpZmV4cHJlc3Npb24gPSBudWxsOworICAgICAgYm9vbGVhbiBfaXNWb2lkID0gaXQuZ2V0UmVzb2x2ZWRSZXR1cm5UeXBlKCkuaXNWb2lkKCk7CisgICAgICBpZiAoX2lzVm9pZCkgeworICAgICAgICBfeGlmZXhwcmVzc2lvbiA9ICIiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3hpZmV4cHJlc3Npb24gPSAicmV0dXJuICI7CisgICAgICB9CisgICAgICByZXR1cm4gX3hpZmV4cHJlc3Npb247CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWREZWxlZ2F0ZShmaW5hbCBNZW1iZXJEZWNsYXJhdGlvbiBpdCkgeworICAgICAgaWYgKGl0IGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIF9pc1ZhbGlkRGVsZWdhdGUoKE1ldGhvZERlY2xhcmF0aW9uKWl0KTsKKyAgICAgIH0gZWxzZSBpZiAoaXQgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisgICAgICAgIHJldHVybiBfaXNWYWxpZERlbGVnYXRlKChGaWVsZERlY2xhcmF0aW9uKWl0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuaGFuZGxlZCBwYXJhbWV0ZXIgdHlwZXM6ICIgKworICAgICAgICAgIEFycmF5cy48T2JqZWN0PmFzTGlzdChpdCkudG9TdHJpbmcoKSk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBUeXBlUmVmZXJlbmNlIGdldFR5cGUoZmluYWwgTWVtYmVyRGVjbGFyYXRpb24gaXQpIHsKKyAgICAgIGlmIChpdCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7CisgICAgICAgIHJldHVybiBfZ2V0VHlwZSgoTWV0aG9kRGVjbGFyYXRpb24paXQpOworICAgICAgfSBlbHNlIGlmIChpdCBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIF9nZXRUeXBlKChGaWVsZERlY2xhcmF0aW9uKWl0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuaGFuZGxlZCBwYXJhbWV0ZXIgdHlwZXM6ICIgKworICAgICAgICAgIEFycmF5cy48T2JqZWN0PmFzTGlzdChpdCkudG9TdHJpbmcoKSk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZGVsZWdhdGVBY2Nlc3MoZmluYWwgTWVtYmVyRGVjbGFyYXRpb24gaXQsIGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCkgeworICAgICAgaWYgKGl0IGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZUFjY2VzcygoTWV0aG9kRGVjbGFyYXRpb24paXQsIG1ldGhvZCk7CisgICAgICB9IGVsc2UgaWYgKGl0IGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgeworICAgICAgICByZXR1cm4gX2RlbGVnYXRlQWNjZXNzKChGaWVsZERlY2xhcmF0aW9uKWl0LCBtZXRob2QpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5oYW5kbGVkIHBhcmFtZXRlciB0eXBlczogIiArCisgICAgICAgICAgQXJyYXlzLjxPYmplY3Q+YXNMaXN0KGl0LCBtZXRob2QpLnRvU3RyaW5nKCkpOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGRvVHJhbnNmb3JtKGZpbmFsIExpc3Q8PyBleHRlbmRzIE11dGFibGVNZW1iZXJEZWNsYXJhdGlvbj4gZWxlbWVudHMsIEBFeHRlbnNpb24gZmluYWwgVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKyAgICBARXh0ZW5zaW9uCisgICAgZmluYWwgRGVsZWdhdGVQcm9jZXNzb3IuVXRpbCB1dGlsID0gbmV3IERlbGVnYXRlUHJvY2Vzc29yLlV0aWwoY29udGV4dCk7CisgICAgZmluYWwgQ29uc3VtZXI8TXV0YWJsZU1lbWJlckRlY2xhcmF0aW9uPiBfZnVuY3Rpb24gPSAoTXV0YWJsZU1lbWJlckRlY2xhcmF0aW9uIGl0KSAtPiB7CisgICAgICBib29sZWFuIF9pc1ZhbGlkRGVsZWdhdGUgPSB1dGlsLmlzVmFsaWREZWxlZ2F0ZShpdCk7CisgICAgICBpZiAoX2lzVmFsaWREZWxlZ2F0ZSkgeworICAgICAgICBmaW5hbCBDb25zdW1lcjxSZXNvbHZlZE1ldGhvZD4gX2Z1bmN0aW9uXzEgPSAoUmVzb2x2ZWRNZXRob2QgbWV0aG9kKSAtPiB7CisgICAgICAgICAgdXRpbC5pbXBsZW1lbnRNZXRob2QoaXQsIG1ldGhvZCk7CisgICAgICAgIH07CisgICAgICAgIHV0aWwuZ2V0TWV0aG9kc1RvSW1wbGVtZW50KGl0KS5mb3JFYWNoKF9mdW5jdGlvbl8xKTsKKyAgICAgIH0KKyAgICB9OworICAgIGVsZW1lbnRzLmZvckVhY2goX2Z1bmN0aW9uKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvRXF1YWxzSGFzaENvZGUuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0VxdWFsc0hhc2hDb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzN2ZhNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0VxdWFsc0hhc2hDb2RlLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFjdGl2ZTsKKworLyoqCisgKiBDcmVhdGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpIGVxdWFsc30gYW5kIHtAbGluayBPYmplY3QjaGFzaENvZGUgaGFzaENvZGV9LgorICogCisgKiBBbGwgbm9uLXN0YXRpYywgbm9uLXRyYW5zaWVudCBmaWVsZHMgYXJlIHVzZWQuIFN1YmNsYXNzZXMgYXJlIG5ldmVyIGVxdWFsIHRvIHRoZWlyIHN1cGVyY2xhc3Nlcy4KKyAqIElmIHRoZXJlIGlzIGEgc3VwZXJjbGFzcyB0aGF0IG92ZXJyaWRlcyBlcXVhbHMsIHRoZW4gPGNvZGU+c3VwZXIuZXF1YWxzKCk8L2NvZGU+IGFuZCA8Y29kZT5zdXBlci5oYXNoQ29kZTwvY29kZT4gYXJlIGFsc28gY2FsbGVkLgorICogQXJyYXktdmFsdWVkIGZpZWxkcyBhcmUgY29tcGFyZWQgdXNpbmcgI3tAbGluayBBcnJheXMjZGVlcEVxdWFsc30uCisgKiBAc2luY2UgMi43CisgKi8KK0BCZXRhCitAR3d0Q29tcGF0aWJsZQorQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQorQEFjdGl2ZShFcXVhbHNIYXNoQ29kZVByb2Nlc3Nvci5jbGFzcykKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIEBpbnRlcmZhY2UgRXF1YWxzSGFzaENvZGUgeworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvRXF1YWxzSGFzaENvZGUueHRlbmQgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9FcXVhbHNIYXNoQ29kZS54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjVmMjI4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvRXF1YWxzSGFzaENvZGUueHRlbmQKQEAgLTAsMCArMSwyNDEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zCisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZQoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFic3RyYWN0Q2xhc3NQcm9jZXNzb3IKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uQWN0aXZlCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLlRyYW5zZm9ybWF0aW9uQ29udGV4dAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkZpZWxkRGVjbGFyYXRpb24KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTXV0YWJsZUNsYXNzRGVjbGFyYXRpb24KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVHlwZVJlZmVyZW5jZQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kMi5saWIuU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudAoraW1wb3J0IGphdmEudXRpbC5BcnJheXMKKworLyoqCisgKiBDcmVhdGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpIGVxdWFsc30gYW5kIHtAbGluayBPYmplY3QjaGFzaENvZGUgaGFzaENvZGV9LgorICogCisgKiBBbGwgbm9uLXN0YXRpYywgbm9uLXRyYW5zaWVudCBmaWVsZHMgYXJlIHVzZWQuIFN1YmNsYXNzZXMgYXJlIG5ldmVyIGVxdWFsIHRvIHRoZWlyIHN1cGVyY2xhc3Nlcy4gCisgKiBJZiB0aGVyZSBpcyBhIHN1cGVyY2xhc3MgdGhhdCBvdmVycmlkZXMgZXF1YWxzLCB0aGVuIDxjb2RlPnN1cGVyLmVxdWFscygpPC9jb2RlPiBhbmQgPGNvZGU+c3VwZXIuaGFzaENvZGU8L2NvZGU+IGFyZSBhbHNvIGNhbGxlZC4KKyAqIEFycmF5LXZhbHVlZCBmaWVsZHMgYXJlIGNvbXBhcmVkIHVzaW5nICN7QGxpbmsgQXJyYXlzI2RlZXBFcXVhbHN9LgorICogQHNpbmNlIDIuNworICovCitAQmV0YQorQEd3dENvbXBhdGlibGUKK0BUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkKK0BBY3RpdmUoRXF1YWxzSGFzaENvZGVQcm9jZXNzb3IpCithbm5vdGF0aW9uIEVxdWFsc0hhc2hDb2RlIHsKK30KKworLyoqCisgKiBAc2luY2UgMi43CisgKiBAbm9yZWZlcmVuY2UKKyAqIEBub2V4dGVuZAorICovCitAQmV0YQorY2xhc3MgRXF1YWxzSGFzaENvZGVQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdENsYXNzUHJvY2Vzc29yIHsKKworCW92ZXJyaWRlIGRvVHJhbnNmb3JtKE11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGl0LCBleHRlbnNpb24gVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKwkJaWYgKGZpbmRBbm5vdGF0aW9uKERhdGEuZmluZFR5cGVHbG9iYWxseSkgIT09IG51bGwpIHsKKwkJCXJldHVybgorCQl9CisJCWV4dGVuc2lvbiB2YWwgdXRpbCA9IG5ldyBVdGlsKGNvbnRleHQpCisJCWlmIChoYXNFcXVhbHMpIHsKKwkJCXZhbCBhbm5vdGF0aW9uID0gZmluZEFubm90YXRpb24oRXF1YWxzSGFzaENvZGUuZmluZFR5cGVHbG9iYWxseSkKKwkJCWFubm90YXRpb24uYWRkV2FybmluZygiZXF1YWxzIGlzIGFscmVhZHkgZGVmaW5lZCwgdGhpcyBhbm5vdGF0aW9uIGhhcyBubyBlZmZlY3QiKQorCQl9IGVsc2UgaWYgKGhhc0hhc2hDb2RlKSB7CisJCQlhZGRXYXJuaW5nKCJoYXNoQ29kZSBpcyBhbHJlYWR5IGRlZmluZWQsIHRoaXMgYW5ub3RhdGlvbiBoYXMgbm8gZWZmZWN0IikKKwkJfSBlbHNlIHsKKwkJCXZhbCBmaWVsZHMgPSBkZWNsYXJlZEZpZWxkcy5maWx0ZXJbIXN0YXRpYyAmJiAhdHJhbnNpZW50ICYmIHRoZVByaW1hcnlHZW5lcmF0ZWRKYXZhRWxlbWVudF0KKwkJCWFkZEVxdWFscyhmaWVsZHMsIGhhc1N1cGVyRXF1YWxzKQorCQkJYWRkSGFzaENvZGUoZmllbGRzLCBoYXNTdXBlckhhc2hDb2RlKQorCQl9CisJfQorCisJLyoqCisJICogQHNpbmNlIDIuNworCSAqIEBub2V4dGVuZAorCSAqIEBub3JlZmVyZW5jZQorIAkgKi8KKwlAQmV0YQorCXN0YXRpYyBjbGFzcyBVdGlsIHsKKworCQlzdGF0aWMgZmluYWwgaW50IFBSSU1FX1ZBTFVFID0gMzEKKwkJZXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0CisKKwkJbmV3KFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0CisJCX0KKworCQlkZWYgaGFzSGFzaENvZGUoQ2xhc3NEZWNsYXJhdGlvbiBpdCkgeworCQkJZmluZERlY2xhcmVkTWV0aG9kKCJoYXNoQ29kZSIpICE9PSBudWxsCisJCX0KKworCQlkZWYgaGFzRXF1YWxzKENsYXNzRGVjbGFyYXRpb24gaXQpIHsKKwkJCWRlY2xhcmVkTWV0aG9kcy5leGlzdHMgWworCQkJCXNpbXBsZU5hbWUgPT0gImVxdWFscyIgJiYgcGFyYW1ldGVycy5zaXplID09IDEgJiYgcGFyYW1ldGVycy5oZWFkLnR5cGUgPT0gb2JqZWN0CisJCQldCisJCX0KKworCQlkZWYgYm9vbGVhbiBoYXNTdXBlckVxdWFscyhDbGFzc0RlY2xhcmF0aW9uIGNscykgeworCQkJdmFsIHN1cGVyQ2xhc3MgPSAoY2xzLmV4dGVuZGVkQ2xhc3MudHlwZSBhcyBDbGFzc0RlY2xhcmF0aW9uKQorCQkJaWYgKHN1cGVyQ2xhc3MubmV3VHlwZVJlZmVyZW5jZS5lcXVhbHMob2JqZWN0KSkgeworCQkJCWZhbHNlCisJCQl9IGVsc2UgaWYgKHN1cGVyQ2xhc3MuaGFzRXF1YWxzKSB7CisJCQkJdHJ1ZQorCQkJfSBlbHNlIHsKKwkJCQlzdXBlckNsYXNzLmhhc1N1cGVyRXF1YWxzCisJCQl9CisJCX0KKwkJZGVmIGJvb2xlYW4gaGFzU3VwZXJIYXNoQ29kZShDbGFzc0RlY2xhcmF0aW9uIGNscykgeworCQkJdmFsIHN1cGVyQ2xhc3MgPSAoY2xzLmV4dGVuZGVkQ2xhc3MudHlwZSBhcyBDbGFzc0RlY2xhcmF0aW9uKQorCQkJaWYgKHN1cGVyQ2xhc3MubmV3VHlwZVJlZmVyZW5jZS5lcXVhbHMob2JqZWN0KSkgeworCQkJCWZhbHNlCisJCQl9IGVsc2UgaWYgKHN1cGVyQ2xhc3MuaGFzSGFzaENvZGUpIHsKKwkJCQl0cnVlCisJCQl9IGVsc2UgeworCQkJCXN1cGVyQ2xhc3MuaGFzU3VwZXJIYXNoQ29kZQorCQkJfQorCQl9CisKKwkJZGVmIHZvaWQgYWRkRXF1YWxzKE11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGNscywgSXRlcmFibGU8PyBleHRlbmRzIEZpZWxkRGVjbGFyYXRpb24+IGluY2x1ZGVkRmllbGRzLAorCQkJYm9vbGVhbiBpbmNsdWRlU3VwZXIpIHsKKwkJCWNscy5hZGRNZXRob2QoImVxdWFscyIpIFsKKwkJCQlwcmltYXJ5U291cmNlRWxlbWVudCA9IGNscy5wcmltYXJ5U291cmNlRWxlbWVudAorCQkJCXJldHVyblR5cGUgPSBwcmltaXRpdmVCb29sZWFuCisJCQkJYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uUmVmZXJlbmNlKE92ZXJyaWRlKSkKKwkJCQlhZGRBbm5vdGF0aW9uKG5ld0Fubm90YXRpb25SZWZlcmVuY2UoUHVyZSkpCisJCQkJYWRkUGFyYW1ldGVyKCJvYmoiLCBvYmplY3QpCisJCQkJYm9keSA9ICcnJworCQkJCQlpZiAodGhpcyA9PSBvYmopCisJCQkJCSAgcmV0dXJuIHRydWU7CisJCQkJCWlmIChvYmogPT0gbnVsbCkKKwkJCQkJICByZXR1cm4gZmFsc2U7CisJCQkJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorCQkJCQkgIHJldHVybiBmYWxzZTsKKwkJCQkJq0lGIGluY2x1ZGVTdXBlcrsKKwkJCQkJCWlmICghc3VwZXIuZXF1YWxzKG9iaikpCisJCQkJCQkgIHJldHVybiBmYWxzZTsKKwkJCQkJq0VORElGuworCQkJCQmrSUYgaW5jbHVkZWRGaWVsZHMuc2l6ZT4wuworCQkJCQkJq2Nscy5uZXdXaWxkQ2FyZFNlbGZUeXBlUmVmZXJlbmNluyBvdGhlciA9ICirY2xzLm5ld1dpbGRDYXJkU2VsZlR5cGVSZWZlcmVuY2W7KSBvYmo7CisJCQkJCatFTkRJRrsKKwkJCQkJq0ZPUiBmaWVsZCA6IGluY2x1ZGVkRmllbGRzuworCQkJCQkJq2ZpZWxkLmNvbnRyaWJ1dGVUb0VxdWFsc7sKKwkJCQkJq0VOREZPUrsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJJycnCisJCQldCisJCX0KKworCQlwcml2YXRlIGRlZiBuZXdXaWxkQ2FyZFNlbGZUeXBlUmVmZXJlbmNlKENsYXNzRGVjbGFyYXRpb24gY2xzKSB7CisJCQljbHMubmV3VHlwZVJlZmVyZW5jZShjbHMudHlwZVBhcmFtZXRlcnMubWFwW29iamVjdC5uZXdXaWxkY2FyZFR5cGVSZWZlcmVuY2VdKQorCQl9CisKKwkJZGVmIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgY29udHJpYnV0ZVRvRXF1YWxzKEZpZWxkRGVjbGFyYXRpb24gaXQpIHsKKwkJCXN3aXRjaCAodHlwZS5vck9iamVjdC5uYW1lKSB7CisJCQkJY2FzZSBEb3VibGUuVFlQRS5uYW1lOiAnJycKKwkJCQkJaWYgKKtEb3VibGW7LmRvdWJsZVRvTG9uZ0JpdHMob3RoZXIuq3NpbXBsZU5hbWW7KSAhPSCrRG91Ymxluy5kb3VibGVUb0xvbmdCaXRzKHRoaXMuq3NpbXBsZU5hbWW7KSkKKwkJCQkJICByZXR1cm4gZmFsc2U7IAorCQkJCScnJworCQkJCWNhc2UgRmxvYXQuVFlQRS5uYW1lOiAnJycKKwkJCQkJaWYgKKtGbG9hdLsuZmxvYXRUb0ludEJpdHMob3RoZXIuq3NpbXBsZU5hbWW7KSAhPSCrRmxvYXS7LmZsb2F0VG9JbnRCaXRzKHRoaXMuq3NpbXBsZU5hbWW7KSkKKwkJCQkJICByZXR1cm4gZmFsc2U7IAorCQkJCScnJworCQkJCWNhc2UgQm9vbGVhbi5UWVBFLm5hbWUsCisJCQkJY2FzZSBJbnRlZ2VyLlRZUEUubmFtZSwKKwkJCQljYXNlIENoYXJhY3Rlci5UWVBFLm5hbWUsCisJCQkJY2FzZSBCeXRlLlRZUEUubmFtZSwKKwkJCQljYXNlIFNob3J0LlRZUEUubmFtZSwKKwkJCQljYXNlIExvbmcuVFlQRS5uYW1lOiAnJycKKwkJCQkJaWYgKG90aGVyLqtzaW1wbGVOYW1luyAhPSB0aGlzLqtzaW1wbGVOYW1luykKKwkJCQkJICByZXR1cm4gZmFsc2U7CisJCQkJJycnCisJCQkJZGVmYXVsdDogJycnCisJCQkJCWlmICh0aGlzLqtzaW1wbGVOYW1luyA9PSBudWxsKSB7CisJCQkJCSAgaWYgKG90aGVyLqtzaW1wbGVOYW1luyAhPSBudWxsKQorCQkJCQkgICAgcmV0dXJuIGZhbHNlOworCQkJCQl9IGVsc2UgaWYgKCGrZGVlcEVxdWFsc7spCisJCQkJCSAgcmV0dXJuIGZhbHNlOworCQkJCScnJworCQkJfQorCQl9CisJCQorCQlkZWYgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBkZWVwRXF1YWxzKEZpZWxkRGVjbGFyYXRpb24gaXQpIHsKKwkJCWlmICh0eXBlLmlzQXJyYXkpIHsKKwkJCQlpZiAodHlwZS5hcnJheUNvbXBvbmVudFR5cGUuaXNQcmltaXRpdmUpIHsKKwkJCQkJJycnq0FycmF5c7suZXF1YWxzKHRoaXMuq3NpbXBsZU5hbWW7LCBvdGhlci6rc2ltcGxlTmFtZbspJycnCisJCQkJfSBlbHNlIHsKKwkJCQkJJycnq0FycmF5c7suZGVlcEVxdWFscyh0aGlzLqtzaW1wbGVOYW1luywgb3RoZXIuq3NpbXBsZU5hbWW7KScnJworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJJycndGhpcy6rc2ltcGxlTmFtZbsuZXF1YWxzKG90aGVyLqtzaW1wbGVOYW1luyknJycKKwkJCX0KKwkJfQorCisJCWRlZiB2b2lkIGFkZEhhc2hDb2RlKE11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGNscywgSXRlcmFibGU8PyBleHRlbmRzIEZpZWxkRGVjbGFyYXRpb24+IGluY2x1ZGVkRmllbGRzLAorCQkJYm9vbGVhbiBpbmNsdWRlU3VwZXIpIHsKKwkJCXZhbCBkZWZhdWx0QmFzZSA9IGlmKGluY2x1ZGVTdXBlcikgInN1cGVyLmhhc2hDb2RlKCkiIGVsc2UgIjEiCisJCQl2YWwgZmllbGRzID0gaW5jbHVkZWRGaWVsZHMuc2l6ZQorCisJCQljbHMuYWRkTWV0aG9kKCJoYXNoQ29kZSIpIFsKKwkJCQlwcmltYXJ5U291cmNlRWxlbWVudCA9IGNscy5wcmltYXJ5U291cmNlRWxlbWVudAorCQkJCXJldHVyblR5cGUgPSBwcmltaXRpdmVJbnQKKwkJCQlhZGRBbm5vdGF0aW9uKG5ld0Fubm90YXRpb25SZWZlcmVuY2UoT3ZlcnJpZGUpKQorCQkJCWFkZEFubm90YXRpb24obmV3QW5ub3RhdGlvblJlZmVyZW5jZShQdXJlKSkKKwkJCQlib2R5ID0gJycnCisJCQkJCatJRiBmaWVsZHMgPj0gMrsKKwkJCQkJCWZpbmFsIGludCBwcmltZSA9IKtQUklNRV9WQUxVRbs7CisJCQkJCQlpbnQgcmVzdWx0ID0gq2RlZmF1bHRCYXNluzsKKwkJCQkJCatGT1IgaSA6IDAgLi48IGZpZWxkc7sKKwkJCQkJCQmrSUYgaSA9PSBmaWVsZHMgLSAxu3JldHVybqtFTFNFu3Jlc3VsdCA9q0VORElGuyBwcmltZSAqIHJlc3VsdCArIKtpbmNsdWRlZEZpZWxkcy5nZXQoaSkuY29udHJpYnV0ZVRvSGFzaENvZGW7OworCQkJCQkJq0VOREZPUrsKKwkJCQkJq0VMU0VJRiBmaWVsZHMgPT0gMbsKKwkJCQkJCXJldHVybiCrUFJJTUVfVkFMVUW7ICogq2RlZmF1bHRCYXNluyArIKtpbmNsdWRlZEZpZWxkcy5oZWFkLmNvbnRyaWJ1dGVUb0hhc2hDb2RluzsKKwkJCQkJq0VMU0W7CisJCQkJCQlyZXR1cm4gq2RlZmF1bHRCYXNluzsKKwkJCQkJq0VORElGuworCQkJCScnJworCQkJXQorCQl9CisKKwkJZGVmIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgY29udHJpYnV0ZVRvSGFzaENvZGUoRmllbGREZWNsYXJhdGlvbiBpdCkgeworCQkJc3dpdGNoICh0eXBlLm9yT2JqZWN0Lm5hbWUpIHsKKwkJCQljYXNlIERvdWJsZS5UWVBFLm5hbWU6CisJCQkJCScnJyhpbnQpICirRG91Ymxluy5kb3VibGVUb0xvbmdCaXRzKHRoaXMuq3NpbXBsZU5hbWW7KSBeICirRG91Ymxluy5kb3VibGVUb0xvbmdCaXRzKHRoaXMuq3NpbXBsZU5hbWW7KSA+Pj4gMzIpKScnJworCQkJCWNhc2UgRmxvYXQuVFlQRS5uYW1lOgorCQkJCQknJyerRmxvYXS7LmZsb2F0VG9JbnRCaXRzKHRoaXMuq3NpbXBsZU5hbWW7KScnJworCQkJCWNhc2UgQm9vbGVhbi5UWVBFLm5hbWU6CisJCQkJCScnJyh0aGlzLqtzaW1wbGVOYW1luyA/IDEyMzEgOiAxMjM3KScnJworCQkJCWNhc2UgSW50ZWdlci5UWVBFLm5hbWUsCisJCQkJY2FzZSBDaGFyYWN0ZXIuVFlQRS5uYW1lLAorCQkJCWNhc2UgQnl0ZS5UWVBFLm5hbWUsCisJCQkJY2FzZSBTaG9ydC5UWVBFLm5hbWU6CisJCQkJCScnJ3RoaXMuq3NpbXBsZU5hbWW7JycnCisJCQkJY2FzZSBMb25nLlRZUEUubmFtZToKKwkJCQkJJycnKGludCkgKHRoaXMuq3NpbXBsZU5hbWW7IF4gKHRoaXMuq3NpbXBsZU5hbWW7ID4+PiAzMikpJycnCisJCQkJZGVmYXVsdDoKKwkJCQkJJycnKCh0aGlzLqtzaW1wbGVOYW1luz09IG51bGwpID8gMCA6IKtkZWVwSGFzaENvZGW7KScnJworCQkJfQorCQl9CisJCQorCQlkZWYgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBkZWVwSGFzaENvZGUoRmllbGREZWNsYXJhdGlvbiBpdCkgeworCQkJdmFsIHR5cGUgPSB0eXBlLm9yT2JqZWN0CisJCQlpZiAodHlwZS5pc0FycmF5KSB7CisJCQkJaWYgKHR5cGUuYXJyYXlDb21wb25lbnRUeXBlLmlzUHJpbWl0aXZlKSB7CisJCQkJCScnJ6tBcnJheXO7Lmhhc2hDb2RlKHRoaXMuq3NpbXBsZU5hbWW7KScnJworCQkJCX0gZWxzZSB7CisJCQkJCScnJ6tBcnJheXO7LmRlZXBIYXNoQ29kZSh0aGlzLqtzaW1wbGVOYW1luyknJycKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCScnJ3RoaXMuq3NpbXBsZU5hbWW7Lmhhc2hDb2RlKCknJycKKwkJCX0KKwkJfQorCQkKKwkJcHJpdmF0ZSBkZWYgb3JPYmplY3QoVHlwZVJlZmVyZW5jZSByZWYpIHsKKwkJCXJlZiA/OiBvYmplY3QKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0VxdWFsc0hhc2hDb2RlUHJvY2Vzc29yLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9FcXVhbHNIYXNoQ29kZVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMGE5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9FcXVhbHNIYXNoQ29kZVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNjcyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9uczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFic3RyYWN0Q2xhc3NQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLlRyYW5zZm9ybWF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uQW5ub3RhdGlvblJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTXV0YWJsZU1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQyLmxpYi5TdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Db252ZXJzaW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRXhjbHVzaXZlUmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuSXRlcmFibGVFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzLlByb2NlZHVyZTE7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlB1cmU7CisKKy8qKgorICogQHNpbmNlIDIuNworICogQG5vcmVmZXJlbmNlCisgKiBAbm9leHRlbmQKKyAqLworQEJldGEKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEVxdWFsc0hhc2hDb2RlUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDbGFzc1Byb2Nlc3NvciB7CisgIC8qKgorICAgKiBAc2luY2UgMi43CisgICAqIEBub2V4dGVuZAorICAgKiBAbm9yZWZlcmVuY2UKKyAgICovCisgIEBCZXRhCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVXRpbCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBSSU1FX1ZBTFVFID0gMzE7CisgICAgCisgICAgQEV4dGVuc2lvbgorICAgIHByaXZhdGUgVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQ7CisgICAgCisgICAgcHVibGljIFV0aWwoZmluYWwgVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKyAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGhhc0hhc2hDb2RlKGZpbmFsIENsYXNzRGVjbGFyYXRpb24gaXQpIHsKKyAgICAgIE1ldGhvZERlY2xhcmF0aW9uIF9maW5kRGVjbGFyZWRNZXRob2QgPSBpdC5maW5kRGVjbGFyZWRNZXRob2QoImhhc2hDb2RlIik7CisgICAgICByZXR1cm4gKF9maW5kRGVjbGFyZWRNZXRob2QgIT0gbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGhhc0VxdWFscyhmaW5hbCBDbGFzc0RlY2xhcmF0aW9uIGl0KSB7CisgICAgICBmaW5hbCBGdW5jdGlvbjE8TWV0aG9kRGVjbGFyYXRpb24sIEJvb2xlYW4+IF9mdW5jdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbiBpdF8xKSAtPiB7CisgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKChPYmplY3RzLmVxdWFsKGl0XzEuZ2V0U2ltcGxlTmFtZSgpLCAiZXF1YWxzIikgJiYgKEl0ZXJhYmxlRXh0ZW5zaW9ucy5zaXplKGl0XzEuZ2V0UGFyYW1ldGVycygpKSA9PSAxKSkgJiYgT2JqZWN0cy5lcXVhbChJdGVyYWJsZUV4dGVuc2lvbnMuaGVhZChpdF8xLmdldFBhcmFtZXRlcnMoKSkuZ2V0VHlwZSgpLCB0aGlzLmNvbnRleHQuZ2V0T2JqZWN0KCkpKSk7CisgICAgICB9OworICAgICAgcmV0dXJuIEl0ZXJhYmxlRXh0ZW5zaW9ucy5leGlzdHMoaXQuZ2V0RGVjbGFyZWRNZXRob2RzKCksIF9mdW5jdGlvbik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGhhc1N1cGVyRXF1YWxzKGZpbmFsIENsYXNzRGVjbGFyYXRpb24gY2xzKSB7CisgICAgICBib29sZWFuIF94YmxvY2tleHByZXNzaW9uID0gZmFsc2U7CisgICAgICB7CisgICAgICAgIFR5cGUgX3R5cGUgPSBjbHMuZ2V0RXh0ZW5kZWRDbGFzcygpLmdldFR5cGUoKTsKKyAgICAgICAgZmluYWwgQ2xhc3NEZWNsYXJhdGlvbiBzdXBlckNsYXNzID0gKChDbGFzc0RlY2xhcmF0aW9uKSBfdHlwZSk7CisgICAgICAgIGJvb2xlYW4gX3hpZmV4cHJlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBfZXF1YWxzID0gdGhpcy5jb250ZXh0Lm5ld1R5cGVSZWZlcmVuY2Uoc3VwZXJDbGFzcykuZXF1YWxzKHRoaXMuY29udGV4dC5nZXRPYmplY3QoKSk7CisgICAgICAgIGlmIChfZXF1YWxzKSB7CisgICAgICAgICAgX3hpZmV4cHJlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBib29sZWFuIF94aWZleHByZXNzaW9uXzEgPSBmYWxzZTsKKyAgICAgICAgICBib29sZWFuIF9oYXNFcXVhbHMgPSB0aGlzLmhhc0VxdWFscyhzdXBlckNsYXNzKTsKKyAgICAgICAgICBpZiAoX2hhc0VxdWFscykgeworICAgICAgICAgICAgX3hpZmV4cHJlc3Npb25fMSA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF94aWZleHByZXNzaW9uXzEgPSB0aGlzLmhhc1N1cGVyRXF1YWxzKHN1cGVyQ2xhc3MpOworICAgICAgICAgIH0KKyAgICAgICAgICBfeGlmZXhwcmVzc2lvbiA9IF94aWZleHByZXNzaW9uXzE7CisgICAgICAgIH0KKyAgICAgICAgX3hibG9ja2V4cHJlc3Npb24gPSBfeGlmZXhwcmVzc2lvbjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfeGJsb2NrZXhwcmVzc2lvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaGFzU3VwZXJIYXNoQ29kZShmaW5hbCBDbGFzc0RlY2xhcmF0aW9uIGNscykgeworICAgICAgYm9vbGVhbiBfeGJsb2NrZXhwcmVzc2lvbiA9IGZhbHNlOworICAgICAgeworICAgICAgICBUeXBlIF90eXBlID0gY2xzLmdldEV4dGVuZGVkQ2xhc3MoKS5nZXRUeXBlKCk7CisgICAgICAgIGZpbmFsIENsYXNzRGVjbGFyYXRpb24gc3VwZXJDbGFzcyA9ICgoQ2xhc3NEZWNsYXJhdGlvbikgX3R5cGUpOworICAgICAgICBib29sZWFuIF94aWZleHByZXNzaW9uID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gX2VxdWFscyA9IHRoaXMuY29udGV4dC5uZXdUeXBlUmVmZXJlbmNlKHN1cGVyQ2xhc3MpLmVxdWFscyh0aGlzLmNvbnRleHQuZ2V0T2JqZWN0KCkpOworICAgICAgICBpZiAoX2VxdWFscykgeworICAgICAgICAgIF94aWZleHByZXNzaW9uID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYm9vbGVhbiBfeGlmZXhwcmVzc2lvbl8xID0gZmFsc2U7CisgICAgICAgICAgYm9vbGVhbiBfaGFzSGFzaENvZGUgPSB0aGlzLmhhc0hhc2hDb2RlKHN1cGVyQ2xhc3MpOworICAgICAgICAgIGlmIChfaGFzSGFzaENvZGUpIHsKKyAgICAgICAgICAgIF94aWZleHByZXNzaW9uXzEgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfeGlmZXhwcmVzc2lvbl8xID0gdGhpcy5oYXNTdXBlckhhc2hDb2RlKHN1cGVyQ2xhc3MpOworICAgICAgICAgIH0KKyAgICAgICAgICBfeGlmZXhwcmVzc2lvbiA9IF94aWZleHByZXNzaW9uXzE7CisgICAgICAgIH0KKyAgICAgICAgX3hibG9ja2V4cHJlc3Npb24gPSBfeGlmZXhwcmVzc2lvbjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfeGJsb2NrZXhwcmVzc2lvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkRXF1YWxzKGZpbmFsIE11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGNscywgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEZpZWxkRGVjbGFyYXRpb24+IGluY2x1ZGVkRmllbGRzLCBmaW5hbCBib29sZWFuIGluY2x1ZGVTdXBlcikgeworICAgICAgZmluYWwgUHJvY2VkdXJlMTxNdXRhYmxlTWV0aG9kRGVjbGFyYXRpb24+IF9mdW5jdGlvbiA9IChNdXRhYmxlTWV0aG9kRGVjbGFyYXRpb24gaXQpIC0+IHsKKyAgICAgICAgdGhpcy5jb250ZXh0LnNldFByaW1hcnlTb3VyY2VFbGVtZW50KGl0LCB0aGlzLmNvbnRleHQuZ2V0UHJpbWFyeVNvdXJjZUVsZW1lbnQoY2xzKSk7CisgICAgICAgIGl0LnNldFJldHVyblR5cGUodGhpcy5jb250ZXh0LmdldFByaW1pdGl2ZUJvb2xlYW4oKSk7CisgICAgICAgIGl0LmFkZEFubm90YXRpb24odGhpcy5jb250ZXh0Lm5ld0Fubm90YXRpb25SZWZlcmVuY2UoT3ZlcnJpZGUuY2xhc3MpKTsKKyAgICAgICAgaXQuYWRkQW5ub3RhdGlvbih0aGlzLmNvbnRleHQubmV3QW5ub3RhdGlvblJlZmVyZW5jZShQdXJlLmNsYXNzKSk7CisgICAgICAgIGl0LmFkZFBhcmFtZXRlcigib2JqIiwgdGhpcy5jb250ZXh0LmdldE9iamVjdCgpKTsKKyAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBfY2xpZW50ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQoKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kVG8oU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC5UYXJnZXRTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyKSB7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoImlmICh0aGlzID09IG9iaikiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuIHRydWU7Iik7CisgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoImlmIChvYmogPT0gbnVsbCkiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuIGZhbHNlOyIpOworICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuIGZhbHNlOyIpOworICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaW5jbHVkZVN1cGVyKSB7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJpZiAoIXN1cGVyLmVxdWFscyhvYmopKSIpOworICAgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJyZXR1cm4gZmFsc2U7Iik7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCBfc2l6ZSA9IEl0ZXJhYmxlRXh0ZW5zaW9ucy5zaXplKGluY2x1ZGVkRmllbGRzKTsKKyAgICAgICAgICAgICAgYm9vbGVhbiBfZ3JlYXRlclRoYW4gPSAoX3NpemUgPiAwKTsKKyAgICAgICAgICAgICAgaWYgKF9ncmVhdGVyVGhhbikgeworICAgICAgICAgICAgICAgIFR5cGVSZWZlcmVuY2UgX25ld1dpbGRDYXJkU2VsZlR5cGVSZWZlcmVuY2UgPSBVdGlsLnRoaXMubmV3V2lsZENhcmRTZWxmVHlwZVJlZmVyZW5jZShjbHMpOworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmV3V2lsZENhcmRTZWxmVHlwZVJlZmVyZW5jZSk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgb3RoZXIgPSAoIik7CisgICAgICAgICAgICAgICAgVHlwZVJlZmVyZW5jZSBfbmV3V2lsZENhcmRTZWxmVHlwZVJlZmVyZW5jZV8xID0gVXRpbC50aGlzLm5ld1dpbGRDYXJkU2VsZlR5cGVSZWZlcmVuY2UoY2xzKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25ld1dpbGRDYXJkU2VsZlR5cGVSZWZlcmVuY2VfMSk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIpIG9iajsiKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZvcihmaW5hbCBGaWVsZERlY2xhcmF0aW9uIGZpZWxkIDogaW5jbHVkZWRGaWVsZHMpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IF9jb250cmlidXRlVG9FcXVhbHMgPSBVdGlsLnRoaXMuY29udHJpYnV0ZVRvRXF1YWxzKGZpZWxkKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2NvbnRyaWJ1dGVUb0VxdWFscyk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJyZXR1cm4gdHJ1ZTsiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGl0LnNldEJvZHkoX2NsaWVudCk7CisgICAgICB9OworICAgICAgY2xzLmFkZE1ldGhvZCgiZXF1YWxzIiwgX2Z1bmN0aW9uKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBUeXBlUmVmZXJlbmNlIG5ld1dpbGRDYXJkU2VsZlR5cGVSZWZlcmVuY2UoZmluYWwgQ2xhc3NEZWNsYXJhdGlvbiBjbHMpIHsKKyAgICAgIGZpbmFsIEZ1bmN0aW9uMTxUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIFR5cGVSZWZlcmVuY2U+IF9mdW5jdGlvbiA9IChUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gaXQpIC0+IHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5uZXdXaWxkY2FyZFR5cGVSZWZlcmVuY2UodGhpcy5jb250ZXh0LmdldE9iamVjdCgpKTsKKyAgICAgIH07CisgICAgICByZXR1cm4gdGhpcy5jb250ZXh0Lm5ld1R5cGVSZWZlcmVuY2UoY2xzLCAoKFR5cGVSZWZlcmVuY2VbXSlDb252ZXJzaW9ucy51bndyYXBBcnJheShJdGVyYWJsZUV4dGVuc2lvbnMubWFwKGNscy5nZXRUeXBlUGFyYW1ldGVycygpLCBfZnVuY3Rpb24pLCBUeXBlUmVmZXJlbmNlLmNsYXNzKSkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBjb250cmlidXRlVG9FcXVhbHMoZmluYWwgRmllbGREZWNsYXJhdGlvbiBpdCkgeworICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBfc3dpdGNoUmVzdWx0ID0gbnVsbDsKKyAgICAgIFN0cmluZyBfbmFtZSA9IHRoaXMub3JPYmplY3QoaXQuZ2V0VHlwZSgpKS5nZXROYW1lKCk7CisgICAgICBib29sZWFuIF9tYXRjaGVkID0gZmFsc2U7CisgICAgICBTdHJpbmcgX25hbWVfMSA9IERvdWJsZS5UWVBFLmdldE5hbWUoKTsKKyAgICAgIGlmIChPYmplY3RzLmVxdWFsKF9uYW1lLCBfbmFtZV8xKSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IF9jbGllbnQgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCgpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRUbyhTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50LlRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIpIHsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiaWYgKCIpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKERvdWJsZS5jbGFzcyk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIi5kb3VibGVUb0xvbmdCaXRzKG90aGVyLiIpOworICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lID0gaXQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKSAhPSAiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChEb3VibGUuY2xhc3MpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuZG91YmxlVG9Mb25nQml0cyh0aGlzLiIpOworICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lXzEgPSBpdC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWVfMSk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIikpIik7CisgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJyZXR1cm4gZmFsc2U7ICIpOworICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IF9jbGllbnQ7CisgICAgICB9CisgICAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICAgIFN0cmluZyBfbmFtZV8yID0gRmxvYXQuVFlQRS5nZXROYW1lKCk7CisgICAgICAgIGlmIChPYmplY3RzLmVxdWFsKF9uYW1lLCBfbmFtZV8yKSkgeworICAgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBfY2xpZW50XzEgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kVG8oU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC5UYXJnZXRTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyKSB7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiaWYgKCIpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoRmxvYXQuY2xhc3MpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIi5mbG9hdFRvSW50Qml0cyhvdGhlci4iKTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lID0gaXQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWUpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIikgIT0gIik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChGbG9hdC5jbGFzcyk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLmZsb2F0VG9JbnRCaXRzKHRoaXMuIik7CisgICAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZV8xID0gaXQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWVfMSk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKSkiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoInJldHVybiBmYWxzZTsgIik7CisgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSBfY2xpZW50XzE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgICAgU3RyaW5nIF9uYW1lXzMgPSBCb29sZWFuLlRZUEUuZ2V0TmFtZSgpOworICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbChfbmFtZSwgX25hbWVfMykpIHsKKyAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgICAgICBTdHJpbmcgX25hbWVfNCA9IEludGVnZXIuVFlQRS5nZXROYW1lKCk7CisgICAgICAgICAgaWYgKE9iamVjdHMuZXF1YWwoX25hbWUsIF9uYW1lXzQpKSB7CisgICAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICAgICAgU3RyaW5nIF9uYW1lXzUgPSBDaGFyYWN0ZXIuVFlQRS5nZXROYW1lKCk7CisgICAgICAgICAgaWYgKE9iamVjdHMuZXF1YWwoX25hbWUsIF9uYW1lXzUpKSB7CisgICAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICAgICAgU3RyaW5nIF9uYW1lXzYgPSBCeXRlLlRZUEUuZ2V0TmFtZSgpOworICAgICAgICAgIGlmIChPYmplY3RzLmVxdWFsKF9uYW1lLCBfbmFtZV82KSkgeworICAgICAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgICAgIFN0cmluZyBfbmFtZV83ID0gU2hvcnQuVFlQRS5nZXROYW1lKCk7CisgICAgICAgICAgaWYgKE9iamVjdHMuZXF1YWwoX25hbWUsIF9uYW1lXzcpKSB7CisgICAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICAgICAgU3RyaW5nIF9uYW1lXzggPSBMb25nLlRZUEUuZ2V0TmFtZSgpOworICAgICAgICAgIGlmIChPYmplY3RzLmVxdWFsKF9uYW1lLCBfbmFtZV84KSkgeworICAgICAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9tYXRjaGVkKSB7CisgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBfY2xpZW50XzIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kVG8oU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC5UYXJnZXRTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyKSB7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiaWYgKG90aGVyLiIpOworICAgICAgICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWUgPSBpdC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfc2ltcGxlTmFtZSk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiICE9IHRoaXMuIik7CisgICAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZV8xID0gaXQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWVfMSk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKSIpOworICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuIGZhbHNlOyIpOworICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgICBfc3dpdGNoUmVzdWx0ID0gX2NsaWVudF8yOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgX2NsaWVudF8zID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQoKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kVG8oU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC5UYXJnZXRTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyKSB7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoImlmICh0aGlzLiIpOworICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lID0gaXQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiID09IG51bGwpIHsiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoImlmIChvdGhlci4iKTsKKyAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZV8xID0gaXQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lXzEsICIgICIpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgIT0gbnVsbCkiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiAgICAiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuIGZhbHNlOyIpOworICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9IGVsc2UgaWYgKCEiKTsKKyAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgX2RlZXBFcXVhbHMgPSBVdGlsLnRoaXMuZGVlcEVxdWFscyhpdCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2RlZXBFcXVhbHMpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIpIik7CisgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJyZXR1cm4gZmFsc2U7Iik7CisgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gX2NsaWVudF8zOworICAgICAgfQorICAgICAgcmV0dXJuIF9zd2l0Y2hSZXN1bHQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IGRlZXBFcXVhbHMoZmluYWwgRmllbGREZWNsYXJhdGlvbiBpdCkgeworICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBfeGlmZXhwcmVzc2lvbiA9IG51bGw7CisgICAgICBib29sZWFuIF9pc0FycmF5ID0gaXQuZ2V0VHlwZSgpLmlzQXJyYXkoKTsKKyAgICAgIGlmIChfaXNBcnJheSkgeworICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IF94aWZleHByZXNzaW9uXzEgPSBudWxsOworICAgICAgICBib29sZWFuIF9pc1ByaW1pdGl2ZSA9IGl0LmdldFR5cGUoKS5nZXRBcnJheUNvbXBvbmVudFR5cGUoKS5pc1ByaW1pdGl2ZSgpOworICAgICAgICBpZiAoX2lzUHJpbWl0aXZlKSB7CisgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBfY2xpZW50ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZFRvKFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQuVGFyZ2V0U3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcikgeworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoQXJyYXlzLmNsYXNzKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuZXF1YWxzKHRoaXMuIik7CisgICAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZSA9IGl0LmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIsIG90aGVyLiIpOworICAgICAgICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWVfMSA9IGl0LmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lXzEpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICAgIF94aWZleHByZXNzaW9uXzEgPSBfY2xpZW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgX2NsaWVudF8xID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZFRvKFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQuVGFyZ2V0U3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcikgeworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoQXJyYXlzLmNsYXNzKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuZGVlcEVxdWFscyh0aGlzLiIpOworICAgICAgICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWUgPSBpdC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfc2ltcGxlTmFtZSk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLCBvdGhlci4iKTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lXzEgPSBpdC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfc2ltcGxlTmFtZV8xKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgICBfeGlmZXhwcmVzc2lvbl8xID0gX2NsaWVudF8xOworICAgICAgICB9CisgICAgICAgIF94aWZleHByZXNzaW9uID0gX3hpZmV4cHJlc3Npb25fMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgX2NsaWVudF8yID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQoKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kVG8oU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC5UYXJnZXRTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyKSB7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoInRoaXMuIik7CisgICAgICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWUgPSBpdC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWUpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuZXF1YWxzKG90aGVyLiIpOworICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lXzEgPSBpdC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWVfMSk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIikiKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIF94aWZleHByZXNzaW9uID0gX2NsaWVudF8yOworICAgICAgfQorICAgICAgcmV0dXJuIF94aWZleHByZXNzaW9uOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRIYXNoQ29kZShmaW5hbCBNdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbiBjbHMsIGZpbmFsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBGaWVsZERlY2xhcmF0aW9uPiBpbmNsdWRlZEZpZWxkcywgZmluYWwgYm9vbGVhbiBpbmNsdWRlU3VwZXIpIHsKKyAgICAgIFN0cmluZyBfeGlmZXhwcmVzc2lvbiA9IG51bGw7CisgICAgICBpZiAoaW5jbHVkZVN1cGVyKSB7CisgICAgICAgIF94aWZleHByZXNzaW9uID0gInN1cGVyLmhhc2hDb2RlKCkiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3hpZmV4cHJlc3Npb24gPSAiMSI7CisgICAgICB9CisgICAgICBmaW5hbCBTdHJpbmcgZGVmYXVsdEJhc2UgPSBfeGlmZXhwcmVzc2lvbjsKKyAgICAgIGZpbmFsIGludCBmaWVsZHMgPSBJdGVyYWJsZUV4dGVuc2lvbnMuc2l6ZShpbmNsdWRlZEZpZWxkcyk7CisgICAgICBmaW5hbCBQcm9jZWR1cmUxPE11dGFibGVNZXRob2REZWNsYXJhdGlvbj4gX2Z1bmN0aW9uID0gKE11dGFibGVNZXRob2REZWNsYXJhdGlvbiBpdCkgLT4geworICAgICAgICB0aGlzLmNvbnRleHQuc2V0UHJpbWFyeVNvdXJjZUVsZW1lbnQoaXQsIHRoaXMuY29udGV4dC5nZXRQcmltYXJ5U291cmNlRWxlbWVudChjbHMpKTsKKyAgICAgICAgaXQuc2V0UmV0dXJuVHlwZSh0aGlzLmNvbnRleHQuZ2V0UHJpbWl0aXZlSW50KCkpOworICAgICAgICBpdC5hZGRBbm5vdGF0aW9uKHRoaXMuY29udGV4dC5uZXdBbm5vdGF0aW9uUmVmZXJlbmNlKE92ZXJyaWRlLmNsYXNzKSk7CisgICAgICAgIGl0LmFkZEFubm90YXRpb24odGhpcy5jb250ZXh0Lm5ld0Fubm90YXRpb25SZWZlcmVuY2UoUHVyZS5jbGFzcykpOworICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IF9jbGllbnQgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCgpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRUbyhTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50LlRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIpIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKChmaWVsZHMgPj0gMikpIHsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoImZpbmFsIGludCBwcmltZSA9ICIpOworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChFcXVhbHNIYXNoQ29kZVByb2Nlc3Nvci5VdGlsLlBSSU1FX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIjsiKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiaW50IHJlc3VsdCA9ICIpOworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChkZWZhdWx0QmFzZSk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCI7Iik7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBFeGNsdXNpdmVSYW5nZSBfZG91YmxlRG90TGVzc1RoYW4gPSBuZXcgRXhjbHVzaXZlUmFuZ2UoMCwgZmllbGRzLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgIGZvcihmaW5hbCBJbnRlZ2VyIGkgOiBfZG91YmxlRG90TGVzc1RoYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGkpLmludFZhbHVlKCkgPT0gKGZpZWxkcyAtIDEpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJyZXR1cm4iKTsKKyAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJyZXN1bHQgPSIpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiBwcmltZSAqIHJlc3VsdCArICIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IF9jb250cmlidXRlVG9IYXNoQ29kZSA9IFV0aWwudGhpcy5jb250cmlidXRlVG9IYXNoQ29kZSgoKEZpZWxkRGVjbGFyYXRpb25bXSlDb252ZXJzaW9ucy51bndyYXBBcnJheShpbmNsdWRlZEZpZWxkcywgRmllbGREZWNsYXJhdGlvbi5jbGFzcykpWyhpKS5pbnRWYWx1ZSgpXSk7CisgICAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfY29udHJpYnV0ZVRvSGFzaENvZGUpOworICAgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIjsiKTsKKyAgICAgICAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKChmaWVsZHMgPT0gMSkpIHsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuICIpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKEVxdWFsc0hhc2hDb2RlUHJvY2Vzc29yLlV0aWwuUFJJTUVfVkFMVUUpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgKiAiKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChkZWZhdWx0QmFzZSk7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiArICIpOworICAgICAgICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBfY29udHJpYnV0ZVRvSGFzaENvZGVfMSA9IFV0aWwudGhpcy5jb250cmlidXRlVG9IYXNoQ29kZShJdGVyYWJsZUV4dGVuc2lvbnMuaGVhZChpbmNsdWRlZEZpZWxkcykpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9jb250cmlidXRlVG9IYXNoQ29kZV8xKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiOyIpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJyZXR1cm4gIik7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoZGVmYXVsdEJhc2UpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCI7Iik7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgaXQuc2V0Qm9keShfY2xpZW50KTsKKyAgICAgIH07CisgICAgICBjbHMuYWRkTWV0aG9kKCJoYXNoQ29kZSIsIF9mdW5jdGlvbik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IGNvbnRyaWJ1dGVUb0hhc2hDb2RlKGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gaXQpIHsKKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgX3N3aXRjaFJlc3VsdCA9IG51bGw7CisgICAgICBTdHJpbmcgX25hbWUgPSB0aGlzLm9yT2JqZWN0KGl0LmdldFR5cGUoKSkuZ2V0TmFtZSgpOworICAgICAgYm9vbGVhbiBfbWF0Y2hlZCA9IGZhbHNlOworICAgICAgU3RyaW5nIF9uYW1lXzEgPSBEb3VibGUuVFlQRS5nZXROYW1lKCk7CisgICAgICBpZiAoT2JqZWN0cy5lcXVhbChfbmFtZSwgX25hbWVfMSkpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBfY2xpZW50ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQoKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kVG8oU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC5UYXJnZXRTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyKSB7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIihpbnQpICgiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChEb3VibGUuY2xhc3MpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuZG91YmxlVG9Mb25nQml0cyh0aGlzLiIpOworICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lID0gaXQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKSBeICgiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChEb3VibGUuY2xhc3MpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuZG91YmxlVG9Mb25nQml0cyh0aGlzLiIpOworICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lXzEgPSBpdC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWVfMSk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIikgPj4+IDMyKSkiKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSBfY2xpZW50OworICAgICAgfQorICAgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgICBTdHJpbmcgX25hbWVfMiA9IEZsb2F0LlRZUEUuZ2V0TmFtZSgpOworICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbChfbmFtZSwgX25hbWVfMikpIHsKKyAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgX2NsaWVudF8xID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZFRvKFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQuVGFyZ2V0U3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcikgeworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoRmxvYXQuY2xhc3MpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIi5mbG9hdFRvSW50Qml0cyh0aGlzLiIpOworICAgICAgICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWUgPSBpdC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfc2ltcGxlTmFtZSk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgICAgX3N3aXRjaFJlc3VsdCA9IF9jbGllbnRfMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgICBTdHJpbmcgX25hbWVfMyA9IEJvb2xlYW4uVFlQRS5nZXROYW1lKCk7CisgICAgICAgIGlmIChPYmplY3RzLmVxdWFsKF9uYW1lLCBfbmFtZV8zKSkgeworICAgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBfY2xpZW50XzIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kVG8oU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC5UYXJnZXRTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyKSB7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKHRoaXMuIik7CisgICAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZSA9IGl0LmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgPyAxMjMxIDogMTIzNykiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSBfY2xpZW50XzI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgICAgU3RyaW5nIF9uYW1lXzQgPSBJbnRlZ2VyLlRZUEUuZ2V0TmFtZSgpOworICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbChfbmFtZSwgX25hbWVfNCkpIHsKKyAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgICAgICBTdHJpbmcgX25hbWVfNSA9IENoYXJhY3Rlci5UWVBFLmdldE5hbWUoKTsKKyAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbChfbmFtZSwgX25hbWVfNSkpIHsKKyAgICAgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgICAgICBTdHJpbmcgX25hbWVfNiA9IEJ5dGUuVFlQRS5nZXROYW1lKCk7CisgICAgICAgICAgaWYgKE9iamVjdHMuZXF1YWwoX25hbWUsIF9uYW1lXzYpKSB7CisgICAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICAgICAgU3RyaW5nIF9uYW1lXzcgPSBTaG9ydC5UWVBFLmdldE5hbWUoKTsKKyAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbChfbmFtZSwgX25hbWVfNykpIHsKKyAgICAgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChfbWF0Y2hlZCkgeworICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgX2NsaWVudF8zID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZFRvKFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQuVGFyZ2V0U3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcikgeworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoInRoaXMuIik7CisgICAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZSA9IGl0LmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSBfY2xpZW50XzM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgICAgU3RyaW5nIF9uYW1lXzggPSBMb25nLlRZUEUuZ2V0TmFtZSgpOworICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbChfbmFtZSwgX25hbWVfOCkpIHsKKyAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgX2NsaWVudF80ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZFRvKFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQuVGFyZ2V0U3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcikgeworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIihpbnQpICh0aGlzLiIpOworICAgICAgICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWUgPSBpdC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfc2ltcGxlTmFtZSk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiIF4gKHRoaXMuIik7CisgICAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZV8xID0gaXQuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWVfMSk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiID4+PiAzMikpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgICBfc3dpdGNoUmVzdWx0ID0gX2NsaWVudF80OworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgX2NsaWVudF81ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQoKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kVG8oU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC5UYXJnZXRTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyKSB7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIigodGhpcy4iKTsKKyAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZSA9IGl0LmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfc2ltcGxlTmFtZSk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIj09IG51bGwpID8gMCA6ICIpOworICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBfZGVlcEhhc2hDb2RlID0gVXRpbC50aGlzLmRlZXBIYXNoQ29kZShpdCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2RlZXBIYXNoQ29kZSk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIikiKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSBfY2xpZW50XzU7CisgICAgICB9CisgICAgICByZXR1cm4gX3N3aXRjaFJlc3VsdDsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgZGVlcEhhc2hDb2RlKGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gaXQpIHsKKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgX3hibG9ja2V4cHJlc3Npb24gPSBudWxsOworICAgICAgeworICAgICAgICBmaW5hbCBUeXBlUmVmZXJlbmNlIHR5cGUgPSB0aGlzLm9yT2JqZWN0KGl0LmdldFR5cGUoKSk7CisgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgX3hpZmV4cHJlc3Npb24gPSBudWxsOworICAgICAgICBib29sZWFuIF9pc0FycmF5ID0gdHlwZS5pc0FycmF5KCk7CisgICAgICAgIGlmIChfaXNBcnJheSkgeworICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgX3hpZmV4cHJlc3Npb25fMSA9IG51bGw7CisgICAgICAgICAgYm9vbGVhbiBfaXNQcmltaXRpdmUgPSB0eXBlLmdldEFycmF5Q29tcG9uZW50VHlwZSgpLmlzUHJpbWl0aXZlKCk7CisgICAgICAgICAgaWYgKF9pc1ByaW1pdGl2ZSkgeworICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBfY2xpZW50ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQoKSB7CisgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRUbyhTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50LlRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIpIHsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoQXJyYXlzLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIi5oYXNoQ29kZSh0aGlzLiIpOworICAgICAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZSA9IGl0LmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWUpOworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKSIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgX3hpZmV4cHJlc3Npb25fMSA9IF9jbGllbnQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgX2NsaWVudF8xID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQoKSB7CisgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRUbyhTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50LlRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIpIHsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoQXJyYXlzLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIi5kZWVwSGFzaENvZGUodGhpcy4iKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWUgPSBpdC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIikiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIF94aWZleHByZXNzaW9uXzEgPSBfY2xpZW50XzE7CisgICAgICAgICAgfQorICAgICAgICAgIF94aWZleHByZXNzaW9uID0gX3hpZmV4cHJlc3Npb25fMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IF9jbGllbnRfMiA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRUbyhTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50LlRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIpIHsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ0aGlzLiIpOworICAgICAgICAgICAgICBTdHJpbmcgX3NpbXBsZU5hbWUgPSBpdC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfc2ltcGxlTmFtZSk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLmhhc2hDb2RlKCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICAgIF94aWZleHByZXNzaW9uID0gX2NsaWVudF8yOworICAgICAgICB9CisgICAgICAgIF94YmxvY2tleHByZXNzaW9uID0gX3hpZmV4cHJlc3Npb247CisgICAgICB9CisgICAgICByZXR1cm4gX3hibG9ja2V4cHJlc3Npb247CisgICAgfQorICAgIAorICAgIHByaXZhdGUgVHlwZVJlZmVyZW5jZSBvck9iamVjdChmaW5hbCBUeXBlUmVmZXJlbmNlIHJlZikgeworICAgICAgVHlwZVJlZmVyZW5jZSBfZWx2aXMgPSBudWxsOworICAgICAgaWYgKHJlZiAhPSBudWxsKSB7CisgICAgICAgIF9lbHZpcyA9IHJlZjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFR5cGVSZWZlcmVuY2UgX29iamVjdCA9IHRoaXMuY29udGV4dC5nZXRPYmplY3QoKTsKKyAgICAgICAgX2VsdmlzID0gX29iamVjdDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfZWx2aXM7CisgICAgfQorICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZG9UcmFuc2Zvcm0oZmluYWwgTXV0YWJsZUNsYXNzRGVjbGFyYXRpb24gaXQsIEBFeHRlbnNpb24gZmluYWwgVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKyAgICBBbm5vdGF0aW9uUmVmZXJlbmNlIF9maW5kQW5ub3RhdGlvbiA9IGl0LmZpbmRBbm5vdGF0aW9uKGNvbnRleHQuZmluZFR5cGVHbG9iYWxseShEYXRhLmNsYXNzKSk7CisgICAgYm9vbGVhbiBfdHJpcGxlTm90RXF1YWxzID0gKF9maW5kQW5ub3RhdGlvbiAhPSBudWxsKTsKKyAgICBpZiAoX3RyaXBsZU5vdEVxdWFscykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBARXh0ZW5zaW9uCisgICAgZmluYWwgRXF1YWxzSGFzaENvZGVQcm9jZXNzb3IuVXRpbCB1dGlsID0gbmV3IEVxdWFsc0hhc2hDb2RlUHJvY2Vzc29yLlV0aWwoY29udGV4dCk7CisgICAgYm9vbGVhbiBfaGFzRXF1YWxzID0gdXRpbC5oYXNFcXVhbHMoaXQpOworICAgIGlmIChfaGFzRXF1YWxzKSB7CisgICAgICBmaW5hbCBBbm5vdGF0aW9uUmVmZXJlbmNlIGFubm90YXRpb24gPSBpdC5maW5kQW5ub3RhdGlvbihjb250ZXh0LmZpbmRUeXBlR2xvYmFsbHkoRXF1YWxzSGFzaENvZGUuY2xhc3MpKTsKKyAgICAgIGNvbnRleHQuYWRkV2FybmluZyhhbm5vdGF0aW9uLCAiZXF1YWxzIGlzIGFscmVhZHkgZGVmaW5lZCwgdGhpcyBhbm5vdGF0aW9uIGhhcyBubyBlZmZlY3QiKTsKKyAgICB9IGVsc2UgeworICAgICAgYm9vbGVhbiBfaGFzSGFzaENvZGUgPSB1dGlsLmhhc0hhc2hDb2RlKGl0KTsKKyAgICAgIGlmIChfaGFzSGFzaENvZGUpIHsKKyAgICAgICAgY29udGV4dC5hZGRXYXJuaW5nKGl0LCAiaGFzaENvZGUgaXMgYWxyZWFkeSBkZWZpbmVkLCB0aGlzIGFubm90YXRpb24gaGFzIG5vIGVmZmVjdCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmluYWwgRnVuY3Rpb24xPE11dGFibGVGaWVsZERlY2xhcmF0aW9uLCBCb29sZWFuPiBfZnVuY3Rpb24gPSAoTXV0YWJsZUZpZWxkRGVjbGFyYXRpb24gaXRfMSkgLT4geworICAgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKCgoIWl0XzEuaXNTdGF0aWMoKSkgJiYgKCFpdF8xLmlzVHJhbnNpZW50KCkpKSAmJiBjb250ZXh0LmlzVGhlUHJpbWFyeUdlbmVyYXRlZEphdmFFbGVtZW50KGl0XzEpKSk7CisgICAgICAgIH07CisgICAgICAgIGZpbmFsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBNdXRhYmxlRmllbGREZWNsYXJhdGlvbj4gZmllbGRzID0gSXRlcmFibGVFeHRlbnNpb25zLmZpbHRlcihpdC5nZXREZWNsYXJlZEZpZWxkcygpLCBfZnVuY3Rpb24pOworICAgICAgICB1dGlsLmFkZEVxdWFscyhpdCwgZmllbGRzLCB1dGlsLmhhc1N1cGVyRXF1YWxzKGl0KSk7CisgICAgICAgIHV0aWwuYWRkSGFzaENvZGUoaXQsIGZpZWxkcywgdXRpbC5oYXNTdXBlckhhc2hDb2RlKGl0KSk7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9GaW5hbEZpZWxkc0NvbnN0cnVjdG9yLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9GaW5hbEZpZWxkc0NvbnN0cnVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQyMDQ4YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0ZpbmFsRmllbGRzQ29uc3RydWN0b3IuamF2YQpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9uczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uQWN0aXZlOworCisvKioKKyAqIDxwPkNyZWF0ZXMgYSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgcGFyYW1ldGVyIGZvciBlYWNoIGZpbmFsIGZpZWxkIG9mIGEgY2xhc3MuPC9wPgorICogCisgKiBBbm5vdGF0ZWQgb24gYSBjbGFzcworICogPHA+CisgKiBDcmVhdGVzIGEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhbGwKKyAqIG5vbi1zdGF0aWMsIGZpbmFsIGZpZWxkcyBvZiB0aGUgY2xhc3MgYXMgYW4gYXJndW1lbnQgYW5kIGFzc2lnbnMgdGhlbSB0bworICogdGhlaXIgY29ycmVzcG9uZGluZyBmaWVsZHMuIFRoZSBvcmRlciBvZiBhcmd1bWVudHMgaXMgdGhlIHNhbWUgYXMgdGhlIG9yZGVyCisgKiBvZiB0aGUgZmllbGRzLgorICogPC9wPgorICogQW5ub3RhdGVkIG9uIGEgY29uc3RydWN0b3IKKyAqIDxwPgorICogVHVybnMgdGhhdCBjb25zdHJ1Y3RvciBpbnRvIGEgZmluYWwKKyAqIGZpZWxkcyBjb25zdHJ1Y3RvciBhcyBkZXNjcmliZWQgYWJvdmUuIFRoaXMgaXMgdXNlZnVsIGZvciBhZGRpbmcgYW5ub3RhdGlvbnMKKyAqIHRvIHRoZSBjb25zdHJ1Y3RvciwgZS5nLiBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24gZnJhbWV3b3Jrcy4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIDIuNworICovCitAVGFyZ2V0KHsgRWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuQ09OU1RSVUNUT1IgfSkKK0BHd3RDb21wYXRpYmxlCitAQmV0YQorQEFjdGl2ZShGaW5hbEZpZWxkc0NvbnN0cnVjdG9yUHJvY2Vzc29yLmNsYXNzKQorQERvY3VtZW50ZWQKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIEBpbnRlcmZhY2UgRmluYWxGaWVsZHNDb25zdHJ1Y3RvciB7Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9GaW5hbEZpZWxkc0NvbnN0cnVjdG9yLnh0ZW5kIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvRmluYWxGaWVsZHNDb25zdHJ1Y3Rvci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWRiMzA3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvRmluYWxGaWVsZHNDb25zdHJ1Y3Rvci54dGVuZApAQCAtMCwwICsxLDE4NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnMKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGEKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdAoraW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFjdGl2ZQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5UcmFuc2Zvcm1hdGlvbkNvbnRleHQKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uVHJhbnNmb3JtYXRpb25QYXJ0aWNpcGFudAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVDbGFzc0RlY2xhcmF0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVUeXBlRGVjbGFyYXRpb24KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTXV0YWJsZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdG9yCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5UeXBlUmVmZXJlbmNlCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZAorCisvKioKKyAqIDxwPkNyZWF0ZXMgYSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgcGFyYW1ldGVyIGZvciBlYWNoIGZpbmFsIGZpZWxkIG9mIGEgY2xhc3MuPC9wPgorICogCisgKiBBbm5vdGF0ZWQgb24gYSBjbGFzcyAKKyAqIDxwPgorICogQ3JlYXRlcyBhIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYWxsCisgKiBub24tc3RhdGljLCBmaW5hbCBmaWVsZHMgb2YgdGhlIGNsYXNzIGFzIGFuIGFyZ3VtZW50IGFuZCBhc3NpZ25zIHRoZW0gdG8KKyAqIHRoZWlyIGNvcnJlc3BvbmRpbmcgZmllbGRzLiBUaGUgb3JkZXIgb2YgYXJndW1lbnRzIGlzIHRoZSBzYW1lIGFzIHRoZSBvcmRlcgorICogb2YgdGhlIGZpZWxkcy4KKyAqIDwvcD4KKyAqIEFubm90YXRlZCBvbiBhIGNvbnN0cnVjdG9yCisgKiA8cD4KKyAqIFR1cm5zIHRoYXQgY29uc3RydWN0b3IgaW50byBhIGZpbmFsCisgKiBmaWVsZHMgY29uc3RydWN0b3IgYXMgZGVzY3JpYmVkIGFib3ZlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgYWRkaW5nIGFubm90YXRpb25zCisgKiB0byB0aGUgY29uc3RydWN0b3IsIGUuZy4gZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGZyYW1ld29ya3MuCisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSAyLjcKKyAqLworQFRhcmdldChFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5DT05TVFJVQ1RPUikKK0BHd3RDb21wYXRpYmxlCitAQmV0YQorQEFjdGl2ZShGaW5hbEZpZWxkc0NvbnN0cnVjdG9yUHJvY2Vzc29yKQorQERvY3VtZW50ZWQKK2Fubm90YXRpb24gRmluYWxGaWVsZHNDb25zdHJ1Y3RvciB7Cit9CisKKy8qKgorICogQHNpbmNlIDIuNworICogQG5vZXh0ZW5kCisgKiBAbm9yZWZlcmVuY2UKKyAqLworQEJldGEKK2NsYXNzIEZpbmFsRmllbGRzQ29uc3RydWN0b3JQcm9jZXNzb3IgaW1wbGVtZW50cyBUcmFuc2Zvcm1hdGlvblBhcnRpY2lwYW50PE11dGFibGVUeXBlUGFyYW1ldGVyRGVjbGFyYXRvcj4geworCisJb3ZlcnJpZGUgZG9UcmFuc2Zvcm0oTGlzdDw/IGV4dGVuZHMgTXV0YWJsZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdG9yPiBlbGVtZW50cywKKwkJZXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWVsZW1lbnRzLmZvckVhY2hbdHJhbnNmb3JtKGNvbnRleHQpXQorCX0KKworCWRlZiBkaXNwYXRjaCB2b2lkIHRyYW5zZm9ybShNdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbiBpdCwgZXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWlmIChmaW5kQW5ub3RhdGlvbihEYXRhLmZpbmRUeXBlR2xvYmFsbHkpICE9PSBudWxsKSB7CisJCQlyZXR1cm4KKwkJfQorCQlpZiAoZmluZEFubm90YXRpb24oQWNjZXNzb3JzLmZpbmRUeXBlR2xvYmFsbHkpICE9PSBudWxsKSB7CisJCQlyZXR1cm4KKwkJfQorCQl2YWwgZXh0ZW5zaW9uIHV0aWwgPSBuZXcgRmluYWxGaWVsZHNDb25zdHJ1Y3RvclByb2Nlc3Nvci5VdGlsKGNvbnRleHQpCisJCWFkZEZpbmFsRmllbGRzQ29uc3RydWN0b3IKKwl9CisKKwlkZWYgZGlzcGF0Y2ggdm9pZCB0cmFuc2Zvcm0oTXV0YWJsZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gaXQsIGV4dGVuc2lvbiBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworCQl2YWwgZXh0ZW5zaW9uIHV0aWwgPSBuZXcgRmluYWxGaWVsZHNDb25zdHJ1Y3RvclByb2Nlc3Nvci5VdGlsKGNvbnRleHQpCisJCW1ha2VGaW5hbEZpZWxkc0NvbnN0cnVjdG9yCisJfQorCisJLyoqCisJICogQHNpbmNlIDIuNworCSAqIEBub2V4dGVuZAorCSAqIEBub3JlZmVyZW5jZQorCSAqLworCUBCZXRhCisJc3RhdGljIGNsYXNzIFV0aWwgeworCQlleHRlbnNpb24gVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQKKworCQluZXcoVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKwkJCXRoaXMuY29udGV4dCA9IGNvbnRleHQKKwkJfQorCisJCWRlZiBnZXRGaW5hbEZpZWxkcyhNdXRhYmxlVHlwZURlY2xhcmF0aW9uIGl0KSB7CisJCQlkZWNsYXJlZEZpZWxkcy5maWx0ZXJbIXN0YXRpYyAmJiBmaW5hbCA9PSB0cnVlICYmIGluaXRpYWxpemVyID09PSBudWxsICYmIHRoZVByaW1hcnlHZW5lcmF0ZWRKYXZhRWxlbWVudF0KKwkJfQorCisJCWRlZiBuZWVkc0ZpbmFsRmllbGRDb25zdHJ1Y3RvcihNdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbiBpdCkgeworCQkJIWhhc0ZpbmFsRmllbGRzQ29uc3RydWN0b3IKKwkJCSYmIChwcmltYXJ5U291cmNlRWxlbWVudCBhcyBDbGFzc0RlY2xhcmF0aW9uKS5kZWNsYXJlZENvbnN0cnVjdG9ycy5pc0VtcHR5CisJCX0KKworCQlkZWYgaGFzRmluYWxGaWVsZHNDb25zdHJ1Y3RvcihNdXRhYmxlVHlwZURlY2xhcmF0aW9uIGNscykgeworCQkJdmFsIGV4cGVjdGVkVHlwZXMgPSBjbHMuZmluYWxGaWVsZHNDb25zdHJ1Y3RvckFyZ3VtZW50VHlwZXMKKwkJCWNscy5kZWNsYXJlZENvbnN0cnVjdG9ycy5leGlzdHMgWworCQkJCXBhcmFtZXRlcnMubWFwW3R5cGVdLnRvTGlzdCA9PSBleHBlY3RlZFR5cGVzCisJCQldCisJCX0KKwkJCisJCWRlZiBnZXRGaW5hbEZpZWxkc0NvbnN0cnVjdG9yQXJndW1lbnRUeXBlcyhNdXRhYmxlVHlwZURlY2xhcmF0aW9uIGNscykgeworCQkJdmFsIHR5cGVzID0gbmV3QXJyYXlMaXN0CisJCQlpZiAoY2xzLnN1cGVyQ29uc3RydWN0b3IgIT09IG51bGwpIHsKKwkJCQl0eXBlcyArPSBjbHMuc3VwZXJDb25zdHJ1Y3Rvci5yZXNvbHZlZFBhcmFtZXRlcnMubWFwW3Jlc29sdmVkVHlwZV0KKwkJCX0KKwkJCXR5cGVzICs9IGNscy5maW5hbEZpZWxkcy5tYXBbdHlwZV0KKwkJCXR5cGVzCisJCX0KKwkJCisJCWRlZiBTdHJpbmcgZ2V0Q29uc3RydWN0b3JBbHJlYWR5RXhpc3RzTWVzc2FnZShNdXRhYmxlVHlwZURlY2xhcmF0aW9uIGl0KSB7CisJCQknJydDYW5ub3QgY3JlYXRlIEZpbmFsRmllbGRzQ29uc3RydWN0b3IgYXMgYSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBzaWduYXR1cmUgIm5ldyirZmluYWxGaWVsZHNDb25zdHJ1Y3RvckFyZ3VtZW50VHlwZXMuam9pbigiLCIpuykiIGFscmVhZHkgZXhpc3RzLicnJworCQl9CisKKwkJZGVmIGFkZEZpbmFsRmllbGRzQ29uc3RydWN0b3IoTXV0YWJsZUNsYXNzRGVjbGFyYXRpb24gaXQpIHsKKwkJCWlmIChmaW5hbEZpZWxkc0NvbnN0cnVjdG9yQXJndW1lbnRUeXBlcy5lbXB0eSkgeworCQkJCXZhbCBhbm5vID0gZmluZEFubm90YXRpb24oRmluYWxGaWVsZHNDb25zdHJ1Y3Rvci5maW5kVHlwZUdsb2JhbGx5KQorCQkJCWFubm8uYWRkV2FybmluZygnJydUaGVyZSBhcmUgbm8gZmluYWwgZmllbGRzLCB0aGlzIGFubm90YXRpb24gaGFzIG5vIGVmZmVjdCcnJykKKwkJCQlyZXR1cm4KKwkJCX0KKwkJCWlmIChoYXNGaW5hbEZpZWxkc0NvbnN0cnVjdG9yKSB7CisJCQkJYWRkRXJyb3IoY29uc3RydWN0b3JBbHJlYWR5RXhpc3RzTWVzc2FnZSkKKwkJCQlyZXR1cm4KKwkJCX0KKwkJCWFkZENvbnN0cnVjdG9yIFsKKwkJCQlwcmltYXJ5U291cmNlRWxlbWVudCA9IGRlY2xhcmluZ1R5cGUucHJpbWFyeVNvdXJjZUVsZW1lbnQKKwkJCQltYWtlRmluYWxGaWVsZHNDb25zdHJ1Y3RvcgorCQkJXQorCQl9CisJCQorCQlzdGF0aWMgdmFsIEVNUFRZX0JPRFkgPSBQYXR0ZXJuLmNvbXBpbGUoIihcXHsoXFxzKlxcfSk/KT8iKQorCisJCWRlZiBtYWtlRmluYWxGaWVsZHNDb25zdHJ1Y3RvcihNdXRhYmxlQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBpdCkgeworCQkJaWYgKGRlY2xhcmluZ1R5cGUuZmluYWxGaWVsZHNDb25zdHJ1Y3RvckFyZ3VtZW50VHlwZXMuZW1wdHkpIHsKKwkJCQl2YWwgYW5ubyA9IGZpbmRBbm5vdGF0aW9uKEZpbmFsRmllbGRzQ29uc3RydWN0b3IuZmluZFR5cGVHbG9iYWxseSkKKwkJCQlhbm5vLmFkZFdhcm5pbmcoJycnVGhlcmUgYXJlIG5vIGZpbmFsIGZpZWxkcywgdGhpcyBhbm5vdGF0aW9uIGhhcyBubyBlZmZlY3QnJycpCisJCQkJcmV0dXJuCisJCQl9CisJCQlpZiAoZGVjbGFyaW5nVHlwZS5oYXNGaW5hbEZpZWxkc0NvbnN0cnVjdG9yKSB7CisJCQkJYWRkRXJyb3IoZGVjbGFyaW5nVHlwZS5jb25zdHJ1Y3RvckFscmVhZHlFeGlzdHNNZXNzYWdlKQorCQkJCXJldHVybgorCQkJfQorCQkJaWYgKCFwYXJhbWV0ZXJzLmVtcHR5KSB7CisJCQkJYWRkRXJyb3IoIlBhcmFtZXRlciBsaXN0IG11c3QgYmUgZW1wdHkiKQorCQkJfQorCQkJaWYgKGJvZHkgIT09IG51bGwgJiYgIUVNUFRZX0JPRFkubWF0Y2hlcihib2R5LnRvU3RyaW5nKS5tYXRjaGVzKSB7CisJCQkJYWRkRXJyb3IoIkJvZHkgbXVzdCBiZSBlbXB0eSIpCisJCQl9CisJCQl2YWwgc3VwZXJQYXJhbWV0ZXJzID0gZGVjbGFyaW5nVHlwZS5zdXBlckNvbnN0cnVjdG9yPy5yZXNvbHZlZFBhcmFtZXRlcnMgPzogI1tdCisJCQlzdXBlclBhcmFtZXRlcnMuZm9yRWFjaCBbIHAgfAorCQkJCWFkZFBhcmFtZXRlcihwLmRlY2xhcmF0aW9uLnNpbXBsZU5hbWUsIHAucmVzb2x2ZWRUeXBlKQorCQkJXQorCQkJdmFsIGZpZWxkVG9QYXJhbWV0ZXIgPSBuZXdIYXNoTWFwCisJCQlkZWNsYXJpbmdUeXBlLmZpbmFsRmllbGRzLmZvckVhY2ggWyBwIHwKKwkJCQlwLm1hcmtBc0luaXRpYWxpemVkQnkoaXQpCisJCQkJdmFsIHBhcmFtID0gYWRkUGFyYW1ldGVyKHAuc2ltcGxlTmFtZSwgcC50eXBlLm9yT2JqZWN0KQorCQkJCWZpZWxkVG9QYXJhbWV0ZXIucHV0KHAsIHBhcmFtKQorCQkJXQorCQkJYm9keSA9ICcnJworCQkJCXN1cGVyKKtzdXBlclBhcmFtZXRlcnMuam9pbigiLCAiKVtkZWNsYXJhdGlvbi5zaW1wbGVOYW1lXbspOworCQkJCatGT1IgYXJnIDogZGVjbGFyaW5nVHlwZS5maW5hbEZpZWxkc7sKKwkJCQkJdGhpcy6rYXJnLnNpbXBsZU5hbWW7ID0gq2ZpZWxkVG9QYXJhbWV0ZXIuZ2V0KGFyZykuc2ltcGxlTmFtZbs7CisJCQkJq0VOREZPUrsKKwkJCScnJworCQl9CisKKwkJZGVmIGdldFN1cGVyQ29uc3RydWN0b3IoVHlwZURlY2xhcmF0aW9uIGl0KSB7CisJCQlpZiAoaXQgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7CisJCQkJaWYgKGV4dGVuZGVkQ2xhc3MgPT0gb2JqZWN0IHx8IGV4dGVuZGVkQ2xhc3MgPT09IG51bGwpCisJCQkJCXJldHVybiBudWxsOworCQkJCXJldHVybiBleHRlbmRlZENsYXNzLmRlY2xhcmVkUmVzb2x2ZWRDb25zdHJ1Y3RvcnMuaGVhZAorCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gbnVsbAorCQkJfQorCQl9CisJCQorCQlwcml2YXRlIGRlZiBvck9iamVjdChUeXBlUmVmZXJlbmNlIHJlZikgeworCQkJaWYgKHJlZiA9PT0gbnVsbCkgb2JqZWN0IGVsc2UgcmVmCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9GaW5hbEZpZWxkc0NvbnN0cnVjdG9yUHJvY2Vzc29yLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9GaW5hbEZpZWxkc0NvbnN0cnVjdG9yUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4NjQzOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0ZpbmFsRmllbGRzQ29uc3RydWN0b3JQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDI3NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uVHJhbnNmb3JtYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5UcmFuc2Zvcm1hdGlvblBhcnRpY2lwYW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTXV0YWJsZUNvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVGaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlUGFyYW1ldGVyRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVUeXBlUGFyYW1ldGVyRGVjbGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uUmVzb2x2ZWRDb25zdHJ1Y3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uUmVzb2x2ZWRQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQyLmxpYi5TdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Db2xsZWN0aW9uTGl0ZXJhbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuSXRlcmFibGVFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzLlByb2NlZHVyZTE7CisKKy8qKgorICogQHNpbmNlIDIuNworICogQG5vZXh0ZW5kCisgKiBAbm9yZWZlcmVuY2UKKyAqLworQEJldGEKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEZpbmFsRmllbGRzQ29uc3RydWN0b3JQcm9jZXNzb3IgaW1wbGVtZW50cyBUcmFuc2Zvcm1hdGlvblBhcnRpY2lwYW50PE11dGFibGVUeXBlUGFyYW1ldGVyRGVjbGFyYXRvcj4geworICAvKioKKyAgICogQHNpbmNlIDIuNworICAgKiBAbm9leHRlbmQKKyAgICogQG5vcmVmZXJlbmNlCisgICAqLworICBAQmV0YQorICBwdWJsaWMgc3RhdGljIGNsYXNzIFV0aWwgeworICAgIEBFeHRlbnNpb24KKyAgICBwcml2YXRlIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0OworICAgIAorICAgIHB1YmxpYyBVdGlsKGZpbmFsIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgSXRlcmFibGU8PyBleHRlbmRzIE11dGFibGVGaWVsZERlY2xhcmF0aW9uPiBnZXRGaW5hbEZpZWxkcyhmaW5hbCBNdXRhYmxlVHlwZURlY2xhcmF0aW9uIGl0KSB7CisgICAgICBmaW5hbCBGdW5jdGlvbjE8TXV0YWJsZUZpZWxkRGVjbGFyYXRpb24sIEJvb2xlYW4+IF9mdW5jdGlvbiA9IChNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBpdF8xKSAtPiB7CisgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKCgoKCFpdF8xLmlzU3RhdGljKCkpICYmIChpdF8xLmlzRmluYWwoKSA9PSB0cnVlKSkgJiYgKGl0XzEuZ2V0SW5pdGlhbGl6ZXIoKSA9PSBudWxsKSkgJiYgdGhpcy5jb250ZXh0LmlzVGhlUHJpbWFyeUdlbmVyYXRlZEphdmFFbGVtZW50KGl0XzEpKSk7CisgICAgICB9OworICAgICAgcmV0dXJuIEl0ZXJhYmxlRXh0ZW5zaW9ucy5maWx0ZXIoaXQuZ2V0RGVjbGFyZWRGaWVsZHMoKSwgX2Z1bmN0aW9uKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNGaW5hbEZpZWxkQ29uc3RydWN0b3IoZmluYWwgTXV0YWJsZUNsYXNzRGVjbGFyYXRpb24gaXQpIHsKKyAgICAgIHJldHVybiAoKCF0aGlzLmhhc0ZpbmFsRmllbGRzQ29uc3RydWN0b3IoaXQpKSAmJiBJdGVyYWJsZUV4dGVuc2lvbnMuaXNFbXB0eSgoKENsYXNzRGVjbGFyYXRpb24pIHRoaXMuY29udGV4dC5nZXRQcmltYXJ5U291cmNlRWxlbWVudChpdCkpLmdldERlY2xhcmVkQ29uc3RydWN0b3JzKCkpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaGFzRmluYWxGaWVsZHNDb25zdHJ1Y3RvcihmaW5hbCBNdXRhYmxlVHlwZURlY2xhcmF0aW9uIGNscykgeworICAgICAgYm9vbGVhbiBfeGJsb2NrZXhwcmVzc2lvbiA9IGZhbHNlOworICAgICAgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8VHlwZVJlZmVyZW5jZT4gZXhwZWN0ZWRUeXBlcyA9IHRoaXMuZ2V0RmluYWxGaWVsZHNDb25zdHJ1Y3RvckFyZ3VtZW50VHlwZXMoY2xzKTsKKyAgICAgICAgZmluYWwgRnVuY3Rpb24xPE11dGFibGVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBCb29sZWFuPiBfZnVuY3Rpb24gPSAoTXV0YWJsZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gaXQpIC0+IHsKKyAgICAgICAgICBmaW5hbCBGdW5jdGlvbjE8TXV0YWJsZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBUeXBlUmVmZXJlbmNlPiBfZnVuY3Rpb25fMSA9IChNdXRhYmxlUGFyYW1ldGVyRGVjbGFyYXRpb24gaXRfMSkgLT4geworICAgICAgICAgICAgcmV0dXJuIGl0XzEuZ2V0VHlwZSgpOworICAgICAgICAgIH07CisgICAgICAgICAgTGlzdDxUeXBlUmVmZXJlbmNlPiBfbGlzdCA9IEl0ZXJhYmxlRXh0ZW5zaW9ucy48VHlwZVJlZmVyZW5jZT50b0xpc3QoSXRlcmFibGVFeHRlbnNpb25zLm1hcChpdC5nZXRQYXJhbWV0ZXJzKCksIF9mdW5jdGlvbl8xKSk7CisgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihPYmplY3RzLmVxdWFsKF9saXN0LCBleHBlY3RlZFR5cGVzKSk7CisgICAgICAgIH07CisgICAgICAgIF94YmxvY2tleHByZXNzaW9uID0gSXRlcmFibGVFeHRlbnNpb25zLmV4aXN0cyhjbHMuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKSwgX2Z1bmN0aW9uKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfeGJsb2NrZXhwcmVzc2lvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFycmF5TGlzdDxUeXBlUmVmZXJlbmNlPiBnZXRGaW5hbEZpZWxkc0NvbnN0cnVjdG9yQXJndW1lbnRUeXBlcyhmaW5hbCBNdXRhYmxlVHlwZURlY2xhcmF0aW9uIGNscykgeworICAgICAgQXJyYXlMaXN0PFR5cGVSZWZlcmVuY2U+IF94YmxvY2tleHByZXNzaW9uID0gbnVsbDsKKyAgICAgIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PFR5cGVSZWZlcmVuY2U+IHR5cGVzID0gQ29sbGVjdGlvbkxpdGVyYWxzLjxUeXBlUmVmZXJlbmNlPm5ld0FycmF5TGlzdCgpOworICAgICAgICBSZXNvbHZlZENvbnN0cnVjdG9yIF9zdXBlckNvbnN0cnVjdG9yID0gdGhpcy5nZXRTdXBlckNvbnN0cnVjdG9yKGNscyk7CisgICAgICAgIGJvb2xlYW4gX3RyaXBsZU5vdEVxdWFscyA9IChfc3VwZXJDb25zdHJ1Y3RvciAhPSBudWxsKTsKKyAgICAgICAgaWYgKF90cmlwbGVOb3RFcXVhbHMpIHsKKyAgICAgICAgICBmaW5hbCBGdW5jdGlvbjE8UmVzb2x2ZWRQYXJhbWV0ZXIsIFR5cGVSZWZlcmVuY2U+IF9mdW5jdGlvbiA9IChSZXNvbHZlZFBhcmFtZXRlciBpdCkgLT4geworICAgICAgICAgICAgcmV0dXJuIGl0LmdldFJlc29sdmVkVHlwZSgpOworICAgICAgICAgIH07CisgICAgICAgICAgSXRlcmFibGU8VHlwZVJlZmVyZW5jZT4gX21hcCA9IEl0ZXJhYmxlRXh0ZW5zaW9ucy5tYXAodGhpcy5nZXRTdXBlckNvbnN0cnVjdG9yKGNscykuZ2V0UmVzb2x2ZWRQYXJhbWV0ZXJzKCksIF9mdW5jdGlvbik7CisgICAgICAgICAgSXRlcmFibGVzLjxUeXBlUmVmZXJlbmNlPmFkZEFsbCh0eXBlcywgX21hcCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgRnVuY3Rpb24xPE11dGFibGVGaWVsZERlY2xhcmF0aW9uLCBUeXBlUmVmZXJlbmNlPiBfZnVuY3Rpb25fMSA9IChNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBpdCkgLT4geworICAgICAgICAgIHJldHVybiBpdC5nZXRUeXBlKCk7CisgICAgICAgIH07CisgICAgICAgIEl0ZXJhYmxlPFR5cGVSZWZlcmVuY2U+IF9tYXBfMSA9IEl0ZXJhYmxlRXh0ZW5zaW9ucy5tYXAodGhpcy5nZXRGaW5hbEZpZWxkcyhjbHMpLCBfZnVuY3Rpb25fMSk7CisgICAgICAgIEl0ZXJhYmxlcy48VHlwZVJlZmVyZW5jZT5hZGRBbGwodHlwZXMsIF9tYXBfMSk7CisgICAgICAgIF94YmxvY2tleHByZXNzaW9uID0gdHlwZXM7CisgICAgICB9CisgICAgICByZXR1cm4gX3hibG9ja2V4cHJlc3Npb247CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uc3RydWN0b3JBbHJlYWR5RXhpc3RzTWVzc2FnZShmaW5hbCBNdXRhYmxlVHlwZURlY2xhcmF0aW9uIGl0KSB7CisgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiQ2Fubm90IGNyZWF0ZSBGaW5hbEZpZWxkc0NvbnN0cnVjdG9yIGFzIGEgY29uc3RydWN0b3Igd2l0aCB0aGUgc2lnbmF0dXJlIFwibmV3KCIpOworICAgICAgU3RyaW5nIF9qb2luID0gSXRlcmFibGVFeHRlbnNpb25zLmpvaW4odGhpcy5nZXRGaW5hbEZpZWxkc0NvbnN0cnVjdG9yQXJndW1lbnRUeXBlcyhpdCksICIsIik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoX2pvaW4pOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCIpXCIgYWxyZWFkeSBleGlzdHMuIik7CisgICAgICByZXR1cm4gX2J1aWxkZXIudG9TdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkRmluYWxGaWVsZHNDb25zdHJ1Y3RvcihmaW5hbCBNdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbiBpdCkgeworICAgICAgYm9vbGVhbiBfaXNFbXB0eSA9IHRoaXMuZ2V0RmluYWxGaWVsZHNDb25zdHJ1Y3RvckFyZ3VtZW50VHlwZXMoaXQpLmlzRW1wdHkoKTsKKyAgICAgIGlmIChfaXNFbXB0eSkgeworICAgICAgICBmaW5hbCBBbm5vdGF0aW9uUmVmZXJlbmNlIGFubm8gPSBpdC5maW5kQW5ub3RhdGlvbih0aGlzLmNvbnRleHQuZmluZFR5cGVHbG9iYWxseShGaW5hbEZpZWxkc0NvbnN0cnVjdG9yLmNsYXNzKSk7CisgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlRoZXJlIGFyZSBubyBmaW5hbCBmaWVsZHMsIHRoaXMgYW5ub3RhdGlvbiBoYXMgbm8gZWZmZWN0Iik7CisgICAgICAgIHRoaXMuY29udGV4dC5hZGRXYXJuaW5nKGFubm8sIF9idWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBib29sZWFuIF9oYXNGaW5hbEZpZWxkc0NvbnN0cnVjdG9yID0gdGhpcy5oYXNGaW5hbEZpZWxkc0NvbnN0cnVjdG9yKGl0KTsKKyAgICAgIGlmIChfaGFzRmluYWxGaWVsZHNDb25zdHJ1Y3RvcikgeworICAgICAgICB0aGlzLmNvbnRleHQuYWRkRXJyb3IoaXQsIHRoaXMuZ2V0Q29uc3RydWN0b3JBbHJlYWR5RXhpc3RzTWVzc2FnZShpdCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBmaW5hbCBQcm9jZWR1cmUxPE11dGFibGVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiBfZnVuY3Rpb24gPSAoTXV0YWJsZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gaXRfMSkgLT4geworICAgICAgICB0aGlzLmNvbnRleHQuc2V0UHJpbWFyeVNvdXJjZUVsZW1lbnQoaXRfMSwgdGhpcy5jb250ZXh0LmdldFByaW1hcnlTb3VyY2VFbGVtZW50KGl0XzEuZ2V0RGVjbGFyaW5nVHlwZSgpKSk7CisgICAgICAgIHRoaXMubWFrZUZpbmFsRmllbGRzQ29uc3RydWN0b3IoaXRfMSk7CisgICAgICB9OworICAgICAgaXQuYWRkQ29uc3RydWN0b3IoX2Z1bmN0aW9uKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBFTVBUWV9CT0RZID0gUGF0dGVybi5jb21waWxlKCIoXFx7KFxccypcXH0pPyk/Iik7CisgICAgCisgICAgcHVibGljIHZvaWQgbWFrZUZpbmFsRmllbGRzQ29uc3RydWN0b3IoZmluYWwgTXV0YWJsZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gaXQpIHsKKyAgICAgIGJvb2xlYW4gX2lzRW1wdHkgPSB0aGlzLmdldEZpbmFsRmllbGRzQ29uc3RydWN0b3JBcmd1bWVudFR5cGVzKGl0LmdldERlY2xhcmluZ1R5cGUoKSkuaXNFbXB0eSgpOworICAgICAgaWYgKF9pc0VtcHR5KSB7CisgICAgICAgIGZpbmFsIEFubm90YXRpb25SZWZlcmVuY2UgYW5ubyA9IGl0LmZpbmRBbm5vdGF0aW9uKHRoaXMuY29udGV4dC5maW5kVHlwZUdsb2JhbGx5KEZpbmFsRmllbGRzQ29uc3RydWN0b3IuY2xhc3MpKTsKKyAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiVGhlcmUgYXJlIG5vIGZpbmFsIGZpZWxkcywgdGhpcyBhbm5vdGF0aW9uIGhhcyBubyBlZmZlY3QiKTsKKyAgICAgICAgdGhpcy5jb250ZXh0LmFkZFdhcm5pbmcoYW5ubywgX2J1aWxkZXIudG9TdHJpbmcoKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGJvb2xlYW4gX2hhc0ZpbmFsRmllbGRzQ29uc3RydWN0b3IgPSB0aGlzLmhhc0ZpbmFsRmllbGRzQ29uc3RydWN0b3IoaXQuZ2V0RGVjbGFyaW5nVHlwZSgpKTsKKyAgICAgIGlmIChfaGFzRmluYWxGaWVsZHNDb25zdHJ1Y3RvcikgeworICAgICAgICB0aGlzLmNvbnRleHQuYWRkRXJyb3IoaXQsIHRoaXMuZ2V0Q29uc3RydWN0b3JBbHJlYWR5RXhpc3RzTWVzc2FnZShpdC5nZXREZWNsYXJpbmdUeXBlKCkpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYm9vbGVhbiBfaXNFbXB0eV8xID0gSXRlcmFibGVFeHRlbnNpb25zLmlzRW1wdHkoaXQuZ2V0UGFyYW1ldGVycygpKTsKKyAgICAgIGJvb2xlYW4gX25vdCA9ICghX2lzRW1wdHlfMSk7CisgICAgICBpZiAoX25vdCkgeworICAgICAgICB0aGlzLmNvbnRleHQuYWRkRXJyb3IoaXQsICJQYXJhbWV0ZXIgbGlzdCBtdXN0IGJlIGVtcHR5Iik7CisgICAgICB9CisgICAgICBpZiAoKChpdC5nZXRCb2R5KCkgIT0gbnVsbCkgJiYgKCFGaW5hbEZpZWxkc0NvbnN0cnVjdG9yUHJvY2Vzc29yLlV0aWwuRU1QVFlfQk9EWS5tYXRjaGVyKGl0LmdldEJvZHkoKS50b1N0cmluZygpKS5tYXRjaGVzKCkpKSkgeworICAgICAgICB0aGlzLmNvbnRleHQuYWRkRXJyb3IoaXQsICJCb2R5IG11c3QgYmUgZW1wdHkiKTsKKyAgICAgIH0KKyAgICAgIEl0ZXJhYmxlPD8gZXh0ZW5kcyBSZXNvbHZlZFBhcmFtZXRlcj4gX2VsdmlzID0gbnVsbDsKKyAgICAgIFJlc29sdmVkQ29uc3RydWN0b3IgX3N1cGVyQ29uc3RydWN0b3IgPSB0aGlzLmdldFN1cGVyQ29uc3RydWN0b3IoaXQuZ2V0RGVjbGFyaW5nVHlwZSgpKTsKKyAgICAgIEl0ZXJhYmxlPD8gZXh0ZW5kcyBSZXNvbHZlZFBhcmFtZXRlcj4gX3Jlc29sdmVkUGFyYW1ldGVycyA9IG51bGw7CisgICAgICBpZiAoX3N1cGVyQ29uc3RydWN0b3IhPW51bGwpIHsKKyAgICAgICAgX3Jlc29sdmVkUGFyYW1ldGVycz1fc3VwZXJDb25zdHJ1Y3Rvci5nZXRSZXNvbHZlZFBhcmFtZXRlcnMoKTsKKyAgICAgIH0KKyAgICAgIGlmIChfcmVzb2x2ZWRQYXJhbWV0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgX2VsdmlzID0gX3Jlc29sdmVkUGFyYW1ldGVyczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9lbHZpcyA9IENvbGxlY3Rpb25zLjxSZXNvbHZlZFBhcmFtZXRlcj51bm1vZGlmaWFibGVMaXN0KENvbGxlY3Rpb25MaXRlcmFscy48UmVzb2x2ZWRQYXJhbWV0ZXI+bmV3QXJyYXlMaXN0KCkpOworICAgICAgfQorICAgICAgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIFJlc29sdmVkUGFyYW1ldGVyPiBzdXBlclBhcmFtZXRlcnMgPSBfZWx2aXM7CisgICAgICBmaW5hbCBDb25zdW1lcjxSZXNvbHZlZFBhcmFtZXRlcj4gX2Z1bmN0aW9uID0gKFJlc29sdmVkUGFyYW1ldGVyIHApIC0+IHsKKyAgICAgICAgaXQuYWRkUGFyYW1ldGVyKHAuZ2V0RGVjbGFyYXRpb24oKS5nZXRTaW1wbGVOYW1lKCksIHAuZ2V0UmVzb2x2ZWRUeXBlKCkpOworICAgICAgfTsKKyAgICAgIHN1cGVyUGFyYW1ldGVycy5mb3JFYWNoKF9mdW5jdGlvbik7CisgICAgICBmaW5hbCBIYXNoTWFwPE11dGFibGVGaWVsZERlY2xhcmF0aW9uLCBNdXRhYmxlUGFyYW1ldGVyRGVjbGFyYXRpb24+IGZpZWxkVG9QYXJhbWV0ZXIgPSBDb2xsZWN0aW9uTGl0ZXJhbHMuPE11dGFibGVGaWVsZERlY2xhcmF0aW9uLCBNdXRhYmxlUGFyYW1ldGVyRGVjbGFyYXRpb24+bmV3SGFzaE1hcCgpOworICAgICAgZmluYWwgQ29uc3VtZXI8TXV0YWJsZUZpZWxkRGVjbGFyYXRpb24+IF9mdW5jdGlvbl8xID0gKE11dGFibGVGaWVsZERlY2xhcmF0aW9uIHApIC0+IHsKKyAgICAgICAgcC5tYXJrQXNJbml0aWFsaXplZEJ5KGl0KTsKKyAgICAgICAgZmluYWwgTXV0YWJsZVBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtID0gaXQuYWRkUGFyYW1ldGVyKHAuZ2V0U2ltcGxlTmFtZSgpLCB0aGlzLm9yT2JqZWN0KHAuZ2V0VHlwZSgpKSk7CisgICAgICAgIGZpZWxkVG9QYXJhbWV0ZXIucHV0KHAsIHBhcmFtKTsKKyAgICAgIH07CisgICAgICB0aGlzLmdldEZpbmFsRmllbGRzKGl0LmdldERlY2xhcmluZ1R5cGUoKSkuZm9yRWFjaChfZnVuY3Rpb25fMSk7CisgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IF9jbGllbnQgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZFRvKFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQuVGFyZ2V0U3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcikgeworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgic3VwZXIoIik7CisgICAgICAgICAgZmluYWwgRnVuY3Rpb24xPFJlc29sdmVkUGFyYW1ldGVyLCBDaGFyU2VxdWVuY2U+IF9mdW5jdGlvbiA9IChSZXNvbHZlZFBhcmFtZXRlciBpdF8xKSAtPiB7CisgICAgICAgICAgICByZXR1cm4gaXRfMS5nZXREZWNsYXJhdGlvbigpLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICB9OworICAgICAgICAgIFN0cmluZyBfam9pbiA9IEl0ZXJhYmxlRXh0ZW5zaW9ucy5qb2luKHN1cGVyUGFyYW1ldGVycywgIiwgIiwgX2Z1bmN0aW9uKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2pvaW4pOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKTsiKTsKKyAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgIHsKKyAgICAgICAgICAgIEl0ZXJhYmxlPD8gZXh0ZW5kcyBNdXRhYmxlRmllbGREZWNsYXJhdGlvbj4gX2ZpbmFsRmllbGRzID0gVXRpbC50aGlzLmdldEZpbmFsRmllbGRzKGl0LmdldERlY2xhcmluZ1R5cGUoKSk7CisgICAgICAgICAgICBmb3IoZmluYWwgTXV0YWJsZUZpZWxkRGVjbGFyYXRpb24gYXJnIDogX2ZpbmFsRmllbGRzKSB7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgidGhpcy4iKTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lID0gYXJnLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgPSAiKTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lXzEgPSBmaWVsZFRvUGFyYW1ldGVyLmdldChhcmcpLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lXzEpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIjsiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICBpdC5zZXRCb2R5KF9jbGllbnQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgUmVzb2x2ZWRDb25zdHJ1Y3RvciBnZXRTdXBlckNvbnN0cnVjdG9yKGZpbmFsIFR5cGVEZWNsYXJhdGlvbiBpdCkgeworICAgICAgaWYgKChpdCBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pKSB7CisgICAgICAgIGlmICgoT2JqZWN0cy5lcXVhbCgoKENsYXNzRGVjbGFyYXRpb24paXQpLmdldEV4dGVuZGVkQ2xhc3MoKSwgdGhpcy5jb250ZXh0LmdldE9iamVjdCgpKSB8fCAoKChDbGFzc0RlY2xhcmF0aW9uKWl0KS5nZXRFeHRlbmRlZENsYXNzKCkgPT0gbnVsbCkpKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEl0ZXJhYmxlRXh0ZW5zaW9ucy5oZWFkKCgoQ2xhc3NEZWNsYXJhdGlvbilpdCkuZ2V0RXh0ZW5kZWRDbGFzcygpLmdldERlY2xhcmVkUmVzb2x2ZWRDb25zdHJ1Y3RvcnMoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBUeXBlUmVmZXJlbmNlIG9yT2JqZWN0KGZpbmFsIFR5cGVSZWZlcmVuY2UgcmVmKSB7CisgICAgICBUeXBlUmVmZXJlbmNlIF94aWZleHByZXNzaW9uID0gbnVsbDsKKyAgICAgIGlmICgocmVmID09IG51bGwpKSB7CisgICAgICAgIF94aWZleHByZXNzaW9uID0gdGhpcy5jb250ZXh0LmdldE9iamVjdCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3hpZmV4cHJlc3Npb24gPSByZWY7CisgICAgICB9CisgICAgICByZXR1cm4gX3hpZmV4cHJlc3Npb247CisgICAgfQorICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZG9UcmFuc2Zvcm0oZmluYWwgTGlzdDw/IGV4dGVuZHMgTXV0YWJsZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdG9yPiBlbGVtZW50cywgQEV4dGVuc2lvbiBmaW5hbCBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworICAgIGZpbmFsIENvbnN1bWVyPE11dGFibGVUeXBlUGFyYW1ldGVyRGVjbGFyYXRvcj4gX2Z1bmN0aW9uID0gKE11dGFibGVUeXBlUGFyYW1ldGVyRGVjbGFyYXRvciBpdCkgLT4geworICAgICAgdGhpcy50cmFuc2Zvcm0oaXQsIGNvbnRleHQpOworICAgIH07CisgICAgZWxlbWVudHMuZm9yRWFjaChfZnVuY3Rpb24pOworICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCBfdHJhbnNmb3JtKGZpbmFsIE11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGl0LCBARXh0ZW5zaW9uIGZpbmFsIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgQW5ub3RhdGlvblJlZmVyZW5jZSBfZmluZEFubm90YXRpb24gPSBpdC5maW5kQW5ub3RhdGlvbihjb250ZXh0LmZpbmRUeXBlR2xvYmFsbHkoRGF0YS5jbGFzcykpOworICAgIGJvb2xlYW4gX3RyaXBsZU5vdEVxdWFscyA9IChfZmluZEFubm90YXRpb24gIT0gbnVsbCk7CisgICAgaWYgKF90cmlwbGVOb3RFcXVhbHMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgQW5ub3RhdGlvblJlZmVyZW5jZSBfZmluZEFubm90YXRpb25fMSA9IGl0LmZpbmRBbm5vdGF0aW9uKGNvbnRleHQuZmluZFR5cGVHbG9iYWxseShBY2Nlc3NvcnMuY2xhc3MpKTsKKyAgICBib29sZWFuIF90cmlwbGVOb3RFcXVhbHNfMSA9IChfZmluZEFubm90YXRpb25fMSAhPSBudWxsKTsKKyAgICBpZiAoX3RyaXBsZU5vdEVxdWFsc18xKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIEBFeHRlbnNpb24KKyAgICBmaW5hbCBGaW5hbEZpZWxkc0NvbnN0cnVjdG9yUHJvY2Vzc29yLlV0aWwgdXRpbCA9IG5ldyBGaW5hbEZpZWxkc0NvbnN0cnVjdG9yUHJvY2Vzc29yLlV0aWwoY29udGV4dCk7CisgICAgdXRpbC5hZGRGaW5hbEZpZWxkc0NvbnN0cnVjdG9yKGl0KTsKKyAgfQorICAKKyAgcHJvdGVjdGVkIHZvaWQgX3RyYW5zZm9ybShmaW5hbCBNdXRhYmxlQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBpdCwgQEV4dGVuc2lvbiBmaW5hbCBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworICAgIEBFeHRlbnNpb24KKyAgICBmaW5hbCBGaW5hbEZpZWxkc0NvbnN0cnVjdG9yUHJvY2Vzc29yLlV0aWwgdXRpbCA9IG5ldyBGaW5hbEZpZWxkc0NvbnN0cnVjdG9yUHJvY2Vzc29yLlV0aWwoY29udGV4dCk7CisgICAgdXRpbC5tYWtlRmluYWxGaWVsZHNDb25zdHJ1Y3RvcihpdCk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShmaW5hbCBNdXRhYmxlVHlwZVBhcmFtZXRlckRlY2xhcmF0b3IgaXQsIGZpbmFsIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgaWYgKGl0IGluc3RhbmNlb2YgTXV0YWJsZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHsKKyAgICAgIF90cmFuc2Zvcm0oKE11dGFibGVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKWl0LCBjb250ZXh0KTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGl0IGluc3RhbmNlb2YgTXV0YWJsZUNsYXNzRGVjbGFyYXRpb24pIHsKKyAgICAgIF90cmFuc2Zvcm0oKE11dGFibGVDbGFzc0RlY2xhcmF0aW9uKWl0LCBjb250ZXh0KTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5oYW5kbGVkIHBhcmFtZXRlciB0eXBlczogIiArCisgICAgICAgIEFycmF5cy48T2JqZWN0PmFzTGlzdChpdCwgY29udGV4dCkudG9TdHJpbmcoKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9Ub1N0cmluZy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvVG9TdHJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmE5NmU5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvVG9TdHJpbmcuamF2YQpAQCAtMCwwICsxLDU5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9uczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFjdGl2ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIudXRpbC5Ub1N0cmluZ0J1aWxkZXI7CisKKy8qKgorICogQ3JlYXRlcyBhIGRlZmF1bHQge0BsaW5rIE9iamVjdCN0b1N0cmluZyB0b1N0cmluZ30gaW1wbGVtZW50YXRpb24uCisgKiAKKyAqIDxwPgorICogQWxsIG5vbi1zdGF0aWMgZmllbGRzIG9mIHRoaXMgY2xhc3MgYW5kIGFsbCBvZiBpdHMgc3VwZXJjbGFzc2VzIGFyZSB1c2VkLgorICogUmVmbGVjdGlvbiBpcyB1c2VkIHRvIGFjY2VzcyBhbGwgZmllbGRzIGlmIHRoaXMgY2xhc3MgaGFzIGEgc3VwZXJjbGFzcy4gVGhpcyBtYXkgbm90IHdvcmsgaW4gcmVzdHJpY3RpdmUgZW52aXJvbm1lbnRzLgorICogRm9yIHN1Y2ggY2FzZXMgdXNlIHtAbGluayBUb1N0cmluZ0J1aWxkZXJ9IHRvIHdyaXRlIGEgbm9uLXJlZmxlY3RpdmUgaW1wbGVtZW50YXRpb24uCisgKiA8L3A+CisgKiBUaGUgZGVmYXVsdCBmb3JtYXQgaXM6CisgKiA8cHJlPgorICogIENsYXNzTmFtZSBbCisgKiAgICBmaWVsZDEgPSAiRm9vIgorICogICAgZmllbGQyID0gMgorICogICAgZmllbGQzID0gbnVsbAorICogIF0KKyAqIDwvcHJlPgorICogCisgKiBUaGUgY2xhc3MgbmFtZSBpcyBoYXJkY29kZWQuIFN1YmNsYXNzZXMgd2hpY2ggaW5oZXJpdCB0aGlzIGNsYXNzIHdpdGhvdXQgb3ZlcnJpZGluZyA8Y29kZT50b1N0cmluZzwvY29kZT4gd2lsbCBzaG93IHRoZSBzYW1lIG5hbWUuCisgKiAKKyAqIDwvcD4KKyAqIDxwPgorICogRm9yIGJyZXZpdHkgdGhlcmUgYXJlIG9wdGlvbnMgdG8gaGlkZSBmaWVsZCBuYW1lcywgc2tpcCBmaWVsZHMgd2l0aCBudWxsIHZhbHVlcyBhbmQgcHJpbnQgZXZlcnl0aGluZyBvbiBvbmUgbGluZS4KKyAqIDwvcD4KKyAqIEBzaW5jZSAyLjcKKyAqLworQEJldGEKK0BUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkKK0BBY3RpdmUoVG9TdHJpbmdQcm9jZXNzb3IuY2xhc3MpCitAR3d0Q29tcGF0aWJsZQorQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgQGludGVyZmFjZSBUb1N0cmluZyB7CisgIC8qKgorICAgKiBGaWVsZHMgd2l0aCBudWxsIHZhbHVlcyBhcmUgbm90IHNob3duIGluIHRoZSBvdXRwdXQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBza2lwTnVsbHMoKSBkZWZhdWx0IGZhbHNlOworICAvKioKKyAgICogU2VwZXJhdGUgZmllbGRzIHdpdGggYSBjb21tYSBhbmQgYSBzaW5nbGUgc3BhY2UKKyAgICovCisgIHB1YmxpYyBib29sZWFuIHNpbmdsZUxpbmUoKSBkZWZhdWx0IGZhbHNlOworICAvKioKKyAgICogT25seSBsaXN0IHRoZSB2YWx1ZXMgb2YgdGhlIGZpZWxkcywgbm90IHRoZWlyIG5hbWVzCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBoaWRlRmllbGROYW1lcygpIGRlZmF1bHQgZmFsc2U7CisgIC8qKgorICAgKiBCeSBkZWZhdWx0LCBJdGVyYWJsZXMsIEFycmF5cyBhbmQgbXVsdGlsaW5lIFN0cmluZ3MgYXJlIHByZXR0eS1wcmludGVkLgorICAgKiBTd2l0Y2hpbmcgdG8gdGhlaXIgbm9ybWFsIHJlcHJlc2VudGF0aW9uIG1ha2VzIHRoZSB0b1N0cmluZyBtZXRob2Qgc2lnbmlmaWNhbnRseSBmYXN0ZXIuCisgICAqIEBzaW5jZSAyLjkKKyAgICovCisgIHB1YmxpYyBib29sZWFuIHZlcmJhdGltVmFsdWVzKCkgZGVmYXVsdCBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL1RvU3RyaW5nLnh0ZW5kIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvVG9TdHJpbmcueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0MDE0MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL1RvU3RyaW5nLnh0ZW5kCkBAIC0wLDAgKzEsMjAwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9ucworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YQoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGUKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZQoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5BYnN0cmFjdENsYXNzUHJvY2Vzc29yCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFjdGl2ZQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5UcmFuc2Zvcm1hdGlvbkNvbnRleHQKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uQW5ub3RhdGlvblJlZmVyZW5jZQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkZpZWxkRGVjbGFyYXRpb24KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTXV0YWJsZUNsYXNzRGVjbGFyYXRpb24KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIudXRpbC5Ub1N0cmluZ0J1aWxkZXIKKworLyoqCisgKiBDcmVhdGVzIGEgZGVmYXVsdCB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nIHRvU3RyaW5nfSBpbXBsZW1lbnRhdGlvbi4gCisgKiAKKyAqIDxwPgorICogQWxsIG5vbi1zdGF0aWMgZmllbGRzIG9mIHRoaXMgY2xhc3MgYW5kIGFsbCBvZiBpdHMgc3VwZXJjbGFzc2VzIGFyZSB1c2VkLgorICogUmVmbGVjdGlvbiBpcyB1c2VkIHRvIGFjY2VzcyBhbGwgZmllbGRzIGlmIHRoaXMgY2xhc3MgaGFzIGEgc3VwZXJjbGFzcy4gVGhpcyBtYXkgbm90IHdvcmsgaW4gcmVzdHJpY3RpdmUgZW52aXJvbm1lbnRzLiAKKyAqIEZvciBzdWNoIGNhc2VzIHVzZSB7QGxpbmsgVG9TdHJpbmdCdWlsZGVyfSB0byB3cml0ZSBhIG5vbi1yZWZsZWN0aXZlIGltcGxlbWVudGF0aW9uLgorICogPC9wPgorICogVGhlIGRlZmF1bHQgZm9ybWF0IGlzOgorICogPHByZT4KKyAqICBDbGFzc05hbWUgWworICogICAgZmllbGQxID0gIkZvbyIKKyAqICAgIGZpZWxkMiA9IDIKKyAqICAgIGZpZWxkMyA9IG51bGwKKyAqICBdCisgKiA8L3ByZT4KKyAqIAorICogVGhlIGNsYXNzIG5hbWUgaXMgaGFyZGNvZGVkLiBTdWJjbGFzc2VzIHdoaWNoIGluaGVyaXQgdGhpcyBjbGFzcyB3aXRob3V0IG92ZXJyaWRpbmcgPGNvZGU+dG9TdHJpbmc8L2NvZGU+IHdpbGwgc2hvdyB0aGUgc2FtZSBuYW1lLgorICogCisgKiA8L3A+CisgKiA8cD4KKyAqIEZvciBicmV2aXR5IHRoZXJlIGFyZSBvcHRpb25zIHRvIGhpZGUgZmllbGQgbmFtZXMsIHNraXAgZmllbGRzIHdpdGggbnVsbCB2YWx1ZXMgYW5kIHByaW50IGV2ZXJ5dGhpbmcgb24gb25lIGxpbmUuCisgKiA8L3A+CisgKiBAc2luY2UgMi43CisgKi8KK0BCZXRhCitAVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCitAQWN0aXZlKFRvU3RyaW5nUHJvY2Vzc29yKQorQEd3dENvbXBhdGlibGUKK2Fubm90YXRpb24gVG9TdHJpbmcgeworCS8qKgorCSAqIEZpZWxkcyB3aXRoIG51bGwgdmFsdWVzIGFyZSBub3Qgc2hvd24gaW4gdGhlIG91dHB1dC4KKwkgKi8KKwl2YWwgc2tpcE51bGxzID0gZmFsc2UKKwkvKioKKwkgKiBTZXBlcmF0ZSBmaWVsZHMgd2l0aCBhIGNvbW1hIGFuZCBhIHNpbmdsZSBzcGFjZQorCSAqLworCXZhbCBzaW5nbGVMaW5lID0gZmFsc2UKKwkvKioKKwkgKiBPbmx5IGxpc3QgdGhlIHZhbHVlcyBvZiB0aGUgZmllbGRzLCBub3QgdGhlaXIgbmFtZXMKKwkgKi8KKwl2YWwgaGlkZUZpZWxkTmFtZXMgPSBmYWxzZQorCisJLyoqCisJICogQnkgZGVmYXVsdCwgSXRlcmFibGVzLCBBcnJheXMgYW5kIG11bHRpbGluZSBTdHJpbmdzIGFyZSBwcmV0dHktcHJpbnRlZC4KKwkgKiBTd2l0Y2hpbmcgdG8gdGhlaXIgbm9ybWFsIHJlcHJlc2VudGF0aW9uIG1ha2VzIHRoZSB0b1N0cmluZyBtZXRob2Qgc2lnbmlmaWNhbnRseSBmYXN0ZXIuCisJICogQHNpbmNlIDIuOQorCSAqLworCXZhbCB2ZXJiYXRpbVZhbHVlcyA9IGZhbHNlCit9CisKKy8qKgorICogQHNpbmNlIDIuNworICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KKyAqIEBub3JlZmVyZW5jZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK2NsYXNzIFRvU3RyaW5nQ29uZmlndXJhdGlvbiB7CisJdmFsIGJvb2xlYW4gc2tpcE51bGxzCisJdmFsIGJvb2xlYW4gc2luZ2xlTGluZQorCXZhbCBib29sZWFuIGhpZGVGaWVsZE5hbWVzCisJdmFsIGJvb2xlYW4gdmVyYmF0aW1WYWx1ZXMKKworCW5ldygpIHsKKwkJdGhpcyhmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSkKKwl9CisKKwluZXcoYm9vbGVhbiBza2lwTnVsbHMsIGJvb2xlYW4gc2luZ2xlTGluZSwgYm9vbGVhbiBoaWRlRmllbGROYW1lcywgYm9vbGVhbiB2ZXJiYXRpbVZhbHVlcykgeworCQl0aGlzLnNraXBOdWxscyA9IHNraXBOdWxscworCQl0aGlzLnNpbmdsZUxpbmUgPSBzaW5nbGVMaW5lCisJCXRoaXMuaGlkZUZpZWxkTmFtZXMgPSBoaWRlRmllbGROYW1lcworCQl0aGlzLnZlcmJhdGltVmFsdWVzID0gdmVyYmF0aW1WYWx1ZXMKKwl9CisKKwluZXcoQW5ub3RhdGlvblJlZmVyZW5jZSBhbm5vdGF0aW9uKSB7CisJCXRoaXMuc2tpcE51bGxzID0gYW5ub3RhdGlvbi5nZXRCb29sZWFuVmFsdWUoInNraXBOdWxscyIpCisJCXRoaXMuc2luZ2xlTGluZSA9IGFubm90YXRpb24uZ2V0Qm9vbGVhblZhbHVlKCJzaW5nbGVMaW5lIikKKwkJdGhpcy5oaWRlRmllbGROYW1lcyA9IGFubm90YXRpb24uZ2V0Qm9vbGVhblZhbHVlKCJoaWRlRmllbGROYW1lcyIpCisJCXRoaXMudmVyYmF0aW1WYWx1ZXMgPSBhbm5vdGF0aW9uLmdldEJvb2xlYW5WYWx1ZSgidmVyYmF0aW1WYWx1ZXMiKQorCX0KKworCWRlZiBpc1NraXBOdWxscygpIHsKKwkJc2tpcE51bGxzCisJfQorCisJZGVmIGlzU2luZ2xlTGluZSgpIHsKKwkJc2luZ2xlTGluZQorCX0KKworCWRlZiBpc0hpZGVGaWVsZE5hbWVzKCkgeworCQloaWRlRmllbGROYW1lcworCX0KKworCWRlZiBpc1ZlcmJhdGltVmFsdWVzKCkgeworCQl2ZXJiYXRpbVZhbHVlcworCX0KK30KKworLyoqCisgKiBAc2luY2UgMi43CisgKiBAbm9leHRlbmQKKyAqIEBub3JlZmVyZW5jZQorICovCitAQmV0YQorY2xhc3MgVG9TdHJpbmdQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdENsYXNzUHJvY2Vzc29yIHsKKworCW92ZXJyaWRlIGRvVHJhbnNmb3JtKE11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGl0LCBleHRlbnNpb24gVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKwkJaWYgKGZpbmRBbm5vdGF0aW9uKERhdGEuZmluZFR5cGVHbG9iYWxseSkgIT09IG51bGwpIHsKKwkJCXJldHVybgorCQl9CisJCXZhbCBleHRlbnNpb24gdXRpbCA9IG5ldyBUb1N0cmluZ1Byb2Nlc3Nvci5VdGlsKGNvbnRleHQpCisJCXZhbCBhbm5vdGF0aW9uID0gZmluZEFubm90YXRpb24oVG9TdHJpbmcuZmluZFR5cGVHbG9iYWxseSkKKwkJdmFsIGNvbmZpZ3VyYXRpb24gPSBuZXcgVG9TdHJpbmdDb25maWd1cmF0aW9uKGFubm90YXRpb24pCisJCWlmIChoYXNUb1N0cmluZykgeworCQkJYW5ub3RhdGlvbi5hZGRXYXJuaW5nKCJ0b1N0cmluZyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoaXMgYW5ub3RhdGlvbiBoYXMgbm8gZWZmZWN0LiIpCisJCX0gZWxzZSBpZiAoZXh0ZW5kZWRDbGFzcyAhPSBvYmplY3QpIHsKKwkJCWFkZFJlZmxlY3RpdmVUb1N0cmluZyhjb25maWd1cmF0aW9uKQorCQl9IGVsc2UgeworCQkJYWRkVG9TdHJpbmcoZGVjbGFyZWRGaWVsZHMuZmlsdGVyW3RoZVByaW1hcnlHZW5lcmF0ZWRKYXZhRWxlbWVudCAmJiAhIHN0YXRpYyAmJiAhdHJhbnNpZW50XSwgY29uZmlndXJhdGlvbikKKwkJfQorCX0KKworCS8qKgorCSAqIEBzaW5jZSAyLjcKKwkgKiBAbm9leHRlbmQKKwkgKiBAbm9yZWZlcmVuY2UKKwkgKi8KKwlAQmV0YQorCXN0YXRpYyBjbGFzcyBVdGlsIHsKKwkJZXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0CisKKwkJbmV3KFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0CisJCX0KKworCQlkZWYgaGFzVG9TdHJpbmcoQ2xhc3NEZWNsYXJhdGlvbiBpdCkgeworCQkJZmluZERlY2xhcmVkTWV0aG9kKCJ0b1N0cmluZyIpICE9PSBudWxsCisJCX0KKworCQlkZWYgZ2V0VG9TdHJpbmdDb25maWcoQ2xhc3NEZWNsYXJhdGlvbiBpdCkgeworCQkJdmFsIGFubm8gPSBmaW5kQW5ub3RhdGlvbihUb1N0cmluZy5maW5kVHlwZUdsb2JhbGx5KQorCQkJaWYoYW5ubyA9PT0gbnVsbCkgbnVsbCBlbHNlIG5ldyBUb1N0cmluZ0NvbmZpZ3VyYXRpb24oYW5ubykKKwkJfQorCisJCWRlZiB2b2lkIGFkZFJlZmxlY3RpdmVUb1N0cmluZyhNdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbiBjbHMsIFRvU3RyaW5nQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKwkJCWNscy5hZGRNZXRob2QoInRvU3RyaW5nIikgWworCQkJCXByaW1hcnlTb3VyY2VFbGVtZW50ID0gY2xzLnByaW1hcnlTb3VyY2VFbGVtZW50CisJCQkJcmV0dXJuVHlwZSA9IHN0cmluZworCQkJCWFkZEFubm90YXRpb24obmV3QW5ub3RhdGlvblJlZmVyZW5jZShPdmVycmlkZSkpCisJCQkJYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uUmVmZXJlbmNlKFB1cmUpKQorCQkJCWJvZHkgPSAnJycKKwkJCQkJcmV0dXJuIG5ldyCrVG9TdHJpbmdCdWlsZGVyuyh0aGlzKQorCQkJCQkJLmFkZEFsbEZpZWxkcygpCisJCQkJCQmrSUYgY29uZmlnLnNraXBOdWxsc7suc2tpcE51bGxzKCmrRU5ESUa7CisJCQkJCQmrSUYgY29uZmlnLnNpbmdsZUxpbmW7LnNpbmdsZUxpbmUoKatFTkRJRrsKKwkJCQkJCatJRiBjb25maWcuaGlkZUZpZWxkTmFtZXO7LmhpZGVGaWVsZE5hbWVzKCmrRU5ESUa7CisJCQkJCQmrSUYgY29uZmlnLnZlcmJhdGltVmFsdWVzuy52ZXJiYXRpbVZhbHVlcygpq0VORElGuworCQkJCQkJLnRvU3RyaW5nKCk7CisJCQkJJycnCisJCQldCisJCX0KKworCQlkZWYgdm9pZCBhZGRUb1N0cmluZyhNdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbiBjbHMsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBGaWVsZERlY2xhcmF0aW9uPiBmaWVsZHMsCisJCQlUb1N0cmluZ0NvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisJCQljbHMuYWRkTWV0aG9kKCJ0b1N0cmluZyIpIFsKKwkJCQlwcmltYXJ5U291cmNlRWxlbWVudCA9IGNscy5wcmltYXJ5U291cmNlRWxlbWVudAorCQkJCXJldHVyblR5cGUgPSBzdHJpbmcKKwkJCQlhZGRBbm5vdGF0aW9uKG5ld0Fubm90YXRpb25SZWZlcmVuY2UoT3ZlcnJpZGUpKQorCQkJCWFkZEFubm90YXRpb24obmV3QW5ub3RhdGlvblJlZmVyZW5jZShQdXJlKSkKKwkJCQlib2R5ID0gJycnCisJCQkJCatUb1N0cmluZ0J1aWxkZXK7IGIgPSBuZXcgq1RvU3RyaW5nQnVpbGRlcrsodGhpcyk7CisJCQkJCatJRiBjb25maWcuc2tpcE51bGxzu2Iuc2tpcE51bGxzKCk7q0VORElGuworCQkJCQmrSUYgY29uZmlnLnNpbmdsZUxpbmW7Yi5zaW5nbGVMaW5lKCk7q0VORElGuworCQkJCQmrSUYgY29uZmlnLmhpZGVGaWVsZE5hbWVzu2IuaGlkZUZpZWxkTmFtZXMoKTurRU5ESUa7CisJCQkJCatJRiBjb25maWcudmVyYmF0aW1WYWx1ZXO7Yi52ZXJiYXRpbVZhbHVlcygpO6tFTkRJRrsKKwkJCQkJq0ZPUiBmaWVsZCA6IGZpZWxkc7sKKwkJCQkJCWIuYWRkKCKrZmllbGQuc2ltcGxlTmFtZbsiLCB0aGlzLqtmaWVsZC5zaW1wbGVOYW1luyk7CisJCQkJCatFTkRGT1K7CisJCQkJCXJldHVybiBiLnRvU3RyaW5nKCk7CisJCQkJJycnCisJCQldCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9Ub1N0cmluZ0NvbmZpZ3VyYXRpb24uamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL1RvU3RyaW5nQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZDM3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9Ub1N0cmluZ0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDU2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9uczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkFubm90YXRpb25SZWZlcmVuY2U7CisKKy8qKgorICogQHNpbmNlIDIuNworICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KKyAqIEBub3JlZmVyZW5jZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFRvU3RyaW5nQ29uZmlndXJhdGlvbiB7CisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBza2lwTnVsbHM7CisgIAorICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2luZ2xlTGluZTsKKyAgCisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoaWRlRmllbGROYW1lczsKKyAgCisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB2ZXJiYXRpbVZhbHVlczsKKyAgCisgIHB1YmxpYyBUb1N0cmluZ0NvbmZpZ3VyYXRpb24oKSB7CisgICAgdGhpcyhmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgIH0KKyAgCisgIHB1YmxpYyBUb1N0cmluZ0NvbmZpZ3VyYXRpb24oZmluYWwgYm9vbGVhbiBza2lwTnVsbHMsIGZpbmFsIGJvb2xlYW4gc2luZ2xlTGluZSwgZmluYWwgYm9vbGVhbiBoaWRlRmllbGROYW1lcywgZmluYWwgYm9vbGVhbiB2ZXJiYXRpbVZhbHVlcykgeworICAgIHRoaXMuc2tpcE51bGxzID0gc2tpcE51bGxzOworICAgIHRoaXMuc2luZ2xlTGluZSA9IHNpbmdsZUxpbmU7CisgICAgdGhpcy5oaWRlRmllbGROYW1lcyA9IGhpZGVGaWVsZE5hbWVzOworICAgIHRoaXMudmVyYmF0aW1WYWx1ZXMgPSB2ZXJiYXRpbVZhbHVlczsKKyAgfQorICAKKyAgcHVibGljIFRvU3RyaW5nQ29uZmlndXJhdGlvbihmaW5hbCBBbm5vdGF0aW9uUmVmZXJlbmNlIGFubm90YXRpb24pIHsKKyAgICB0aGlzLnNraXBOdWxscyA9IGFubm90YXRpb24uZ2V0Qm9vbGVhblZhbHVlKCJza2lwTnVsbHMiKTsKKyAgICB0aGlzLnNpbmdsZUxpbmUgPSBhbm5vdGF0aW9uLmdldEJvb2xlYW5WYWx1ZSgic2luZ2xlTGluZSIpOworICAgIHRoaXMuaGlkZUZpZWxkTmFtZXMgPSBhbm5vdGF0aW9uLmdldEJvb2xlYW5WYWx1ZSgiaGlkZUZpZWxkTmFtZXMiKTsKKyAgICB0aGlzLnZlcmJhdGltVmFsdWVzID0gYW5ub3RhdGlvbi5nZXRCb29sZWFuVmFsdWUoInZlcmJhdGltVmFsdWVzIik7CisgIH0KKyAgCisgIHB1YmxpYyBib29sZWFuIGlzU2tpcE51bGxzKCkgeworICAgIHJldHVybiB0aGlzLnNraXBOdWxsczsKKyAgfQorICAKKyAgcHVibGljIGJvb2xlYW4gaXNTaW5nbGVMaW5lKCkgeworICAgIHJldHVybiB0aGlzLnNpbmdsZUxpbmU7CisgIH0KKyAgCisgIHB1YmxpYyBib29sZWFuIGlzSGlkZUZpZWxkTmFtZXMoKSB7CisgICAgcmV0dXJuIHRoaXMuaGlkZUZpZWxkTmFtZXM7CisgIH0KKyAgCisgIHB1YmxpYyBib29sZWFuIGlzVmVyYmF0aW1WYWx1ZXMoKSB7CisgICAgcmV0dXJuIHRoaXMudmVyYmF0aW1WYWx1ZXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL1RvU3RyaW5nUHJvY2Vzc29yLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9Ub1N0cmluZ1Byb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjQ0NWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9Ub1N0cmluZ1Byb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9uczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5BYnN0cmFjdENsYXNzUHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5UcmFuc2Zvcm1hdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkFubm90YXRpb25SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTXV0YWJsZUZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuSXRlcmFibGVFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzLlByb2NlZHVyZTE7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlB1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLnV0aWwuVG9TdHJpbmdCdWlsZGVyOworCisvKioKKyAqIEBzaW5jZSAyLjcKKyAqIEBub2V4dGVuZAorICogQG5vcmVmZXJlbmNlCisgKi8KK0BCZXRhCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBUb1N0cmluZ1Byb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0Q2xhc3NQcm9jZXNzb3IgeworICAvKioKKyAgICogQHNpbmNlIDIuNworICAgKiBAbm9leHRlbmQKKyAgICogQG5vcmVmZXJlbmNlCisgICAqLworICBAQmV0YQorICBwdWJsaWMgc3RhdGljIGNsYXNzIFV0aWwgeworICAgIEBFeHRlbnNpb24KKyAgICBwcml2YXRlIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0OworICAgIAorICAgIHB1YmxpYyBVdGlsKGZpbmFsIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNUb1N0cmluZyhmaW5hbCBDbGFzc0RlY2xhcmF0aW9uIGl0KSB7CisgICAgICBNZXRob2REZWNsYXJhdGlvbiBfZmluZERlY2xhcmVkTWV0aG9kID0gaXQuZmluZERlY2xhcmVkTWV0aG9kKCJ0b1N0cmluZyIpOworICAgICAgcmV0dXJuIChfZmluZERlY2xhcmVkTWV0aG9kICE9IG51bGwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVG9TdHJpbmdDb25maWd1cmF0aW9uIGdldFRvU3RyaW5nQ29uZmlnKGZpbmFsIENsYXNzRGVjbGFyYXRpb24gaXQpIHsKKyAgICAgIFRvU3RyaW5nQ29uZmlndXJhdGlvbiBfeGJsb2NrZXhwcmVzc2lvbiA9IG51bGw7CisgICAgICB7CisgICAgICAgIGZpbmFsIEFubm90YXRpb25SZWZlcmVuY2UgYW5ubyA9IGl0LmZpbmRBbm5vdGF0aW9uKHRoaXMuY29udGV4dC5maW5kVHlwZUdsb2JhbGx5KFRvU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIFRvU3RyaW5nQ29uZmlndXJhdGlvbiBfeGlmZXhwcmVzc2lvbiA9IG51bGw7CisgICAgICAgIGlmICgoYW5ubyA9PSBudWxsKSkgeworICAgICAgICAgIF94aWZleHByZXNzaW9uID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBfeGlmZXhwcmVzc2lvbiA9IG5ldyBUb1N0cmluZ0NvbmZpZ3VyYXRpb24oYW5ubyk7CisgICAgICAgIH0KKyAgICAgICAgX3hibG9ja2V4cHJlc3Npb24gPSBfeGlmZXhwcmVzc2lvbjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfeGJsb2NrZXhwcmVzc2lvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkUmVmbGVjdGl2ZVRvU3RyaW5nKGZpbmFsIE11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGNscywgZmluYWwgVG9TdHJpbmdDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgZmluYWwgUHJvY2VkdXJlMTxNdXRhYmxlTWV0aG9kRGVjbGFyYXRpb24+IF9mdW5jdGlvbiA9IChNdXRhYmxlTWV0aG9kRGVjbGFyYXRpb24gaXQpIC0+IHsKKyAgICAgICAgdGhpcy5jb250ZXh0LnNldFByaW1hcnlTb3VyY2VFbGVtZW50KGl0LCB0aGlzLmNvbnRleHQuZ2V0UHJpbWFyeVNvdXJjZUVsZW1lbnQoY2xzKSk7CisgICAgICAgIGl0LnNldFJldHVyblR5cGUodGhpcy5jb250ZXh0LmdldFN0cmluZygpKTsKKyAgICAgICAgaXQuYWRkQW5ub3RhdGlvbih0aGlzLmNvbnRleHQubmV3QW5ub3RhdGlvblJlZmVyZW5jZShPdmVycmlkZS5jbGFzcykpOworICAgICAgICBpdC5hZGRBbm5vdGF0aW9uKHRoaXMuY29udGV4dC5uZXdBbm5vdGF0aW9uUmVmZXJlbmNlKFB1cmUuY2xhc3MpKTsKKyAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBfY2xpZW50ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQoKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kVG8oU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC5UYXJnZXRTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyKSB7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoInJldHVybiBuZXcgIik7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoVG9TdHJpbmdCdWlsZGVyLmNsYXNzKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKHRoaXMpIik7CisgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuYWRkQWxsRmllbGRzKCkiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYm9vbGVhbiBfaXNTa2lwTnVsbHMgPSBjb25maWcuaXNTa2lwTnVsbHMoKTsKKyAgICAgICAgICAgICAgaWYgKF9pc1NraXBOdWxscykgeworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLnNraXBOdWxscygpIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJvb2xlYW4gX2lzU2luZ2xlTGluZSA9IGNvbmZpZy5pc1NpbmdsZUxpbmUoKTsKKyAgICAgICAgICAgICAgaWYgKF9pc1NpbmdsZUxpbmUpIHsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIi5zaW5nbGVMaW5lKCkiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYm9vbGVhbiBfaXNIaWRlRmllbGROYW1lcyA9IGNvbmZpZy5pc0hpZGVGaWVsZE5hbWVzKCk7CisgICAgICAgICAgICAgIGlmIChfaXNIaWRlRmllbGROYW1lcykgeworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLmhpZGVGaWVsZE5hbWVzKCkiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYm9vbGVhbiBfaXNWZXJiYXRpbVZhbHVlcyA9IGNvbmZpZy5pc1ZlcmJhdGltVmFsdWVzKCk7CisgICAgICAgICAgICAgIGlmIChfaXNWZXJiYXRpbVZhbHVlcykgeworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLnZlcmJhdGltVmFsdWVzKCkiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLnRvU3RyaW5nKCk7Iik7CisgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBpdC5zZXRCb2R5KF9jbGllbnQpOworICAgICAgfTsKKyAgICAgIGNscy5hZGRNZXRob2QoInRvU3RyaW5nIiwgX2Z1bmN0aW9uKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkVG9TdHJpbmcoZmluYWwgTXV0YWJsZUNsYXNzRGVjbGFyYXRpb24gY2xzLCBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRmllbGREZWNsYXJhdGlvbj4gZmllbGRzLCBmaW5hbCBUb1N0cmluZ0NvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICBmaW5hbCBQcm9jZWR1cmUxPE11dGFibGVNZXRob2REZWNsYXJhdGlvbj4gX2Z1bmN0aW9uID0gKE11dGFibGVNZXRob2REZWNsYXJhdGlvbiBpdCkgLT4geworICAgICAgICB0aGlzLmNvbnRleHQuc2V0UHJpbWFyeVNvdXJjZUVsZW1lbnQoaXQsIHRoaXMuY29udGV4dC5nZXRQcmltYXJ5U291cmNlRWxlbWVudChjbHMpKTsKKyAgICAgICAgaXQuc2V0UmV0dXJuVHlwZSh0aGlzLmNvbnRleHQuZ2V0U3RyaW5nKCkpOworICAgICAgICBpdC5hZGRBbm5vdGF0aW9uKHRoaXMuY29udGV4dC5uZXdBbm5vdGF0aW9uUmVmZXJlbmNlKE92ZXJyaWRlLmNsYXNzKSk7CisgICAgICAgIGl0LmFkZEFubm90YXRpb24odGhpcy5jb250ZXh0Lm5ld0Fubm90YXRpb25SZWZlcmVuY2UoUHVyZS5jbGFzcykpOworICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IF9jbGllbnQgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCgpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRUbyhTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50LlRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIpIHsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChUb1N0cmluZ0J1aWxkZXIuY2xhc3MpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgYiA9IG5ldyAiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChUb1N0cmluZ0J1aWxkZXIuY2xhc3MpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIodGhpcyk7Iik7CisgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICBib29sZWFuIF9pc1NraXBOdWxscyA9IGNvbmZpZy5pc1NraXBOdWxscygpOworICAgICAgICAgICAgICBpZiAoX2lzU2tpcE51bGxzKSB7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJiLnNraXBOdWxscygpOyIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICBib29sZWFuIF9pc1NpbmdsZUxpbmUgPSBjb25maWcuaXNTaW5nbGVMaW5lKCk7CisgICAgICAgICAgICAgIGlmIChfaXNTaW5nbGVMaW5lKSB7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJiLnNpbmdsZUxpbmUoKTsiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYm9vbGVhbiBfaXNIaWRlRmllbGROYW1lcyA9IGNvbmZpZy5pc0hpZGVGaWVsZE5hbWVzKCk7CisgICAgICAgICAgICAgIGlmIChfaXNIaWRlRmllbGROYW1lcykgeworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiYi5oaWRlRmllbGROYW1lcygpOyIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICBib29sZWFuIF9pc1ZlcmJhdGltVmFsdWVzID0gY29uZmlnLmlzVmVyYmF0aW1WYWx1ZXMoKTsKKyAgICAgICAgICAgICAgaWYgKF9pc1ZlcmJhdGltVmFsdWVzKSB7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJiLnZlcmJhdGltVmFsdWVzKCk7Iik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZvcihmaW5hbCBGaWVsZERlY2xhcmF0aW9uIGZpZWxkIDogZmllbGRzKSB7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJiLmFkZChcIiIpOworICAgICAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZSA9IGZpZWxkLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWUpOworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXCIsIHRoaXMuIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9zaW1wbGVOYW1lXzEgPSBmaWVsZC5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zaW1wbGVOYW1lXzEpOworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKTsiKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoInJldHVybiBiLnRvU3RyaW5nKCk7Iik7CisgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBpdC5zZXRCb2R5KF9jbGllbnQpOworICAgICAgfTsKKyAgICAgIGNscy5hZGRNZXRob2QoInRvU3RyaW5nIiwgX2Z1bmN0aW9uKTsKKyAgICB9CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBkb1RyYW5zZm9ybShmaW5hbCBNdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbiBpdCwgQEV4dGVuc2lvbiBmaW5hbCBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworICAgIEFubm90YXRpb25SZWZlcmVuY2UgX2ZpbmRBbm5vdGF0aW9uID0gaXQuZmluZEFubm90YXRpb24oY29udGV4dC5maW5kVHlwZUdsb2JhbGx5KERhdGEuY2xhc3MpKTsKKyAgICBib29sZWFuIF90cmlwbGVOb3RFcXVhbHMgPSAoX2ZpbmRBbm5vdGF0aW9uICE9IG51bGwpOworICAgIGlmIChfdHJpcGxlTm90RXF1YWxzKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIEBFeHRlbnNpb24KKyAgICBmaW5hbCBUb1N0cmluZ1Byb2Nlc3Nvci5VdGlsIHV0aWwgPSBuZXcgVG9TdHJpbmdQcm9jZXNzb3IuVXRpbChjb250ZXh0KTsKKyAgICBmaW5hbCBBbm5vdGF0aW9uUmVmZXJlbmNlIGFubm90YXRpb24gPSBpdC5maW5kQW5ub3RhdGlvbihjb250ZXh0LmZpbmRUeXBlR2xvYmFsbHkoVG9TdHJpbmcuY2xhc3MpKTsKKyAgICBmaW5hbCBUb1N0cmluZ0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBUb1N0cmluZ0NvbmZpZ3VyYXRpb24oYW5ub3RhdGlvbik7CisgICAgYm9vbGVhbiBfaGFzVG9TdHJpbmcgPSB1dGlsLmhhc1RvU3RyaW5nKGl0KTsKKyAgICBpZiAoX2hhc1RvU3RyaW5nKSB7CisgICAgICBjb250ZXh0LmFkZFdhcm5pbmcoYW5ub3RhdGlvbiwgInRvU3RyaW5nIGlzIGFscmVhZHkgZGVmaW5lZCwgdGhpcyBhbm5vdGF0aW9uIGhhcyBubyBlZmZlY3QuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIFR5cGVSZWZlcmVuY2UgX2V4dGVuZGVkQ2xhc3MgPSBpdC5nZXRFeHRlbmRlZENsYXNzKCk7CisgICAgICBUeXBlUmVmZXJlbmNlIF9vYmplY3QgPSBjb250ZXh0LmdldE9iamVjdCgpOworICAgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKCFPYmplY3RzLmVxdWFsKF9leHRlbmRlZENsYXNzLCBfb2JqZWN0KSk7CisgICAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgICB1dGlsLmFkZFJlZmxlY3RpdmVUb1N0cmluZyhpdCwgY29uZmlndXJhdGlvbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaW5hbCBGdW5jdGlvbjE8TXV0YWJsZUZpZWxkRGVjbGFyYXRpb24sIEJvb2xlYW4+IF9mdW5jdGlvbiA9IChNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBpdF8xKSAtPiB7CisgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZigoKGNvbnRleHQuaXNUaGVQcmltYXJ5R2VuZXJhdGVkSmF2YUVsZW1lbnQoaXRfMSkgJiYgKCFpdF8xLmlzU3RhdGljKCkpKSAmJiAoIWl0XzEuaXNUcmFuc2llbnQoKSkpKTsKKyAgICAgICAgfTsKKyAgICAgICAgdXRpbC5hZGRUb1N0cmluZyhpdCwgSXRlcmFibGVFeHRlbnNpb25zLmZpbHRlcihpdC5nZXREZWNsYXJlZEZpZWxkcygpLCBfZnVuY3Rpb24pLCBjb25maWd1cmF0aW9uKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL0Fic3RyYWN0QW5ub3RhdGlvblR5cGVQcm9jZXNzb3IuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL0Fic3RyYWN0QW5ub3RhdGlvblR5cGVQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzk4MGI4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vQWJzdHJhY3RBbm5vdGF0aW9uVHlwZVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTXV0YWJsZUFubm90YXRpb25UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkV4dGVuc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQSBjb252ZW5pZW50IGJhc2UgY2xhc3MgdG8gcHJvY2VzcyBhY3RpdmUgYW5ub3RhdGlvbnMgZm9yIGFubm90YXRpb24gdHlwZXMuCisgKi8KK0BCZXRhCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVHlwZVByb2Nlc3NvciBpbXBsZW1lbnRzIFJlZ2lzdGVyR2xvYmFsc1BhcnRpY2lwYW50PEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24+LCBUcmFuc2Zvcm1hdGlvblBhcnRpY2lwYW50PE11dGFibGVBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uPiwgQ29kZUdlbmVyYXRpb25QYXJ0aWNpcGFudDxBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uPiwgVmFsaWRhdGlvblBhcnRpY2lwYW50PEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24+IHsKKworCXB1YmxpYyB2b2lkIGRvUmVnaXN0ZXJHbG9iYWxzKExpc3Q8PyBleHRlbmRzIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24+IGFubm90YXRlZEFubm90YXRpb25UeXBlcywgQEV4dGVuc2lvbiBSZWdpc3Rlckdsb2JhbHNDb250ZXh0IGNvbnRleHQpIHsKKwkJZm9yIChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRlZEFubm90YXRpb25UeXBlIDogYW5ub3RhdGVkQW5ub3RhdGlvblR5cGVzKSB7CisJCQlkb1JlZ2lzdGVyR2xvYmFscyhhbm5vdGF0ZWRBbm5vdGF0aW9uVHlwZSwgY29udGV4dCk7CisJCX0KKwl9CisJCisJLyoqCisJICogQ2FsbGVkIGR1cmluZyBnbG9iYWwgc3ltYm9sIGNvbGxlY3RpbmcuCisJICogCisJICogQHBhcmFtIGFubm90YXRlZEFubm90YXRpb25UeXBlIGEgc291cmNlIGVsZW1lbnQgYW5ub3RhdGVkIHdpdGggdGhlIGFubm90YXRpb24gdGhpcyBwcm9jZXNzb3IgaXMgcmVzcG9uc2libGUgZm9yLgorCSAqIEBwYXJhbSBjb250ZXh0CisJICovCisJcHVibGljIHZvaWQgZG9SZWdpc3Rlckdsb2JhbHMoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0ZWRBbm5vdGF0aW9uVHlwZSwgQEV4dGVuc2lvbiBSZWdpc3Rlckdsb2JhbHNDb250ZXh0IGNvbnRleHQpIHt9CisJCisJcHVibGljIHZvaWQgZG9UcmFuc2Zvcm0oTGlzdDw/IGV4dGVuZHMgTXV0YWJsZUFubm90YXRpb25UeXBlRGVjbGFyYXRpb24+IGFubm90YXRlZEFubm90YXRpb25UeXBlcywgQEV4dGVuc2lvbiBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworCQlmb3IgKE11dGFibGVBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRlZEFubm90YXRpb25UeXBlIDogYW5ub3RhdGVkQW5ub3RhdGlvblR5cGVzKSB7CisJCQlkb1RyYW5zZm9ybShhbm5vdGF0ZWRBbm5vdGF0aW9uVHlwZSwgY29udGV4dCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYW5ub3RhdGVkQW5ub3RhdGlvblR5cGUgYSBtdXRhYmxlIGFubm90YXRpb24gdHlwZSByZXByZXNlbnRhdGlvbiBhbm5vdGF0ZWQgd2l0aCB0aGUgYW5ub3RhdGlvbiB0aGlzIHByb2Nlc3NvciBpcyByZXNwb25zaWJsZSBmb3IuCisJICogQHBhcmFtIGNvbnRleHQKKwkgKi8KKwlwdWJsaWMgdm9pZCBkb1RyYW5zZm9ybShNdXRhYmxlQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0ZWRBbm5vdGF0aW9uVHlwZSwgQEV4dGVuc2lvbiBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkge30KKworCXB1YmxpYyB2b2lkIGRvR2VuZXJhdGVDb2RlKExpc3Q8PyBleHRlbmRzIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24+IGFubm90YXRlZFNvdXJjZUVsZW1lbnRzLCBARXh0ZW5zaW9uIENvZGVHZW5lcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWZvciAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0ZWRBbm5vdGF0aW9uVHlwZSA6IGFubm90YXRlZFNvdXJjZUVsZW1lbnRzKSB7CisJCQlkb0dlbmVyYXRlQ29kZShhbm5vdGF0ZWRBbm5vdGF0aW9uVHlwZSwgY29udGV4dCk7CisJCX0KKwl9CisJCisJLyoqCisJICogQ2FsbGVkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uIAorCSAqIAorCSAqIEBwYXJhbSBhbm5vdGF0ZWRBbm5vdGF0aW9uVHlwZSBhIHNvdXJjZSBlbGVtZW50IGFubm90YXRlZCB3aXRoIHRoZSBhbm5vdGF0aW9uIHRoaXMgcHJvY2Vzc29yIGlzIHJlc3BvbnNpYmxlIGZvci4KKwkgKiBAcGFyYW0gY29udGV4dAorCSAqIEBzZWUgQ29kZUdlbmVyYXRpb25QYXJ0aWNpcGFudCNkb0dlbmVyYXRlQ29kZShMaXN0LCBDb2RlR2VuZXJhdGlvbkNvbnRleHQpCisJICovCisJcHVibGljIHZvaWQgZG9HZW5lcmF0ZUNvZGUoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0ZWRBbm5vdGF0aW9uVHlwZSwgQEV4dGVuc2lvbiBDb2RlR2VuZXJhdGlvbkNvbnRleHQgY29udGV4dCkge30KKwkKKwlwdWJsaWMgdm9pZCBkb1ZhbGlkYXRlKExpc3Q8PyBleHRlbmRzIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24+IGFubm90YXRlZEFubm90YXRpb25UeXBlcywgQEV4dGVuc2lvbiBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWZvciAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0ZWRBbm5vdGF0aW9uVHlwZSA6IGFubm90YXRlZEFubm90YXRpb25UeXBlcykgeworCQkJZG9WYWxpZGF0ZShhbm5vdGF0ZWRBbm5vdGF0aW9uVHlwZSwgY29udGV4dCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBJbnZva2VkIGJ5IHRoZSB2YWxpZGF0b3IKKwkgKiBAcGFyYW0gYW5ub3RhdGVkQW5ub3RhdGlvblR5cGUgdGhlIGdlbmVyYXRlZCBhbm5vdGF0aW9uIHR5cGUgdGhhdCBzaG91bGQgYmUgdmFsaWRhdGVkIAorCSAqIEBwYXJhbSBjb250ZXh0IAorCSAqIEBzZWUgI2RvVmFsaWRhdGUoTGlzdCwgVmFsaWRhdGlvbkNvbnRleHQpCisJICogQHNpbmNlIDIuNworCSAqLworCXB1YmxpYyB2b2lkIGRvVmFsaWRhdGUoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0ZWRBbm5vdGF0aW9uVHlwZSwgQEV4dGVuc2lvbiBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7fQorCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9BYnN0cmFjdENsYXNzUHJvY2Vzc29yLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9BYnN0cmFjdENsYXNzUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzZDlhZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL0Fic3RyYWN0Q2xhc3NQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNybzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5FeHRlbnNpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIEEgY29udmVuaWVudCBiYXNlIGNsYXNzIHRvIHByb2Nlc3MgYWN0aXZlIGFubm90YXRpb25zIGZvciBjbGFzc2VzLgorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqLworQEJldGEKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENsYXNzUHJvY2Vzc29yIGltcGxlbWVudHMgUmVnaXN0ZXJHbG9iYWxzUGFydGljaXBhbnQ8Q2xhc3NEZWNsYXJhdGlvbj4sIFRyYW5zZm9ybWF0aW9uUGFydGljaXBhbnQ8TXV0YWJsZUNsYXNzRGVjbGFyYXRpb24+LCBDb2RlR2VuZXJhdGlvblBhcnRpY2lwYW50PENsYXNzRGVjbGFyYXRpb24+LCBWYWxpZGF0aW9uUGFydGljaXBhbnQ8Q2xhc3NEZWNsYXJhdGlvbj4geworCisJcHVibGljIHZvaWQgZG9SZWdpc3Rlckdsb2JhbHMoTGlzdDw/IGV4dGVuZHMgQ2xhc3NEZWNsYXJhdGlvbj4gYW5ub3RhdGVkQ2xhc3NlcywgQEV4dGVuc2lvbiBSZWdpc3Rlckdsb2JhbHNDb250ZXh0IGNvbnRleHQpIHsKKwkJZm9yIChDbGFzc0RlY2xhcmF0aW9uIGFubm90YXRlZENsYXNzIDogYW5ub3RhdGVkQ2xhc3NlcykgeworCQkJZG9SZWdpc3Rlckdsb2JhbHMoYW5ub3RhdGVkQ2xhc3MsIGNvbnRleHQpOworCQl9CisJfQorCQorCS8qKgorCSAqIENhbGxlZCBkdXJpbmcgZ2xvYmFsIHN5bWJvbCBjb2xsZWN0aW5nLgorCSAqIAorCSAqIEBwYXJhbSBhbm5vdGF0ZWRDbGFzcyBhIHNvdXJjZSBlbGVtZW50IGFubm90YXRlZCB3aXRoIHRoZSBhbm5vdGF0aW9uIHRoaXMgcHJvY2Vzc29yIGlzIHJlc3BvbnNpYmxlIGZvci4KKwkgKiBAcGFyYW0gY29udGV4dAorCSAqLworCXB1YmxpYyB2b2lkIGRvUmVnaXN0ZXJHbG9iYWxzKENsYXNzRGVjbGFyYXRpb24gYW5ub3RhdGVkQ2xhc3MsIEBFeHRlbnNpb24gUmVnaXN0ZXJHbG9iYWxzQ29udGV4dCBjb250ZXh0KSB7fQorCQorCXB1YmxpYyB2b2lkIGRvVHJhbnNmb3JtKExpc3Q8PyBleHRlbmRzIE11dGFibGVDbGFzc0RlY2xhcmF0aW9uPiBhbm5vdGF0ZWRDbGFzc2VzLCBARXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWZvciAoTXV0YWJsZUNsYXNzRGVjbGFyYXRpb24gYW5ub3RhdGVkQ2xhc3MgOiBhbm5vdGF0ZWRDbGFzc2VzKSB7CisJCQlkb1RyYW5zZm9ybShhbm5vdGF0ZWRDbGFzcywgY29udGV4dCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYW5ub3RhdGVkQ2xhc3MgYSBtdXRhYmxlIGNsYXNzIHJlcHJlc2VudGF0aW9uIGFubm90YXRlZCB3aXRoIHRoZSBhbm5vdGF0aW9uIHRoaXMgcHJvY2Vzc29yIGlzIHJlc3BvbnNpYmxlIGZvci4KKwkgKiBAcGFyYW0gY29udGV4dAorCSAqLworCXB1YmxpYyB2b2lkIGRvVHJhbnNmb3JtKE11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGFubm90YXRlZENsYXNzLCBARXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7fQorCisJcHVibGljIHZvaWQgZG9HZW5lcmF0ZUNvZGUoTGlzdDw/IGV4dGVuZHMgQ2xhc3NEZWNsYXJhdGlvbj4gYW5ub3RhdGVkU291cmNlRWxlbWVudHMsIEBFeHRlbnNpb24gQ29kZUdlbmVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKwkJZm9yIChDbGFzc0RlY2xhcmF0aW9uIGFubm90YXRlZENsYXNzIDogYW5ub3RhdGVkU291cmNlRWxlbWVudHMpIHsKKwkJCWRvR2VuZXJhdGVDb2RlKGFubm90YXRlZENsYXNzLCBjb250ZXh0KTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBDYWxsZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4gCisJICogCisJICogQHBhcmFtIGFubm90YXRlZENsYXNzIGEgc291cmNlIGVsZW1lbnQgYW5ub3RhdGVkIHdpdGggdGhlIGFubm90YXRpb24gdGhpcyBwcm9jZXNzb3IgaXMgcmVzcG9uc2libGUgZm9yLgorCSAqIEBwYXJhbSBjb250ZXh0CisJICogQHNlZSBDb2RlR2VuZXJhdGlvblBhcnRpY2lwYW50I2RvR2VuZXJhdGVDb2RlKExpc3QsIENvZGVHZW5lcmF0aW9uQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkb0dlbmVyYXRlQ29kZShDbGFzc0RlY2xhcmF0aW9uIGFubm90YXRlZENsYXNzLCBARXh0ZW5zaW9uIENvZGVHZW5lcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7fQorCQorCXB1YmxpYyB2b2lkIGRvVmFsaWRhdGUoTGlzdDw/IGV4dGVuZHMgQ2xhc3NEZWNsYXJhdGlvbj4gYW5ub3RhdGVkQ2xhc3NlcywgQEV4dGVuc2lvbiBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWZvciAoQ2xhc3NEZWNsYXJhdGlvbiBhbm5vdGF0ZWRDbGFzcyA6IGFubm90YXRlZENsYXNzZXMpIHsKKwkJCWRvVmFsaWRhdGUoYW5ub3RhdGVkQ2xhc3MsIGNvbnRleHQpOworCQl9CisJfQorCisJLyoqCisJICogSW52b2tlZCBieSB0aGUgdmFsaWRhdG9yCisJICogQHBhcmFtIGFubm90YXRlZENsYXNzIHRoZSBnZW5lcmF0ZWQgY2xhc3MgdGhhdCBzaG91bGQgYmUgdmFsaWRhdGVkIAorCSAqIEBwYXJhbSBjb250ZXh0IAorCSAqIEBzZWUgI2RvVmFsaWRhdGUoTGlzdCwgVmFsaWRhdGlvbkNvbnRleHQpCisJICogQHNpbmNlIDIuNworCSAqLworCXB1YmxpYyB2b2lkIGRvVmFsaWRhdGUoQ2xhc3NEZWNsYXJhdGlvbiBhbm5vdGF0ZWRDbGFzcywgQEV4dGVuc2lvbiBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7fQorCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9BYnN0cmFjdENvbnN0cnVjdG9yUHJvY2Vzc29yLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9BYnN0cmFjdENvbnN0cnVjdG9yUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyNTUzOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL0Fic3RyYWN0Q29uc3RydWN0b3JQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNybzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkNvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5FeHRlbnNpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIEEgY29udmVuaWVudCBiYXNlIGNsYXNzIHRvIHByb2Nlc3MgYWN0aXZlIGFubm90YXRpb25zIGZvciBjb25zdHJ1Y3RvcnMuCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQHNpbmNlIDIuOAorICovCitAQmV0YQorcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29uc3RydWN0b3JQcm9jZXNzb3IgaW1wbGVtZW50cyBSZWdpc3Rlckdsb2JhbHNQYXJ0aWNpcGFudDxDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiwgVHJhbnNmb3JtYXRpb25QYXJ0aWNpcGFudDxNdXRhYmxlQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4sIENvZGVHZW5lcmF0aW9uUGFydGljaXBhbnQ8Q29uc3RydWN0b3JEZWNsYXJhdGlvbj4sIFZhbGlkYXRpb25QYXJ0aWNpcGFudDxDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiB7CisJCisJcHVibGljIHZvaWQgZG9SZWdpc3Rlckdsb2JhbHMoTGlzdDw/IGV4dGVuZHMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gYW5ub3RhdGVkQ29uc3RydWN0b3JzLCBSZWdpc3Rlckdsb2JhbHNDb250ZXh0IGNvbnRleHQpIHsKKwkJZm9yIChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGFubm90YXRlZENvbnN0cnVjdG9yIDogYW5ub3RhdGVkQ29uc3RydWN0b3JzKSB7CisJCQlkb1JlZ2lzdGVyR2xvYmFscyhhbm5vdGF0ZWRDb25zdHJ1Y3RvciwgY29udGV4dCk7CisJCX0KKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFubm90YXRlZENvbnN0cnVjdG9yIGEgc291cmNlIG1ldGhvZCBhbm5vdGF0ZWQgd2l0aCB0aGUgYW5ub3RhdGlvbiB0aGlzIHByb2Nlc3NvciBpcyByZXNwb25zaWJsZSBmb3IuCisJICogQHBhcmFtIGNvbnRleHQKKwkgKi8KKwlwdWJsaWMgdm9pZCBkb1JlZ2lzdGVyR2xvYmFscyhDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGFubm90YXRlZENvbnN0cnVjdG9yLCBSZWdpc3Rlckdsb2JhbHNDb250ZXh0IGNvbnRleHQpIHt9CisKKwlwdWJsaWMgdm9pZCBkb1RyYW5zZm9ybShMaXN0PD8gZXh0ZW5kcyBNdXRhYmxlQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gYW5ub3RhdGVkQ29uc3RydWN0b3JzLCBARXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWZvciAoTXV0YWJsZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gYW5ub3RhdGVkQ29uc3RydWN0b3IgOiBhbm5vdGF0ZWRDb25zdHJ1Y3RvcnMpIHsKKwkJCWRvVHJhbnNmb3JtKGFubm90YXRlZENvbnN0cnVjdG9yLCBjb250ZXh0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhbm5vdGF0ZWRDb25zdHJ1Y3RvciBhIG11dGFibGUgbWV0aG9kIHJlcHJlc2VudGF0aW9uIGFubm90YXRlZCB3aXRoIHRoZSBhbm5vdGF0aW9uIHRoaXMgcHJvY2Vzc29yIGlzIHJlc3BvbnNpYmxlIGZvci4KKwkgKiBAcGFyYW0gY29udGV4dAorCSAqLworCXB1YmxpYyB2b2lkIGRvVHJhbnNmb3JtKE11dGFibGVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGFubm90YXRlZENvbnN0cnVjdG9yLCBARXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7fQorCisJcHVibGljIHZvaWQgZG9HZW5lcmF0ZUNvZGUoTGlzdDw/IGV4dGVuZHMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gYW5ub3RhdGVkQ29uc3RydWN0b3JzLCBARXh0ZW5zaW9uIENvZGVHZW5lcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWZvciAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBhbm5vdGF0ZWRDb25zdHJ1Y3RvciA6IGFubm90YXRlZENvbnN0cnVjdG9ycykgeworCQkJZG9HZW5lcmF0ZUNvZGUoYW5ub3RhdGVkQ29uc3RydWN0b3IsIGNvbnRleHQpOworCQl9CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBhbm5vdGF0ZWRDb25zdHJ1Y3RvciBhIHNvdXJjZSBtZXRob2QgYW5ub3RhdGVkIHdpdGggdGhlIGFubm90YXRpb24gdGhpcyBwcm9jZXNzb3IgaXMgcmVzcG9uc2libGUgZm9yLgorCSAqIEBwYXJhbSBjb250ZXh0CisJICovCisJcHVibGljIHZvaWQgZG9HZW5lcmF0ZUNvZGUoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBhbm5vdGF0ZWRDb25zdHJ1Y3RvciwgQEV4dGVuc2lvbiBDb2RlR2VuZXJhdGlvbkNvbnRleHQgY29udGV4dCkge30KKworCXB1YmxpYyB2b2lkIGRvVmFsaWRhdGUoTGlzdDw/IGV4dGVuZHMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gYW5ub3RhdGVkQ29uc3RydWN0b3JzLCBARXh0ZW5zaW9uIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKwkJZm9yIChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGFubm90YXRlZENvbnN0cnVjdG9yIDogYW5ub3RhdGVkQ29uc3RydWN0b3JzKSB7CisJCQlkb1ZhbGlkYXRlKGFubm90YXRlZENvbnN0cnVjdG9yLCBjb250ZXh0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIEludm9rZWQgYnkgdGhlIHZhbGlkYXRvciAKKwkgKiBAcGFyYW0gYW5ub3RhdGVkQ29uc3RydWN0b3IgdGhhdCBnZW5lcmF0ZWQgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZAorCSAqIEBwYXJhbSBjb250ZXh0CisJICogQHNlZSAjZG9WYWxpZGF0ZShDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBWYWxpZGF0aW9uQ29udGV4dCkKKwkgKiBAc2luY2UgMi43CisJICovCisJcHVibGljIHZvaWQgZG9WYWxpZGF0ZShDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGFubm90YXRlZENvbnN0cnVjdG9yLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vQWJzdHJhY3RFbnVtZXJhdGlvblR5cGVQcm9jZXNzb3IuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL0Fic3RyYWN0RW51bWVyYXRpb25UeXBlUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5YjIwOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL0Fic3RyYWN0RW51bWVyYXRpb25UeXBlUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm87CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5FbnVtZXJhdGlvblR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTXV0YWJsZUVudW1lcmF0aW9uVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5FeHRlbnNpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIEEgY29udmVuaWVudCBiYXNlIGNsYXNzIHRvIHByb2Nlc3MgYWN0aXZlIGFubm90YXRpb25zIGZvciBlbnVtZXJhdGlvbiB0eXBlcy4KKyAqLworQEJldGEKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVudW1lcmF0aW9uVHlwZVByb2Nlc3NvciBpbXBsZW1lbnRzIFJlZ2lzdGVyR2xvYmFsc1BhcnRpY2lwYW50PEVudW1lcmF0aW9uVHlwZURlY2xhcmF0aW9uPiwgVHJhbnNmb3JtYXRpb25QYXJ0aWNpcGFudDxNdXRhYmxlRW51bWVyYXRpb25UeXBlRGVjbGFyYXRpb24+LCBDb2RlR2VuZXJhdGlvblBhcnRpY2lwYW50PEVudW1lcmF0aW9uVHlwZURlY2xhcmF0aW9uPiwgVmFsaWRhdGlvblBhcnRpY2lwYW50PEVudW1lcmF0aW9uVHlwZURlY2xhcmF0aW9uPiB7CisKKwlwdWJsaWMgdm9pZCBkb1JlZ2lzdGVyR2xvYmFscyhMaXN0PD8gZXh0ZW5kcyBFbnVtZXJhdGlvblR5cGVEZWNsYXJhdGlvbj4gYW5ub3RhdGVkRW51bWVyYXRpb25UeXBlcywgQEV4dGVuc2lvbiBSZWdpc3Rlckdsb2JhbHNDb250ZXh0IGNvbnRleHQpIHsKKwkJZm9yIChFbnVtZXJhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0ZWRFbnVtZXJhdGlvblR5cGUgOiBhbm5vdGF0ZWRFbnVtZXJhdGlvblR5cGVzKSB7CisJCQlkb1JlZ2lzdGVyR2xvYmFscyhhbm5vdGF0ZWRFbnVtZXJhdGlvblR5cGUsIGNvbnRleHQpOworCQl9CisJfQorCQorCS8qKgorCSAqIENhbGxlZCBkdXJpbmcgZ2xvYmFsIHN5bWJvbCBjb2xsZWN0aW5nLgorCSAqIAorCSAqIEBwYXJhbSBhbm5vdGF0ZWRFbnVtZXJhdGlvblR5cGUgYSBzb3VyY2UgZWxlbWVudCBhbm5vdGF0ZWQgd2l0aCB0aGUgYW5ub3RhdGlvbiB0aGlzIHByb2Nlc3NvciBpcyByZXNwb25zaWJsZSBmb3IuCisJICogQHBhcmFtIGNvbnRleHQKKwkgKi8KKwlwdWJsaWMgdm9pZCBkb1JlZ2lzdGVyR2xvYmFscyhFbnVtZXJhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0ZWRFbnVtZXJhdGlvblR5cGUsIEBFeHRlbnNpb24gUmVnaXN0ZXJHbG9iYWxzQ29udGV4dCBjb250ZXh0KSB7fQorCQorCXB1YmxpYyB2b2lkIGRvVHJhbnNmb3JtKExpc3Q8PyBleHRlbmRzIE11dGFibGVFbnVtZXJhdGlvblR5cGVEZWNsYXJhdGlvbj4gYW5ub3RhdGVkRW51bWVyYXRpb25UeXBlcywgQEV4dGVuc2lvbiBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworCQlmb3IgKE11dGFibGVFbnVtZXJhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0ZWRFbnVtZXJhdGlvblR5cGUgOiBhbm5vdGF0ZWRFbnVtZXJhdGlvblR5cGVzKSB7CisJCQlkb1RyYW5zZm9ybShhbm5vdGF0ZWRFbnVtZXJhdGlvblR5cGUsIGNvbnRleHQpOworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIGFubm90YXRlZEVudW1lcmF0aW9uVHlwZSBhIG11dGFibGUgZW51bWVyYXRpb24gdHlwZSByZXByZXNlbnRhdGlvbiBhbm5vdGF0ZWQgd2l0aCB0aGUgYW5ub3RhdGlvbiB0aGlzIHByb2Nlc3NvciBpcyByZXNwb25zaWJsZSBmb3IuCisJICogQHBhcmFtIGNvbnRleHQKKwkgKi8KKwlwdWJsaWMgdm9pZCBkb1RyYW5zZm9ybShNdXRhYmxlRW51bWVyYXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGVkRW51bWVyYXRpb25UeXBlLCBARXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7fQorCisJcHVibGljIHZvaWQgZG9HZW5lcmF0ZUNvZGUoTGlzdDw/IGV4dGVuZHMgRW51bWVyYXRpb25UeXBlRGVjbGFyYXRpb24+IGFubm90YXRlZFNvdXJjZUVsZW1lbnRzLCBARXh0ZW5zaW9uIENvZGVHZW5lcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWZvciAoRW51bWVyYXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGVkRW51bWVyYXRpb25UeXBlIDogYW5ub3RhdGVkU291cmNlRWxlbWVudHMpIHsKKwkJCWRvR2VuZXJhdGVDb2RlKGFubm90YXRlZEVudW1lcmF0aW9uVHlwZSwgY29udGV4dCk7CisJCX0KKwl9CisJCisJLyoqCisJICogQ2FsbGVkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uIAorCSAqIAorCSAqIEBwYXJhbSBhbm5vdGF0ZWRFbnVtZXJhdGlvblR5cGUgYSBzb3VyY2UgZWxlbWVudCBhbm5vdGF0ZWQgd2l0aCB0aGUgYW5ub3RhdGlvbiB0aGlzIHByb2Nlc3NvciBpcyByZXNwb25zaWJsZSBmb3IuCisJICogQHBhcmFtIGNvbnRleHQKKwkgKiBAc2VlIENvZGVHZW5lcmF0aW9uUGFydGljaXBhbnQjZG9HZW5lcmF0ZUNvZGUoTGlzdCwgQ29kZUdlbmVyYXRpb25Db250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIGRvR2VuZXJhdGVDb2RlKEVudW1lcmF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRlZEVudW1lcmF0aW9uVHlwZSwgQEV4dGVuc2lvbiBDb2RlR2VuZXJhdGlvbkNvbnRleHQgY29udGV4dCkge30KKwkKKwlwdWJsaWMgdm9pZCBkb1ZhbGlkYXRlKExpc3Q8PyBleHRlbmRzIEVudW1lcmF0aW9uVHlwZURlY2xhcmF0aW9uPiBhbm5vdGF0ZWRFbnVtZXJhdGlvblR5cGVzLCBARXh0ZW5zaW9uIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKwkJZm9yIChFbnVtZXJhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0ZWRFbnVtZXJhdGlvblR5cGUgOiBhbm5vdGF0ZWRFbnVtZXJhdGlvblR5cGVzKSB7CisJCQlkb1ZhbGlkYXRlKGFubm90YXRlZEVudW1lcmF0aW9uVHlwZSwgY29udGV4dCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBJbnZva2VkIGJ5IHRoZSB2YWxpZGF0b3IKKwkgKiBAcGFyYW0gYW5ub3RhdGVkRW51bWVyYXRpb25UeXBlIHRoZSBnZW5lcmF0ZWQgZW51bWVyYXRpb24gdHlwZSB0aGF0IHNob3VsZCBiZSB2YWxpZGF0ZWQgCisJICogQHBhcmFtIGNvbnRleHQgCisJICogQHNlZSAjZG9WYWxpZGF0ZShMaXN0LCBWYWxpZGF0aW9uQ29udGV4dCkKKwkgKiBAc2luY2UgMi43CisJICovCisJcHVibGljIHZvaWQgZG9WYWxpZGF0ZShFbnVtZXJhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0ZWRFbnVtZXJhdGlvblR5cGUsIEBFeHRlbnNpb24gVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkge30KKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vQWJzdHJhY3RGaWVsZFByb2Nlc3Nvci5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vQWJzdHJhY3RGaWVsZFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MmQwYTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9BYnN0cmFjdEZpZWxkUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm87CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRXh0ZW5zaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBBIGNvbnZlbmllbnQgYmFzZSBjbGFzcyB0byBwcm9jZXNzIGFjdGl2ZSBhbm5vdGF0aW9ucyBmb3IgZmllbGRzLgorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqLworQEJldGEKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZpZWxkUHJvY2Vzc29yIGltcGxlbWVudHMgUmVnaXN0ZXJHbG9iYWxzUGFydGljaXBhbnQ8RmllbGREZWNsYXJhdGlvbj4sIFRyYW5zZm9ybWF0aW9uUGFydGljaXBhbnQ8TXV0YWJsZUZpZWxkRGVjbGFyYXRpb24+LCBDb2RlR2VuZXJhdGlvblBhcnRpY2lwYW50PEZpZWxkRGVjbGFyYXRpb24+LCBWYWxpZGF0aW9uUGFydGljaXBhbnQ8RmllbGREZWNsYXJhdGlvbj57CisJCisJcHVibGljIHZvaWQgZG9SZWdpc3Rlckdsb2JhbHMoTGlzdDw/IGV4dGVuZHMgRmllbGREZWNsYXJhdGlvbj4gYW5ub3RhdGVkRmllbGRzLCBARXh0ZW5zaW9uIFJlZ2lzdGVyR2xvYmFsc0NvbnRleHQgY29udGV4dCkgeworCQlmb3IgKEZpZWxkRGVjbGFyYXRpb24gYW5ub3RhdGVkRmllbGQgOiBhbm5vdGF0ZWRGaWVsZHMpIHsKKwkJCWRvUmVnaXN0ZXJHbG9iYWxzKGFubm90YXRlZEZpZWxkLCBjb250ZXh0KTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYW5ub3RhdGVkRmllbGQgYSBzb3VyY2UgZmllbGQgYW5ub3RhdGVkIHdpdGggdGhlIGFubm90YXRpb24gdGhpcyBwcm9jZXNzb3IgaXMgcmVzcG9uc2libGUgZm9yLgorCSAqIEBwYXJhbSBjb250ZXh0CisJICovCisJcHVibGljIHZvaWQgZG9SZWdpc3Rlckdsb2JhbHMoRmllbGREZWNsYXJhdGlvbiBhbm5vdGF0ZWRGaWVsZCwgQEV4dGVuc2lvbiBSZWdpc3Rlckdsb2JhbHNDb250ZXh0IGNvbnRleHQpIHt9CisKKwlwdWJsaWMgdm9pZCBkb1RyYW5zZm9ybShMaXN0PD8gZXh0ZW5kcyBNdXRhYmxlRmllbGREZWNsYXJhdGlvbj4gYW5ub3RhdGVkZmllbGRzLCBARXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWZvciAoTXV0YWJsZUZpZWxkRGVjbGFyYXRpb24gYW5ub3RhdGVkRmllbGQgOiBhbm5vdGF0ZWRmaWVsZHMpIHsKKwkJCWRvVHJhbnNmb3JtKGFubm90YXRlZEZpZWxkLCBjb250ZXh0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhbm5vdGF0ZWRGaWVsZCBhIG11dGFibGUgZmllbGQgcmVwcmVzZW50YXRpb24gYW5ub3RhdGVkIHdpdGggdGhlIGFubm90YXRpb24gdGhpcyBwcm9jZXNzb3IgaXMgcmVzcG9uc2libGUgZm9yLgorCSAqIEBwYXJhbSBjb250ZXh0CisJICovCisJcHVibGljIHZvaWQgZG9UcmFuc2Zvcm0oTXV0YWJsZUZpZWxkRGVjbGFyYXRpb24gYW5ub3RhdGVkRmllbGQsIEBFeHRlbnNpb24gVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQpIHt9CisKKwlwdWJsaWMgdm9pZCBkb0dlbmVyYXRlQ29kZShMaXN0PD8gZXh0ZW5kcyBGaWVsZERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRGaWVsZHMsIEBFeHRlbnNpb24gQ29kZUdlbmVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKwkJZm9yIChGaWVsZERlY2xhcmF0aW9uIGFubm90YXRlZEZpZWxkIDogYW5ub3RhdGVkRmllbGRzKSB7CisJCQlkb0dlbmVyYXRlQ29kZShhbm5vdGF0ZWRGaWVsZCwgY29udGV4dCk7CisJCX0KKwl9CisJCisJLyoqCisJICogQ2FsbGVkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uIAorCSAqIAorCSAqIEBwYXJhbSBhbm5vdGF0ZWRGaWVsZCBhIHNvdXJjZSBlbGVtZW50IGFubm90YXRlZCB3aXRoIHRoZSBhbm5vdGF0aW9uIHRoaXMgcHJvY2Vzc29yIGlzIHJlc3BvbnNpYmxlIGZvci4KKwkgKiBAcGFyYW0gY29udGV4dAorCSAqIEBzZWUgQ29kZUdlbmVyYXRpb25QYXJ0aWNpcGFudCNkb0dlbmVyYXRlQ29kZShMaXN0LCBDb2RlR2VuZXJhdGlvbkNvbnRleHQpCisJICovCisJcHVibGljIHZvaWQgZG9HZW5lcmF0ZUNvZGUoRmllbGREZWNsYXJhdGlvbiBhbm5vdGF0ZWRGaWVsZCwgQEV4dGVuc2lvbiBDb2RlR2VuZXJhdGlvbkNvbnRleHQgY29udGV4dCkge30KKwkKKwlwdWJsaWMgdm9pZCBkb1ZhbGlkYXRlKExpc3Q8PyBleHRlbmRzIEZpZWxkRGVjbGFyYXRpb24+IGFubm90YXRlZEZpZWxkcywgQEV4dGVuc2lvbiBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWZvciAoRmllbGREZWNsYXJhdGlvbiBhbm5vdGF0ZWRGaWVsZCA6IGFubm90YXRlZEZpZWxkcykgeworCQkJZG9WYWxpZGF0ZShhbm5vdGF0ZWRGaWVsZCwgY29udGV4dCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBJbnZva2VkIGJ5IHRoZSB2YWxpZGF0b3IKKwkgKiBAcGFyYW0gYW5ub3RhdGVkRmllbGQgdGhlIGdlbmVyYXRlZCBmaWVsZCB0aGF0IHNob3VsZCBiZSB2YWxpZGF0ZWQgCisJICogQHBhcmFtIGNvbnRleHQgCisJICogQHNlZSAjZG9WYWxpZGF0ZShMaXN0LCBWYWxpZGF0aW9uQ29udGV4dCkKKwkgKiBAc2luY2UgMi43CisJICovCisJcHVibGljIHZvaWQgZG9WYWxpZGF0ZShGaWVsZERlY2xhcmF0aW9uIGFubm90YXRlZEZpZWxkLCBARXh0ZW5zaW9uIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHt9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9BYnN0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vQWJzdHJhY3RJbnRlcmZhY2VQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWQ4N2U4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vQWJzdHJhY3RJbnRlcmZhY2VQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNybzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlSW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkV4dGVuc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQSBjb252ZW5pZW50IGJhc2UgY2xhc3MgdG8gcHJvY2VzcyBhY3RpdmUgYW5ub3RhdGlvbnMgZm9yIGludGVyZmFjZXMuCisgKi8KK0BCZXRhCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbnRlcmZhY2VQcm9jZXNzb3IgaW1wbGVtZW50cyBSZWdpc3Rlckdsb2JhbHNQYXJ0aWNpcGFudDxJbnRlcmZhY2VEZWNsYXJhdGlvbj4sIFRyYW5zZm9ybWF0aW9uUGFydGljaXBhbnQ8TXV0YWJsZUludGVyZmFjZURlY2xhcmF0aW9uPiwgQ29kZUdlbmVyYXRpb25QYXJ0aWNpcGFudDxJbnRlcmZhY2VEZWNsYXJhdGlvbj4sIFZhbGlkYXRpb25QYXJ0aWNpcGFudDxJbnRlcmZhY2VEZWNsYXJhdGlvbj4geworCisJcHVibGljIHZvaWQgZG9SZWdpc3Rlckdsb2JhbHMoTGlzdDw/IGV4dGVuZHMgSW50ZXJmYWNlRGVjbGFyYXRpb24+IGFubm90YXRlZEludGVyZmFjZXMsIEBFeHRlbnNpb24gUmVnaXN0ZXJHbG9iYWxzQ29udGV4dCBjb250ZXh0KSB7CisJCWZvciAoSW50ZXJmYWNlRGVjbGFyYXRpb24gYW5ub3RhdGVkSW50ZXJmYWNlIDogYW5ub3RhdGVkSW50ZXJmYWNlcykgeworCQkJZG9SZWdpc3Rlckdsb2JhbHMoYW5ub3RhdGVkSW50ZXJmYWNlLCBjb250ZXh0KTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBDYWxsZWQgZHVyaW5nIGdsb2JhbCBzeW1ib2wgY29sbGVjdGluZy4KKwkgKiAKKwkgKiBAcGFyYW0gYW5ub3RhdGVkSW50ZXJmYWNlIGEgc291cmNlIGVsZW1lbnQgYW5ub3RhdGVkIHdpdGggdGhlIGFubm90YXRpb24gdGhpcyBwcm9jZXNzb3IgaXMgcmVzcG9uc2libGUgZm9yLgorCSAqIEBwYXJhbSBjb250ZXh0CisJICovCisJcHVibGljIHZvaWQgZG9SZWdpc3Rlckdsb2JhbHMoSW50ZXJmYWNlRGVjbGFyYXRpb24gYW5ub3RhdGVkSW50ZXJmYWNlLCBARXh0ZW5zaW9uIFJlZ2lzdGVyR2xvYmFsc0NvbnRleHQgY29udGV4dCkge30KKwkKKwlwdWJsaWMgdm9pZCBkb1RyYW5zZm9ybShMaXN0PD8gZXh0ZW5kcyBNdXRhYmxlSW50ZXJmYWNlRGVjbGFyYXRpb24+IGFubm90YXRlZEludGVyZmFjZXMsIEBFeHRlbnNpb24gVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKwkJZm9yIChNdXRhYmxlSW50ZXJmYWNlRGVjbGFyYXRpb24gYW5ub3RhdGVkSW50ZXJmYWNlIDogYW5ub3RhdGVkSW50ZXJmYWNlcykgeworCQkJZG9UcmFuc2Zvcm0oYW5ub3RhdGVkSW50ZXJmYWNlLCBjb250ZXh0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBhbm5vdGF0ZWRJbnRlcmZhY2UgYSBtdXRhYmxlIGludGVyZmFjZSByZXByZXNlbnRhdGlvbiBhbm5vdGF0ZWQgd2l0aCB0aGUgYW5ub3RhdGlvbiB0aGlzIHByb2Nlc3NvciBpcyByZXNwb25zaWJsZSBmb3IuCisJICogQHBhcmFtIGNvbnRleHQKKwkgKi8KKwlwdWJsaWMgdm9pZCBkb1RyYW5zZm9ybShNdXRhYmxlSW50ZXJmYWNlRGVjbGFyYXRpb24gYW5ub3RhdGVkSW50ZXJmYWNlLCBARXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0KSB7fQorCisJcHVibGljIHZvaWQgZG9HZW5lcmF0ZUNvZGUoTGlzdDw/IGV4dGVuZHMgSW50ZXJmYWNlRGVjbGFyYXRpb24+IGFubm90YXRlZFNvdXJjZUVsZW1lbnRzLCBARXh0ZW5zaW9uIENvZGVHZW5lcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWZvciAoSW50ZXJmYWNlRGVjbGFyYXRpb24gYW5ub3RhdGVkSW50ZXJmYWNlIDogYW5ub3RhdGVkU291cmNlRWxlbWVudHMpIHsKKwkJCWRvR2VuZXJhdGVDb2RlKGFubm90YXRlZEludGVyZmFjZSwgY29udGV4dCk7CisJCX0KKwl9CisJCisJLyoqCisJICogQ2FsbGVkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uIAorCSAqIAorCSAqIEBwYXJhbSBhbm5vdGF0ZWRJbnRlcmZhY2UgYSBzb3VyY2UgZWxlbWVudCBhbm5vdGF0ZWQgd2l0aCB0aGUgYW5ub3RhdGlvbiB0aGlzIHByb2Nlc3NvciBpcyByZXNwb25zaWJsZSBmb3IuCisJICogQHBhcmFtIGNvbnRleHQKKwkgKiBAc2VlIENvZGVHZW5lcmF0aW9uUGFydGljaXBhbnQjZG9HZW5lcmF0ZUNvZGUoTGlzdCwgQ29kZUdlbmVyYXRpb25Db250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIGRvR2VuZXJhdGVDb2RlKEludGVyZmFjZURlY2xhcmF0aW9uIGFubm90YXRlZEludGVyZmFjZSwgQEV4dGVuc2lvbiBDb2RlR2VuZXJhdGlvbkNvbnRleHQgY29udGV4dCkge30KKwkKKwlwdWJsaWMgdm9pZCBkb1ZhbGlkYXRlKExpc3Q8PyBleHRlbmRzIEludGVyZmFjZURlY2xhcmF0aW9uPiBhbm5vdGF0ZWRJbnRlcmZhY2VzLCBARXh0ZW5zaW9uIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKwkJZm9yIChJbnRlcmZhY2VEZWNsYXJhdGlvbiBhbm5vdGF0ZWRJbnRlcmZhY2UgOiBhbm5vdGF0ZWRJbnRlcmZhY2VzKSB7CisJCQlkb1ZhbGlkYXRlKGFubm90YXRlZEludGVyZmFjZSwgY29udGV4dCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBJbnZva2VkIGJ5IHRoZSB2YWxpZGF0b3IKKwkgKiBAcGFyYW0gYW5ub3RhdGVkSW50ZXJmYWNlIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZCAKKwkgKiBAcGFyYW0gY29udGV4dCAKKwkgKiBAc2VlICNkb1ZhbGlkYXRlKExpc3QsIFZhbGlkYXRpb25Db250ZXh0KQorCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlwdWJsaWMgdm9pZCBkb1ZhbGlkYXRlKEludGVyZmFjZURlY2xhcmF0aW9uIGFubm90YXRlZEludGVyZmFjZSwgQEV4dGVuc2lvbiBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7fQorCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9BYnN0cmFjdE1ldGhvZFByb2Nlc3Nvci5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vQWJzdHJhY3RNZXRob2RQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWI4MmNjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vQWJzdHJhY3RNZXRob2RQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNybzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkV4dGVuc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQSBjb252ZW5pZW50IGJhc2UgY2xhc3MgdG8gcHJvY2VzcyBhY3RpdmUgYW5ub3RhdGlvbnMgZm9yIG1ldGhvZHMuCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICovCitAQmV0YQorcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWV0aG9kUHJvY2Vzc29yIGltcGxlbWVudHMgUmVnaXN0ZXJHbG9iYWxzUGFydGljaXBhbnQ8TWV0aG9kRGVjbGFyYXRpb24+LCBUcmFuc2Zvcm1hdGlvblBhcnRpY2lwYW50PE11dGFibGVNZXRob2REZWNsYXJhdGlvbj4sIENvZGVHZW5lcmF0aW9uUGFydGljaXBhbnQ8TWV0aG9kRGVjbGFyYXRpb24+LCBWYWxpZGF0aW9uUGFydGljaXBhbnQ8TWV0aG9kRGVjbGFyYXRpb24+IHsKKwkKKwlwdWJsaWMgdm9pZCBkb1JlZ2lzdGVyR2xvYmFscyhMaXN0PD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gYW5ub3RhdGVkTWV0aG9kcywgUmVnaXN0ZXJHbG9iYWxzQ29udGV4dCBjb250ZXh0KSB7CisJCWZvciAoTWV0aG9kRGVjbGFyYXRpb24gYW5ub3RhdGVkTWV0aG9kIDogYW5ub3RhdGVkTWV0aG9kcykgeworCQkJZG9SZWdpc3Rlckdsb2JhbHMoYW5ub3RhdGVkTWV0aG9kLCBjb250ZXh0KTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYW5ub3RhdGVkTWV0aG9kIGEgc291cmNlIG1ldGhvZCBhbm5vdGF0ZWQgd2l0aCB0aGUgYW5ub3RhdGlvbiB0aGlzIHByb2Nlc3NvciBpcyByZXNwb25zaWJsZSBmb3IuCisJICogQHBhcmFtIGNvbnRleHQKKwkgKi8KKwlwdWJsaWMgdm9pZCBkb1JlZ2lzdGVyR2xvYmFscyhNZXRob2REZWNsYXJhdGlvbiBhbm5vdGF0ZWRNZXRob2QsIFJlZ2lzdGVyR2xvYmFsc0NvbnRleHQgY29udGV4dCkge30KKworCXB1YmxpYyB2b2lkIGRvVHJhbnNmb3JtKExpc3Q8PyBleHRlbmRzIE11dGFibGVNZXRob2REZWNsYXJhdGlvbj4gYW5ub3RhdGVkTWV0aG9kcywgQEV4dGVuc2lvbiBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgeworCQlmb3IgKE11dGFibGVNZXRob2REZWNsYXJhdGlvbiBhbm5vdGF0ZWRNZXRob2QgOiBhbm5vdGF0ZWRNZXRob2RzKSB7CisJCQlkb1RyYW5zZm9ybShhbm5vdGF0ZWRNZXRob2QsIGNvbnRleHQpOworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIGFubm90YXRlZE1ldGhvZCBhIG11dGFibGUgbWV0aG9kIHJlcHJlc2VudGF0aW9uIGFubm90YXRlZCB3aXRoIHRoZSBhbm5vdGF0aW9uIHRoaXMgcHJvY2Vzc29yIGlzIHJlc3BvbnNpYmxlIGZvci4KKwkgKiBAcGFyYW0gY29udGV4dAorCSAqLworCXB1YmxpYyB2b2lkIGRvVHJhbnNmb3JtKE11dGFibGVNZXRob2REZWNsYXJhdGlvbiBhbm5vdGF0ZWRNZXRob2QsIEBFeHRlbnNpb24gVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQpIHt9CisKKwlwdWJsaWMgdm9pZCBkb0dlbmVyYXRlQ29kZShMaXN0PD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gYW5ub3RhdGVkTWV0aG9kcywgQEV4dGVuc2lvbiBDb2RlR2VuZXJhdGlvbkNvbnRleHQgY29udGV4dCkgeworCQlmb3IgKE1ldGhvZERlY2xhcmF0aW9uIGFubm90YXRlZE1ldGhvZCA6IGFubm90YXRlZE1ldGhvZHMpIHsKKwkJCWRvR2VuZXJhdGVDb2RlKGFubm90YXRlZE1ldGhvZCwgY29udGV4dCk7CisJCX0KKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFubm90YXRlZE1ldGhvZCBhIHNvdXJjZSBtZXRob2QgYW5ub3RhdGVkIHdpdGggdGhlIGFubm90YXRpb24gdGhpcyBwcm9jZXNzb3IgaXMgcmVzcG9uc2libGUgZm9yLgorCSAqIEBwYXJhbSBjb250ZXh0CisJICovCisJcHVibGljIHZvaWQgZG9HZW5lcmF0ZUNvZGUoTWV0aG9kRGVjbGFyYXRpb24gYW5ub3RhdGVkTWV0aG9kLCBARXh0ZW5zaW9uIENvZGVHZW5lcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7fQorCisJcHVibGljIHZvaWQgZG9WYWxpZGF0ZShMaXN0PD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gYW5ub3RhdGVkTWV0aG9kcywgQEV4dGVuc2lvbiBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCWZvciAoTWV0aG9kRGVjbGFyYXRpb24gYW5ub3RhdGVkTWV0aG9kIDogYW5ub3RhdGVkTWV0aG9kcykgeworCQkJZG9WYWxpZGF0ZShhbm5vdGF0ZWRNZXRob2QsIGNvbnRleHQpOworCQl9CisJfQorCisJLyoqCisJICogSW52b2tlZCBieSB0aGUgdmFsaWRhdG9yIAorCSAqIEBwYXJhbSBhbm5vdGF0ZWRNZXRob2QgdGhhdCBnZW5lcmF0ZWQgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZAorCSAqIEBwYXJhbSBjb250ZXh0CisJICogQHNlZSAjZG9WYWxpZGF0ZShNZXRob2REZWNsYXJhdGlvbiwgVmFsaWRhdGlvbkNvbnRleHQpCisJICogQHNpbmNlIDIuNworCSAqLworCXB1YmxpYyB2b2lkIGRvVmFsaWRhdGUoTWV0aG9kRGVjbGFyYXRpb24gYW5ub3RhdGVkTWV0aG9kLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vQWN0aXZlLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9BY3RpdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmIxZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vQWN0aXZlLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm87CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogVGhlIGFjdGl2ZSBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gcmVnaXN0ZXIgY29tcGlsYXRpb24gcGFydGljaXBhbnRzCisgKiB3aXRoIGFubm90YXRpb25zLiAKKyAqIAorICogIFRoZXkgYWxsb3cgZm9yIGVuaGFuY2luZyBhbmQgY2hhbmdpbmcgaG93IFh0ZW5kIGNvZGUgaXMgdHJhbnNsYXRlZCB0byBKYXZhLgorICogIAorICogIFRoZXJlIGFyZSBmb3VyIGNvbXBpbGVyIHBoYXNlcyBpbiB3aGljaCBhbiBhY3RpdmUgYW5ub3RhdGlvbiBjYW4gcGFydGljaXBhdGUsIGVhY2ggd2l0aCBkaWZmZXJlbnQgcG9zc2liaWxpdGllcyBhbmQgY29uc3RyYWludHM6CisgKiAgPHVsPgorICogIAk8bGk+UGhhc2UgMTogUmVnaXN0ZXIgR2xvYmFscyB7QGxpbmsgUmVnaXN0ZXJHbG9iYWxzUGFydGljaXBhbnR9PC9saT4KKyAqICAJPGxpPlBoYXNlIDI6IFRyYW5zZm9ybWF0aW9uIHtAbGluayBUcmFuc2Zvcm1hdGlvblBhcnRpY2lwYW50fTwvbGk+CisgKiAgCTxsaT5QaGFzZSAzOiBWYWxpZGF0ZSBDb2RlIHtAbGluayBWYWxpZGF0aW9uUGFydGljaXBhbnR9PC9saT4KKyAqICAJPGxpPlBoYXNlIDQ6IEdlbmVyYXRlIENvZGUge0BsaW5rIENvZGVHZW5lcmF0aW9uUGFydGljaXBhbnR9PC9saT4KKyAqICA8L3VsPgorICogIAorICogIE5vdGUsIHRoYXQgaW4gdGhlIElERSBwaGFzZSBvbmUsIHR3byBhbmQgdGhyZWUgYXJlIGV4ZWN1dGVkIGluIHRoZSBlZGl0b3IgYXMgeW91IHR5cGUsIHdoaWxlIHBoYXNlIDQgKGNvZGUgZ2VuZXJhdGlvbikgb25seSBnZXRzIGV4ZWN1dGVkIHdoZW4gCisgKiAgdGhlIGVkaXRvcidzIGNvbnRlbnRzIGdldHMgc2F2ZWQgdG8gZGlzay4KKyAqIAorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKi8KK0BCZXRhCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldChFbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEUpCitwdWJsaWMgQGludGVyZmFjZSBBY3RpdmUgeworCisJLyoqCisJICogQHJldHVybiB0aGUgcHJvY2Vzc29yIHRvIGNhbGwgZHVyaW5nIGNvbXBpbGF0aW9uLiBzaG91bGQgaW1wbGVtZW50IG9uZSBvcgorCSAqICAgICAgICAgbW9yZSBvZiB0aGUgcHJvY2Vzc29yIGludGVyZmFjZXMge0BsaW5rIFJlZ2lzdGVyR2xvYmFsc1BhcnRpY2lwYW50fSwKKwkgKiAgICAgICAgIHtAbGluayBUcmFuc2Zvcm1hdGlvblBhcnRpY2lwYW50fS4KKwkgKi8KKwlDbGFzczw/PiB2YWx1ZSgpOworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vQ29kZUdlbmVyYXRpb25Db250ZXh0LmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9Db2RlR2VuZXJhdGlvbkNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODI0MzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vQ29kZUdlbmVyYXRpb25Db250ZXh0LmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm87CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZmlsZS5GaWxlTG9jYXRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5maWxlLk11dGFibGVGaWxlU3lzdGVtU3VwcG9ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXMuR2xvYmFsVHlwZUxvb2t1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXMuVHJhY2FiaWxpdHk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIFByb3ZpZGVzIHNlcnZpY2VzIGZvciB0aGUgY29kZSBnZW5lcmF0aW9uIHBoYXNlLgorICogCisgKiBAc2VlIENvZGVHZW5lcmF0aW9uUGFydGljaXBhbnQKKyAqIAorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIENvZGVHZW5lcmF0aW9uQ29udGV4dCBleHRlbmRzIE11dGFibGVGaWxlU3lzdGVtU3VwcG9ydCwgRmlsZUxvY2F0aW9ucywgR2xvYmFsVHlwZUxvb2t1cCwgVHJhY2FiaWxpdHkgeworCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9Db2RlR2VuZXJhdGlvblBhcnRpY2lwYW50LmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9Db2RlR2VuZXJhdGlvblBhcnRpY2lwYW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmZDI2YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL0NvZGVHZW5lcmF0aW9uUGFydGljaXBhbnQuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNybzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk5hbWVkRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRXh0ZW5zaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBBbm5vdGF0aW9uIHByb2Nlc3NvcnMgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgY2FsbGVkIGluIHRoZSBjb2RlIGdlbmVyYXRpb24gcGhhc2UsIHdoaWNoIGlzIGNhbGxlZCAKKyAqIHdoZW4gWHRlbmQncyBhY3R1YWwgSmF2YSBjb2RlIGlzIGdlbmVyYXRlZCBhbmQgd3JpdHRlbiB0byB0aGUgZmlsZSBzeXN0ZW0uCisgKiAKKyAqIER1cmluZyB0aGlzIHBoYXNlIGl0IGlzIHBlcm1pdHRlZCB0byB3cml0ZSB0byB0aGUgZmlsZSBzeXN0ZW0uCisgKiAKKyAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgd2hpY2ggdGhpcyBwcm9jZXNzb3IgcHJvY2Vzc2VzLgorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIAorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBDb2RlR2VuZXJhdGlvblBhcnRpY2lwYW50PFQgZXh0ZW5kcyBOYW1lZEVsZW1lbnQ+IHsKKworCS8qKgorCSAqIEludm9rZWQgYnkgdGhlIGNvbXBpbGVyIGR1cmluZyB0aGUgY29kZSBnZW5lcmF0aW9uIHBoYXNlLgorCSAqIAorCSAqIEBwYXJhbSBhbm5vdGF0ZWRTb3VyY2VFbGVtZW50cyB0aGUgaW1tdXRhYmxlIHNvdXJjZSByZXByZXNlbnRhdGlvbiAoaS5lLiB0aGUgWHRlbmQgQVNUKSBvZiB0aGUgYW5ub3RhdGVkIGVsZW1lbnRzCisJICogQHBhcmFtIGNvbnRleHQgYSB7QGxpbmsgVHJhbnNmb3JtYXRpb25Db250ZXh0fSBwcm92aWRpbmcgdXNlZnVsIHNlcnZpY2VzLgorCSAqLworCXZvaWQgZG9HZW5lcmF0ZUNvZGUoTGlzdDw/IGV4dGVuZHMgVD4gYW5ub3RhdGVkU291cmNlRWxlbWVudHMsIEBFeHRlbnNpb24gQ29kZUdlbmVyYXRpb25Db250ZXh0IGNvbnRleHQpOworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vUmVnaXN0ZXJHbG9iYWxzQ29udGV4dC5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vUmVnaXN0ZXJHbG9iYWxzQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMGFhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9SZWdpc3Rlckdsb2JhbHNDb250ZXh0LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmZpbGUuRmlsZUxvY2F0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZmlsZS5GaWxlU3lzdGVtU3VwcG9ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXMuU291cmNlVHlwZUxvb2t1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXMuVXBzdHJlYW1UeXBlTG9va3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBQcm92aWRlcyBzZXJ2aWNlcyB0byBiZSB1c2VkIGR1cmluZyByZWdpc3Rlci1nbG9iYWxzIHBoYXNlLgorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIAorICogQHNlZSBSZWdpc3Rlckdsb2JhbHNQYXJ0aWNpcGFudAorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBSZWdpc3Rlckdsb2JhbHNDb250ZXh0IGV4dGVuZHMgRmlsZVN5c3RlbVN1cHBvcnQsIEZpbGVMb2NhdGlvbnMsIFVwc3RyZWFtVHlwZUxvb2t1cCwgU291cmNlVHlwZUxvb2t1cCB7CisJCisJLyoqCisJICogUmVnaXN0ZXJzIGFuZCBjcmVhdGVzIGFuIGVtcHR5IEphdmEgY2xhc3Mgd2l0aCBnaXZlbiBxdWFsaWZpZWQgbmFtZQorCSAqIAorCSAqIElmIHRoZSBuYW1lJ3MgbmFtZXNwYWNlIHBhcnQgcmVmZXJzIHRvIGFub3RoZXIgZGVyaXZlZCBKYXZhIHR5cGUsIHRoaXMgdHlwZSB3aWxsIGJlY29tZSBhIHN0YXRpYyBtZW1iZXIgb2YgdGhhdCB0eXBlLgorCSAqIAorCSAqIEZvciBpbnN0YW5jZSwgZ2l2ZW4gYW4gCisJICogPHByZT4KKwkgKiAgLy8gY3JlYXRlcyBhIHR5cGUgJ015Q2xhc3MnIGluIHRoZSBwYWNrYWdlICdteS5wYWNrJworCSAqICByZWdpc3RlckNsYXNzKCJteS5wYWNrLk15Q2xhc3MiKSAKKwkgKiAKKwkgKiAgLy8gY3JlYXRlcyBhIHR5cGUgJ015SW5uZXJDbGFzcycgYXMgYSBtZW1iZXIgb2YgdGhlIHR5cGUgJ215LnBhY2suTXlDbGFzcycKKwkgKiAgcmVnaXN0ZXJDbGFzcygibXkucGFjay5NeUNsYXNzLk15SW5uZXJDbGFzcyIpIAorCSAqIDwvcHJlPgorCSAqIAorCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHF1YWxpZmllZE5hbWUgY29uZmxpY3RzIHdpdGggYW55IGV4aXN0aW5nIHR5cGVzLgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBpcyBub3QgYSB2YWxpZCBxdWFsaWZpZWQgbmFtZQorCSAqLworCXZvaWQgcmVnaXN0ZXJDbGFzcyhTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA7CisJCisJLyoqCisJICogUmVnaXN0ZXJzIGFuZCBjcmVhdGVzIGFuIGVtcHR5IEphdmEgaW50ZXJmYWNlIHdpdGggZ2l2ZW4gcXVhbGlmaWVkIG5hbWUKKwkgKiAKKwkgKiBJZiB0aGUgbmFtZSdzIG5hbWVzcGFjZSBwYXJ0IHJlZmVycyB0byBhbm90aGVyIGRlcml2ZWQgSmF2YSB0eXBlLCB0aGlzIHR5cGUgd2lsbCBiZWNvbWUgYSBzdGF0aWMgbWVtYmVyIG9mIHRoYXQgdHlwZS4KKwkgKiAKKwkgKiBGb3IgaW5zdGFuY2UsIGdpdmVuIGFuIAorCSAqIDxwcmU+CisJICogIC8vIGNyZWF0ZXMgYSB0eXBlICdNeUNsYXNzJyBpbiB0aGUgcGFja2FnZSAnbXkucGFjaycKKwkgKiAgcmVnaXN0ZXJDbGFzcygibXkucGFjay5NeUNsYXNzIikgCisJICogCisJICogIC8vIGNyZWF0ZXMgYSB0eXBlICdNeUlubmVyQ2xhc3MnIGFzIGEgbWVtYmVyIG9mIHRoZSB0eXBlICdteS5wYWNrLk15Q2xhc3MnCisJICogIHJlZ2lzdGVyQ2xhc3MoIm15LnBhY2suTXlDbGFzcy5NeUlubmVyQ2xhc3MiKSAKKwkgKiA8L3ByZT4KKwkgKiAKKwkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZQorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBxdWFsaWZpZWROYW1lIGNvbmZsaWN0cyB3aXRoIGFueSBleGlzdGluZyB0eXBlcy4KKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gaXMgbm90IGEgdmFsaWQgcXVhbGlmaWVkIG5hbWUKKwkgKi8KKwl2b2lkIHJlZ2lzdGVySW50ZXJmYWNlKFN0cmluZyBxdWFsaWZpZWROYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDsKKwkKKwkvKioKKwkgKiBSZWdpc3RlcnMgYW5kIGNyZWF0ZXMgYW4gZW1wdHkgSmF2YSBhbm5vdGF0aW9uIHR5cGUgd2l0aCBnaXZlbiBxdWFsaWZpZWQgbmFtZQorCSAqIAorCSAqIElmIHRoZSBuYW1lJ3MgbmFtZXNwYWNlIHBhcnQgcmVmZXJzIHRvIGFub3RoZXIgZGVyaXZlZCBKYXZhIHR5cGUsIHRoaXMgdHlwZSB3aWxsIGJlY29tZSBhIHN0YXRpYyBtZW1iZXIgb2YgdGhhdCB0eXBlLgorCSAqIAorCSAqIEZvciBpbnN0YW5jZSwgZ2l2ZW4gYW4gCisJICogPHByZT4KKwkgKiAgLy8gY3JlYXRlcyBhIHR5cGUgJ015Q2xhc3MnIGluIHRoZSBwYWNrYWdlICdteS5wYWNrJworCSAqICByZWdpc3RlckNsYXNzKCJteS5wYWNrLk15Q2xhc3MiKSAKKwkgKiAKKwkgKiAgLy8gY3JlYXRlcyBhIHR5cGUgJ015SW5uZXJDbGFzcycgYXMgYSBtZW1iZXIgb2YgdGhlIHR5cGUgJ215LnBhY2suTXlDbGFzcycKKwkgKiAgcmVnaXN0ZXJDbGFzcygibXkucGFjay5NeUNsYXNzLk15SW5uZXJDbGFzcyIpIAorCSAqIDwvcHJlPgorCSAqIAorCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHF1YWxpZmllZE5hbWUgY29uZmxpY3RzIHdpdGggYW55IGV4aXN0aW5nIHR5cGVzLgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBpcyBub3QgYSB2YWxpZCBxdWFsaWZpZWQgbmFtZQorCSAqLworCXZvaWQgcmVnaXN0ZXJBbm5vdGF0aW9uVHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA7CisJCisJLyoqCisJICogUmVnaXN0ZXJzIGFuZCBjcmVhdGVzIGFuIGVtcHR5IEphdmEgZW51bWVyYXRpb24gdHlwZSB3aXRoIGdpdmVuIHF1YWxpZmllZCBuYW1lCisJICogCisJICogSWYgdGhlIG5hbWUncyBuYW1lc3BhY2UgcGFydCByZWZlcnMgdG8gYW5vdGhlciBkZXJpdmVkIEphdmEgdHlwZSwgdGhpcyB0eXBlIHdpbGwgYmVjb21lIGEgc3RhdGljIG1lbWJlciBvZiB0aGF0IHR5cGUuCisJICogCisJICogRm9yIGluc3RhbmNlLCBnaXZlbiBhbiAKKwkgKiA8cHJlPgorCSAqICAvLyBjcmVhdGVzIGEgdHlwZSAnTXlDbGFzcycgaW4gdGhlIHBhY2thZ2UgJ215LnBhY2snCisJICogIHJlZ2lzdGVyQ2xhc3MoIm15LnBhY2suTXlDbGFzcyIpIAorCSAqIAorCSAqICAvLyBjcmVhdGVzIGEgdHlwZSAnTXlJbm5lckNsYXNzJyBhcyBhIG1lbWJlciBvZiB0aGUgdHlwZSAnbXkucGFjay5NeUNsYXNzJworCSAqICByZWdpc3RlckNsYXNzKCJteS5wYWNrLk15Q2xhc3MuTXlJbm5lckNsYXNzIikgCisJICogPC9wcmU+CisJICogCisJICogQHBhcmFtIHF1YWxpZmllZE5hbWUKKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcXVhbGlmaWVkTmFtZSBjb25mbGljdHMgd2l0aCBhbnkgZXhpc3RpbmcgdHlwZXMuCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IGlzIG5vdCBhIHZhbGlkIHF1YWxpZmllZCBuYW1lCisJICovCisJdm9pZCByZWdpc3RlckVudW1lcmF0aW9uVHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA7Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9SZWdpc3Rlckdsb2JhbHNQYXJ0aWNpcGFudC5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vUmVnaXN0ZXJHbG9iYWxzUGFydGljaXBhbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzhiODg4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vUmVnaXN0ZXJHbG9iYWxzUGFydGljaXBhbnQuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNybzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk5hbWVkRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRXh0ZW5zaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBDYWxsIGJhY2sgdG8gcGFydGljaXBhdGUgaW4gdGhlIHJlZ2lzdGVyLWdsb2JhbHMgcGhhc2UsIHdoZXJlIEphdmEgdHlwZXMgYXJlCisgKiBjb2xsZWN0ZWQuCisgKiAKKyAqIENsaWVudHMgc2hvdWxkIGltcGxlbWVudCB0aGlzIHRvIHJlZ2lzdGVyIGFuZCBjcmVhdGUgbmV3IEphdmEgdHlwZXMuCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogCisgKiBAcGFyYW0gPFQ+CisgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBhbm5vdGF0ZWQgZWxlbWVudHMKKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgUmVnaXN0ZXJHbG9iYWxzUGFydGljaXBhbnQ8VCBleHRlbmRzIE5hbWVkRWxlbWVudD4geworCisJLyoqCisJICogQ2FsbGVkIGJ5IHRoZSBjb21waWxlciBkdXJpbmcgcmVnaXN0ZXItZ2xvYmFscyBwaGFzZS4KKwkgKiAKKwkgKiBAcGFyYW0gYW5ub3RhdGVkU291cmNlRWxlbWVudHMKKwkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZWxlbWVudHMgZnJvbSB0aGUgY3VycmVudGx5IHByb2Nlc3NlZCBjb21waWxhdGlvbgorCSAqICAgICAgICAgICAgdW5pdCB3aGljaCBhcmUgYW5ub3RhdGVkIHdpdGggYWN0aXZlIGFubm90YXRpb24KKwkgKiBAcGFyYW0gY29udGV4dAorCSAqICAgICAgICAgICAgc2VydmljZXMgdG8gcmVnaXN0ZXIgbmV3IEphdmEgdHlwZXMKKwkgKiBAc2VlIFJlZ2lzdGVyR2xvYmFsc0NvbnRleHQKKwkgKi8KKwl2b2lkIGRvUmVnaXN0ZXJHbG9iYWxzKExpc3Q8PyBleHRlbmRzIFQ+IGFubm90YXRlZFNvdXJjZUVsZW1lbnRzLAorCQkJQEV4dGVuc2lvbiBSZWdpc3Rlckdsb2JhbHNDb250ZXh0IGNvbnRleHQpOworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vVHJhbnNmb3JtYXRpb25Db250ZXh0LmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9UcmFuc2Zvcm1hdGlvbkNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDkyZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vVHJhbnNmb3JtYXRpb25Db250ZXh0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm87CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZmlsZS5GaWxlTG9jYXRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5maWxlLkZpbGVTeXN0ZW1TdXBwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5zZXJ2aWNlcy5Bbm5vdGF0aW9uUmVmZXJlbmNlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLnNlcnZpY2VzLkFzc29jaWF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLnNlcnZpY2VzLlByb2JsZW1TdXBwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5zZXJ2aWNlcy5UcmFjYWJpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXMuVHlwZUxvb2t1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXMuVHlwZVJlZmVyZW5jZVByb3ZpZGVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBTZXJ2aWNlcyBwcm92aWRlZCBkdXJpbmcgdHJhbnNmb3JtYXRpb24gcGhhc2UKKyAqIAorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiAKKyAqIEBzZWUgVHJhbnNmb3JtYXRpb25QYXJ0aWNpcGFudAorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgZXh0ZW5kcyBUcmFjYWJpbGl0eSwgUHJvYmxlbVN1cHBvcnQsIFR5cGVSZWZlcmVuY2VQcm92aWRlciwgVHlwZUxvb2t1cCwgRmlsZVN5c3RlbVN1cHBvcnQsIEZpbGVMb2NhdGlvbnMsIEFubm90YXRpb25SZWZlcmVuY2VQcm92aWRlciwgQXNzb2NpYXRvciB7CisKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL1RyYW5zZm9ybWF0aW9uUGFydGljaXBhbnQuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL1RyYW5zZm9ybWF0aW9uUGFydGljaXBhbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDVjMWM0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vVHJhbnNmb3JtYXRpb25QYXJ0aWNpcGFudC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTXV0YWJsZU5hbWVkRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRXh0ZW5zaW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBBIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgdGhlIHRyYW5zZm9ybWF0aW9uIHBoYXNlLCBpbiB3aGljaCB0aGUgWHRlbmQgQVNUIGlzIHRyYW5zbGF0ZWQKKyAqIHRvIHRoZSBKYXZhIGVsZW1lbnRzLiBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHByaW1hcnkgdHJhbnNsYXRpb24gYnkgdGhlIFh0ZW5kIGNvbXBpbGVyIGlzIGRvbmUuCisgKiAKKyAqIEl0IGlzIHNhZmUgdG8gcmVzb2x2ZSBhbnkge0BsaW5rIFR5cGVSZWZlcmVuY2V9cyBkdXJpbmcgdGhpcyBwaGFzZSBhcyBsb25nIGFzIHRoZXkgYXJlIG5vdAorICogaW5mZXJyZWQgZnJvbSBhbiBleHByZXNzaW9uLiBJdCdzIG5vdCBhbGxvd2VkIHRvIHJlc29sdmUgYW55IGV4cHJlc3Npb25zIGR1cmluZyB0aGlzIHBoYXNlLgorICogCisgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIHdoaWNoIHRoaXMgcHJvY2Vzc29yIHByb2Nlc3Nlcy4KKyAqIAorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIFRyYW5zZm9ybWF0aW9uUGFydGljaXBhbnQ8VCBleHRlbmRzIE11dGFibGVOYW1lZEVsZW1lbnQ+IHsKKwkKKwkvKioKKwkgKiBJbnZva2VkIGJ5IHRoZSBjb21waWxlciAKKwkgKiAKKwkgKiBAcGFyYW0gYW5ub3RhdGVkVGFyZ2V0RWxlbWVudHMgdGhlIG11dGFibGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYW5ub3RhdGVkIGVsZW1lbnRzCisJICogQHBhcmFtIGNvbnRleHQgYSB7QGxpbmsgVHJhbnNmb3JtYXRpb25Db250ZXh0fSBwcm92aWRpbmcgdXNlZnVsIHNlcnZpY2VzLgorCSAqLworCXZvaWQgZG9UcmFuc2Zvcm0oTGlzdDw/IGV4dGVuZHMgVD4gYW5ub3RhdGVkVGFyZ2V0RWxlbWVudHMsIEBFeHRlbnNpb24gVHJhbnNmb3JtYXRpb25Db250ZXh0IGNvbnRleHQpOworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vVmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL1ZhbGlkYXRpb25Db250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjMTdjNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL1ZhbGlkYXRpb25Db250ZXh0LmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm87CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZmlsZS5GaWxlTG9jYXRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5maWxlLkZpbGVTeXN0ZW1TdXBwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5zZXJ2aWNlcy5Bbm5vdGF0aW9uUmVmZXJlbmNlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLnNlcnZpY2VzLlByb2JsZW1TdXBwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5zZXJ2aWNlcy5UcmFjYWJpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXMuVHlwZUxvb2t1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXMuVHlwZVJlZmVyZW5jZVByb3ZpZGVyOworCisvKioKKyAqIFNlcnZpY2VzIHByb3ZpZGVkIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwaGFzZQorICogIAorICogQHNlZSBWYWxpZGF0aW9uUGFydGljaXBhbnQKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uQ29udGV4dCBleHRlbmRzIFRyYWNhYmlsaXR5LCBQcm9ibGVtU3VwcG9ydCwgVHlwZVJlZmVyZW5jZVByb3ZpZGVyLCBUeXBlTG9va3VwLCBGaWxlU3lzdGVtU3VwcG9ydCwgRmlsZUxvY2F0aW9ucywgQW5ub3RhdGlvblJlZmVyZW5jZVByb3ZpZGVyIHsKKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vVmFsaWRhdGlvblBhcnRpY2lwYW50LmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9WYWxpZGF0aW9uUGFydGljaXBhbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTAwYTlkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vVmFsaWRhdGlvblBhcnRpY2lwYW50LmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm87CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5OYW1lZEVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkV4dGVuc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQSBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIHRoZSB2YWxpZGF0aW9uIHBoYXNlLiBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYWZ0ZXIgYWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgZG9uZS4KKyAqIEluZmVycmVkIHtAbGluayBUeXBlUmVmZXJlbmNlfXMgYXJlIHJlc29sdmVkIGF0IHRoYXQgdGltZSwgc28gaXQgaXMgc2FmZSB0byBpbnNwZWN0IHRoZW0uCisgKiAKKyAqIFRoZSBBU1QgaXMgcmVhZC1vbmx5IGluIHRoaXMgcGhhc2UuCisgKiAKKyAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgd2hpY2ggdGhpcyBwcm9jZXNzb3IgdmFsaWRhdGVzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uUGFydGljaXBhbnQ8VCBleHRlbmRzIE5hbWVkRWxlbWVudD4geworCQorCS8qKgorCSAqIEludm9rZWQgYnkgdGhlIHZhbGlkYXRvciAKKwkgKiAKKwkgKiBAcGFyYW0gYW5ub3RhdGVkVGFyZ2V0RWxlbWVudHMgdGhlIGphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFubm90YXRlZCBlbGVtZW50cworCSAqIEBwYXJhbSBjb250ZXh0IGEge0BsaW5rIFZhbGlkYXRpb25Db250ZXh0fSBwcm92aWRpbmcgdXNlZnVsIHNlcnZpY2VzLgorCSAqLworCXZvaWQgZG9WYWxpZGF0ZShMaXN0PD8gZXh0ZW5kcyBUPiBhbm5vdGF0ZWRUYXJnZXRFbGVtZW50cywgQEV4dGVuc2lvbiBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KTsKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL0Fubm90YXRpb25SZWZlcmVuY2UuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL0Fubm90YXRpb25SZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGEyZGIzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vQW5ub3RhdGlvblJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMzMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXMuVHJhY2FiaWxpdHk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gYW5ub3RhdGlvbi4KKyAqIAorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25SZWZlcmVuY2UgZXh0ZW5kcyBFbGVtZW50IHsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gdHlwZQorCSAqLworCUFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gZ2V0QW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKwkgKiBJZiBubyB2YWx1ZSB3YXMgc3BlY2lmaWVkIG9uIHRoZSByZWZlcmVuY2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ufQorCSAqIHdpbGwgYmUgcmV0dXJuZWQuIAorCSAqIAorCSAqIERlcGVuZGluZyBvZiB0aGUgcmVzcGVjdGl2ZSBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudCwgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHBvc3NpYmx5IHJldHVybmVkOgorCSAqIDx1bD4KKwkgKiAJPGxpPlNob3J0IG9yIHNob3J0W108L2xpPgorCSAqIAk8bGk+SW50ZWdlciBvciBpbnRbXTwvbGk+CisJICogCTxsaT5Mb25nIG9yIGxvbmdbXTwvbGk+CisJICogCTxsaT5GbG9hdCBvciBmbG9hdFtdPC9saT4KKwkgKiAJPGxpPkRvdWJsZSBvciBkb3VibGVbXTwvbGk+CisJICogCTxsaT5Cb29sZWFuIG9yIGJvb2xlYW5bXTwvbGk+CisJICogCTxsaT5UeXBlUmVmZXJlbmNlIG9yIFR5cGVSZWZlcmVuY2VbXSAtIGZvciBlbGVtZW50cyBvZiB0eXBlIENsYXNzJmx0Oz8mZ3Q7PC9saT4KKwkgKiAJPGxpPkFubm90YXRpb25SZWZlcmVuY2Ugb3IgQW5ub3RhdGlvblJlZmVyZW5jZVtdIC0gZm9yIGVsZW1lbnRzIG9mIGFuIGFubm90YXRpb24gdHlwZTwvbGk+CisJICogCTxsaT5FbnVtZXJhdGlvblZhbHVlRGVjbGFyYXRpb24gb3IgRW51bWVyYXRpb25WYWx1ZURlY2xhcmF0aW9uW10gLSBmb3IgZWxlbWVudHMgb2YgYW4gZW51bSB0eXBlPC9saT4KKwkgKiAgPGxpPiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyB2YWx1ZSBpcyBzZXQgYW5kIG5vIGRlZmF1bHQgdmFsdWUgb24gdGhlIG9yaWdpbmFsIGFubm90YXRpb24gdHlwZSBlbGVtZW50IGlzIGRlY2xhcmVkLjwvbGk+CisJICogPC91bD4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisJICogQHJldHVybiB0aGUgdmFsdWUgc2V0IG9uIHRoaXMgYW5ub3RhdGlvbiByZWZlcmVuY2UsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudCBvciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlPYmplY3QgZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5KTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgorCSAqIAorCSAqIElmIG5vIHZhbHVlIHdhcyBzcGVjaWZpZWQgb24gdGhlIHJlZmVyZW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb259CisJICogd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIHNldCBvbiB0aGlzIGFubm90YXRpb24gcmVmZXJlbmNlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudC4KKwkgKi8KKwlpbnQgZ2V0SW50VmFsdWUoU3RyaW5nIG5hbWUpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCisJICogCisJICogSWYgbm8gdmFsdWUgd2FzIHNwZWNpZmllZCBvbiB0aGUgcmVmZXJlbmNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayBBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbn0KKwkgKiB3aWxsIGJlIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgdmFsdWUgc2V0IG9uIHRoaXMgYW5ub3RhdGlvbiByZWZlcmVuY2Ugb3IgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFubm90YXRpb24gdHlwZSBlbGVtZW50LgorCSAqLworCWludFtdIGdldEludEFycmF5VmFsdWUoU3RyaW5nIG5hbWUpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCisJICogCisJICogSWYgbm8gdmFsdWUgd2FzIHNwZWNpZmllZCBvbiB0aGUgcmVmZXJlbmNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayBBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbn0KKwkgKiB3aWxsIGJlIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgdmFsdWUgc2V0IG9uIHRoaXMgYW5ub3RhdGlvbiByZWZlcmVuY2Ugb3IgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFubm90YXRpb24gdHlwZSBlbGVtZW50LgorCSAqLworCWxvbmcgZ2V0TG9uZ1ZhbHVlKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgorCSAqIAorCSAqIElmIG5vIHZhbHVlIHdhcyBzcGVjaWZpZWQgb24gdGhlIHJlZmVyZW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb259CisJICogd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIHNldCBvbiB0aGlzIGFubm90YXRpb24gcmVmZXJlbmNlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudC4KKwkgKi8KKwlsb25nW10gZ2V0TG9uZ0FycmF5VmFsdWUoU3RyaW5nIG5hbWUpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCisJICogCisJICogSWYgbm8gdmFsdWUgd2FzIHNwZWNpZmllZCBvbiB0aGUgcmVmZXJlbmNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayBBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbn0KKwkgKiB3aWxsIGJlIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgdmFsdWUgc2V0IG9uIHRoaXMgYW5ub3RhdGlvbiByZWZlcmVuY2Ugb3IgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFubm90YXRpb24gdHlwZSBlbGVtZW50LgorCSAqLworCXNob3J0IGdldFNob3J0VmFsdWUoU3RyaW5nIG5hbWUpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCisJICogCisJICogSWYgbm8gdmFsdWUgd2FzIHNwZWNpZmllZCBvbiB0aGUgcmVmZXJlbmNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayBBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbn0KKwkgKiB3aWxsIGJlIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgdmFsdWUgc2V0IG9uIHRoaXMgYW5ub3RhdGlvbiByZWZlcmVuY2Ugb3IgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFubm90YXRpb24gdHlwZSBlbGVtZW50LgorCSAqLworCXNob3J0W10gZ2V0U2hvcnRBcnJheVZhbHVlKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgorCSAqIAorCSAqIElmIG5vIHZhbHVlIHdhcyBzcGVjaWZpZWQgb24gdGhlIHJlZmVyZW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb259CisJICogd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIHNldCBvbiB0aGlzIGFubm90YXRpb24gcmVmZXJlbmNlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudC4KKwkgKi8KKwlmbG9hdCBnZXRGbG9hdFZhbHVlKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgorCSAqIAorCSAqIElmIG5vIHZhbHVlIHdhcyBzcGVjaWZpZWQgb24gdGhlIHJlZmVyZW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb259CisJICogd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIHNldCBvbiB0aGlzIGFubm90YXRpb24gcmVmZXJlbmNlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudC4KKwkgKi8KKwlmbG9hdFtdIGdldEZsb2F0QXJyYXlWYWx1ZShTdHJpbmcgbmFtZSk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKwkgKiAKKwkgKiBJZiBubyB2YWx1ZSB3YXMgc3BlY2lmaWVkIG9uIHRoZSByZWZlcmVuY2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ufQorCSAqIHdpbGwgYmUgcmV0dXJuZWQuCisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBzZXQgb24gdGhpcyBhbm5vdGF0aW9uIHJlZmVyZW5jZSBvciB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlIGVsZW1lbnQuCisJICovCisJZG91YmxlIGdldERvdWJsZVZhbHVlKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgorCSAqIAorCSAqIElmIG5vIHZhbHVlIHdhcyBzcGVjaWZpZWQgb24gdGhlIHJlZmVyZW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb259CisJICogd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIHNldCBvbiB0aGlzIGFubm90YXRpb24gcmVmZXJlbmNlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudC4KKwkgKi8KKwlkb3VibGVbXSBnZXREb3VibGVBcnJheVZhbHVlKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgorCSAqIAorCSAqIElmIG5vIHZhbHVlIHdhcyBzcGVjaWZpZWQgb24gdGhlIHJlZmVyZW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb259CisJICogd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIHNldCBvbiB0aGlzIGFubm90YXRpb24gcmVmZXJlbmNlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudC4KKwkgKi8KKwlieXRlIGdldEJ5dGVWYWx1ZShTdHJpbmcgbmFtZSk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKwkgKiAKKwkgKiBJZiBubyB2YWx1ZSB3YXMgc3BlY2lmaWVkIG9uIHRoZSByZWZlcmVuY2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ufQorCSAqIHdpbGwgYmUgcmV0dXJuZWQuCisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBzZXQgb24gdGhpcyBhbm5vdGF0aW9uIHJlZmVyZW5jZSBvciB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlIGVsZW1lbnQuCisJICovCisJYnl0ZVtdIGdldEJ5dGVBcnJheVZhbHVlKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgorCSAqIAorCSAqIElmIG5vIHZhbHVlIHdhcyBzcGVjaWZpZWQgb24gdGhlIHJlZmVyZW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb259CisJICogd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIHNldCBvbiB0aGlzIGFubm90YXRpb24gcmVmZXJlbmNlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudC4KKwkgKi8KKwlib29sZWFuIGdldEJvb2xlYW5WYWx1ZShTdHJpbmcgbmFtZSk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKwkgKiAKKwkgKiBJZiBubyB2YWx1ZSB3YXMgc3BlY2lmaWVkIG9uIHRoZSByZWZlcmVuY2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ufQorCSAqIHdpbGwgYmUgcmV0dXJuZWQuCisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBzZXQgb24gdGhpcyBhbm5vdGF0aW9uIHJlZmVyZW5jZSBvciB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlIGVsZW1lbnQuCisJICovCisJYm9vbGVhbltdIGdldEJvb2xlYW5BcnJheVZhbHVlKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgorCSAqIAorCSAqIElmIG5vIHZhbHVlIHdhcyBzcGVjaWZpZWQgb24gdGhlIHJlZmVyZW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb259CisJICogd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIHNldCBvbiB0aGlzIGFubm90YXRpb24gcmVmZXJlbmNlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudC4KKwkgKi8KKwljaGFyIGdldENoYXJWYWx1ZShTdHJpbmcgbmFtZSk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKwkgKiAKKwkgKiBJZiBubyB2YWx1ZSB3YXMgc3BlY2lmaWVkIG9uIHRoZSByZWZlcmVuY2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ufQorCSAqIHdpbGwgYmUgcmV0dXJuZWQuCisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBzZXQgb24gdGhpcyBhbm5vdGF0aW9uIHJlZmVyZW5jZSBvciB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlIGVsZW1lbnQuCisJICovCisJY2hhcltdIGdldENoYXJBcnJheVZhbHVlKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgorCSAqIAorCSAqIElmIG5vIHZhbHVlIHdhcyBzcGVjaWZpZWQgb24gdGhlIHJlZmVyZW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb259CisJICogd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIHNldCBvbiB0aGlzIGFubm90YXRpb24gcmVmZXJlbmNlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudC4KKwkgKi8KKwlTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoU3RyaW5nIG5hbWUpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCisJICogCisJICogSWYgbm8gdmFsdWUgd2FzIHNwZWNpZmllZCBvbiB0aGUgcmVmZXJlbmNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayBBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbn0KKwkgKiB3aWxsIGJlIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgdmFsdWUgc2V0IG9uIHRoaXMgYW5ub3RhdGlvbiByZWZlcmVuY2Ugb3IgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFubm90YXRpb24gdHlwZSBlbGVtZW50LgorCSAqLworCVN0cmluZ1tdIGdldFN0cmluZ0FycmF5VmFsdWUoU3RyaW5nIG5hbWUpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCisJICogCisJICogSWYgbm8gdmFsdWUgd2FzIHNwZWNpZmllZCBvbiB0aGUgcmVmZXJlbmNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayBBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbn0KKwkgKiB3aWxsIGJlIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgdmFsdWUgc2V0IG9uIHRoaXMgYW5ub3RhdGlvbiByZWZlcmVuY2Ugb3IgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFubm90YXRpb24gdHlwZSBlbGVtZW50LgorCSAqLworCVR5cGVSZWZlcmVuY2UgZ2V0Q2xhc3NWYWx1ZShTdHJpbmcgbmFtZSk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKwkgKiAKKwkgKiBJZiBubyB2YWx1ZSB3YXMgc3BlY2lmaWVkIG9uIHRoZSByZWZlcmVuY2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ufQorCSAqIHdpbGwgYmUgcmV0dXJuZWQuCisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBzZXQgb24gdGhpcyBhbm5vdGF0aW9uIHJlZmVyZW5jZSBvciB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlIGVsZW1lbnQuCisJICovCisJVHlwZVJlZmVyZW5jZVtdIGdldENsYXNzQXJyYXlWYWx1ZShTdHJpbmcgbmFtZSk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKwkgKiAKKwkgKiBJZiBubyB2YWx1ZSB3YXMgc3BlY2lmaWVkIG9uIHRoZSByZWZlcmVuY2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ufQorCSAqIHdpbGwgYmUgcmV0dXJuZWQuCisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBzZXQgb24gdGhpcyBhbm5vdGF0aW9uIHJlZmVyZW5jZSBvciB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlIGVsZW1lbnQuCisJICovCisJRW51bWVyYXRpb25WYWx1ZURlY2xhcmF0aW9uIGdldEVudW1WYWx1ZShTdHJpbmcgbmFtZSk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKwkgKiAKKwkgKiBJZiBubyB2YWx1ZSB3YXMgc3BlY2lmaWVkIG9uIHRoZSByZWZlcmVuY2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ufQorCSAqIHdpbGwgYmUgcmV0dXJuZWQuCisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBzZXQgb24gdGhpcyBhbm5vdGF0aW9uIHJlZmVyZW5jZSBvciB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlIGVsZW1lbnQuCisJICovCisJRW51bWVyYXRpb25WYWx1ZURlY2xhcmF0aW9uW10gZ2V0RW51bUFycmF5VmFsdWUoU3RyaW5nIG5hbWUpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCisJICogCisJICogSWYgbm8gdmFsdWUgd2FzIHNwZWNpZmllZCBvbiB0aGUgcmVmZXJlbmNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayBBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbn0KKwkgKiB3aWxsIGJlIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogQHJldHVybiB0aGUgdmFsdWUgc2V0IG9uIHRoaXMgYW5ub3RhdGlvbiByZWZlcmVuY2Ugb3IgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFubm90YXRpb24gdHlwZSBlbGVtZW50LgorCSAqLworCUFubm90YXRpb25SZWZlcmVuY2UgZ2V0QW5ub3RhdGlvblZhbHVlKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgorCSAqIAorCSAqIElmIG5vIHZhbHVlIHdhcyBzcGVjaWZpZWQgb24gdGhlIHJlZmVyZW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb259CisJICogd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIHNldCBvbiB0aGlzIGFubm90YXRpb24gcmVmZXJlbmNlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudC4KKwkgKi8KKwlBbm5vdGF0aW9uUmVmZXJlbmNlW10gZ2V0QW5ub3RhdGlvbkFycmF5VmFsdWUoU3RyaW5nIG5hbWUpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSBnaXZlbiBhbm5vdGF0aW9uIHByb3BlcnR5LgorCSAqIAorCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZXhwcmVzc2lvbiBpcyBzZXQsIG9yIHRoaXMgYW5ub3RhdGlvbiByZWZlcmVuY2UgaXMgYW4gZXh0ZXJuYWwgZWxlbWVudAorCSAqIChpLmUuIHtAbGluayBUcmFjYWJpbGl0eSNpc0V4dGVybmFsKEVsZW1lbnQpfSByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+KS4gCisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSBleHByZXNzaW9uCisJICovCisJRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKFN0cmluZyBuYW1lKTsKKworCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL0Fubm90YXRpb25UYXJnZXQuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL0Fubm90YXRpb25UYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTVjMThjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vQW5ub3RhdGlvblRhcmdldC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBBbiBlbGVtZW50IHRoYXQgY2FuIGJlIGFubm90YXRlZAorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvblRhcmdldCBleHRlbmRzIE5hbWVkRWxlbWVudCB7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9ucyB0aGlzIGVsZW1lbnQgaXMgYW5ub3RhdGVkIHdpdGgKKwkgKi8KKwlJdGVyYWJsZTw/IGV4dGVuZHMgQW5ub3RhdGlvblJlZmVyZW5jZT4gZ2V0QW5ub3RhdGlvbnMoKTsKKworCS8qKgorCSAqIEBwYXJhbSBhbm5vdGF0aW9uVHlwZQorCSAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gcmVmZXJlbmNlIGZvciB0aGUgZ2l2ZW4gdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiAgICAgICAgIGlmIHRoaXMgZWxlbWVudCBpcyBub3QgYW5ub3RhdGVkIHdpdGggdGhlIGdpdmVuIGFubm90YXRpb24gdHlwZQorCSAqLworCUFubm90YXRpb25SZWZlcmVuY2UgZmluZEFubm90YXRpb24oVHlwZSBhbm5vdGF0aW9uVHlwZSk7Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjNmMxMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL0Fubm90YXRpb25UeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBleHRlbmRzIFR5cGVEZWNsYXJhdGlvbiB7CisJCisJLyoqCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24gZWxlbWVudAorCSAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gdHlwZSBlbGVtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUsIGRlY2xhcmVkIGJ5IHRoaXMgYW5ub3RhdGlvbiB0eXBlIGRlY2xhcmF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggYW5ub3RhdGlvbiB0eXBlIGVsZW1lbnQgZXhpc3RzCisJICovCisJQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24gZmluZERlY2xhcmVkQW5ub3RhdGlvblR5cGVFbGVtZW50KFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudHMgZGVjbGFyZWQgYnkgdGhpcyBhbm5vdGF0aW9uIHR5cGUgZGVjbGFyYXRpb24KKwkgKi8KKwlJdGVyYWJsZTw/IGV4dGVuZHMgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24+IGdldERlY2xhcmVkQW5ub3RhdGlvblR5cGVFbGVtZW50cygpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL0Fubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9Bbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjdiOTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9Bbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmV4cHJlc3Npb24uRXhwcmVzc2lvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBhbm5vdGF0aW9uIHByb3BlcnR5LgorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24gZXh0ZW5kcyBNZW1iZXJEZWNsYXJhdGlvbiB7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBleHByZXNzaW9uIGRlc2NyaWJpbmcgdGhlIGRlZmF1bHQgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogICAgICAgICBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlIG9yIHRoaXMgYW5ub3RhdGlvbiBlbGVtZW50IGlzCisJICogICAgICAgICBkZWNsYXJlZCBpbiBhbiBleHRlcm5hbCBKYXZhIGNsYXNzLgorCSAqLworCUV4cHJlc3Npb24gZ2V0RGVmYXVsdFZhbHVlRXhwcmVzc2lvbigpOworCisJLyoqCisJICogQHJldHVybiB0aGUgdmFsdWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGlzIG5vIGRlZmF1bHQgdmFsdWUKKwkgKi8KKwlPYmplY3QgZ2V0RGVmYXVsdFZhbHVlKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgYW5ub3RhdGlvbiBlbGVtZW50CisJICovCisJVHlwZVJlZmVyZW5jZSBnZXRUeXBlKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vQ2xhc3NEZWNsYXJhdGlvbi5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vQ2xhc3NEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMzAwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9DbGFzc0RlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIENsYXNzRGVjbGFyYXRpb24gZXh0ZW5kcyBUeXBlRGVjbGFyYXRpb24sCisJCVR5cGVQYXJhbWV0ZXJEZWNsYXJhdG9yIHsKKworCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGNsYXNzIGlzIG1hcmtlZCA8Y29kZT5maW5hbDwvY29kZT4KKwkgKi8KKwlib29sZWFuIGlzRmluYWwoKTsKKworCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGNsYXNzIGlzIG1hcmtlZCA8Y29kZT5hYnN0cmFjdDwvY29kZT4KKwkgKi8KKwlib29sZWFuIGlzQWJzdHJhY3QoKTsKKworCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGNsYXNzIGlzIG1hcmtlZCA8Y29kZT5zdGF0aWM8L2NvZGU+CisJICovCisJYm9vbGVhbiBpc1N0YXRpYygpOworCisJLyoqCisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgY2xhc3MgaXMgbWFya2VkIDxjb2RlPnN0cmljdGZwPC9jb2RlPgorCSAqLworCWJvb2xlYW4gaXNTdHJpY3RGbG9hdGluZ1BvaW50KCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzdXBlciBjbGFzcyBvZiB0aGlzIGNsYXNzLiBJZiB0aGlzIGNsYXNzIGRlY2xhcmF0aW9uCisJICogICAgICAgICByZXByZXNlbnRzIHRoZSBzb3VyY2UgQVNUIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiAgICAgICAgIGlmIG5vIGV4cGxpY2l0IHN1cGVyIGNsYXNzIGlzIHNwZWNpZmllZC4KKwkgKi8KKwlUeXBlUmVmZXJlbmNlIGdldEV4dGVuZGVkQ2xhc3MoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGludGVyZmFjZXMgZGlyZWN0bHkgaW1wbGVtZW50ZWQgYnkgdGhlIGNsYXNzIGRlY2xhcmF0aW9uCisJICovCisJSXRlcmFibGU8PyBleHRlbmRzIFR5cGVSZWZlcmVuY2U+IGdldEltcGxlbWVudGVkSW50ZXJmYWNlcygpOworCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9Db21waWxhdGlvblN0cmF0ZWd5LmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9Db21waWxhdGlvblN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxZDlkYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL0NvbXBpbGF0aW9uU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBBIGNvbXBpbGF0aW9uIHN0cmF0ZWd5IGNhbiBiZSBhc3NpZ25lZCBpbnN0ZWFkIG9mIGFuIGV4cHJlc3Npb24gc2VlIHtNdXRhYmxlRXhlY3V0YWJsZURlY2xhcmF0aW9uLgorICogSXQncyB1c2VkIHRvIHRha2UgY29udHJvbCBvdmVyIGdlbmVyYXRpbmcgSmF2YSBzdGF0ZW1lbnRzIGFuZCBleHByZXNzaW9ucyBkaXJlY3RseS4KKyAqIAorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIENvbXBpbGF0aW9uU3RyYXRlZ3kgeworCQorCS8qKgorCSAqIGNhbGwgYmFjayBtZXRob2QgaW52b2tlZCBkdXJpbmcgY29tcGxpYXRpb24KKwkgKiAKKwkgKiBAcGFyYW0gY3R4IC0gYSBjb21waWxhdGlvbiBjb250ZXh0LCBwcm92aWRpbmcgdXNlZnVsIHNlcnZpY2VzLgorCSAqIEByZXR1cm4gdGhlIEphdmEgY29kZQorCSAqLworCUNoYXJTZXF1ZW5jZSBjb21waWxlKENvbXBpbGF0aW9uQ29udGV4dCBjdHgpOworCQorCS8qKgorCSAqIEEgc3RyYXRlZ3kgcHJvdmlkZWQgZHVyaW5nIGNvbXBpbGF0aW9uLgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgQ29tcGlsYXRpb25Db250ZXh0IHsKKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gdHlwZXJlZiB0aGUgdHlwZSByZWZlcmVuY2UgdG8gc2VyaWFsaXplCisJCSAqIEByZXR1cm4gdGhlIHNlcmlhbGl6ZWQgZm9ybSBvZiB0aGUgdHlwZSByZWZlcmVuY2UsIHRha2luZyBpbXBvcnRzIGludG8gYWNjb3VudC4KKwkJICovCisJCVN0cmluZyB0b0phdmFDb2RlKFR5cGVSZWZlcmVuY2UgdHlwZXJlZik7CisJCQorCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vQ29tcGlsYXRpb25Vbml0LmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9Db21waWxhdGlvblVuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTg1MTJiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZmlsZS5QYXRoOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiAKKyAqIFJlcHJlc2VudHMgYSBzaW5nbGUgWHRlbmQgZmlsZSBhbmQgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgQVNULgorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgQ29tcGlsYXRpb25Vbml0IGV4dGVuZHMgQW5ub3RhdGlvblRhcmdldCB7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhpcyBjb21waWxhdGlvbiB1bml0LiAKKwkgKi8KKwlTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIEphdmFEb2MgY29tbWVudAorCSAqLworCVN0cmluZyBnZXREb2NDb21tZW50KCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzb3VyY2UgdmlldyBvZiB0aGUgPGNvZGU+VHlwZURlY2xhcmF0aW9uPC9jb2RlPnMgZGlyZWN0bHkgY29udGFpbmVkIGluIHRoZSBjb21waWxhdGlvbiB1bml0LgorCSAqLworCUl0ZXJhYmxlPD8gZXh0ZW5kcyBUeXBlRGVjbGFyYXRpb24+IGdldFNvdXJjZVR5cGVEZWNsYXJhdGlvbnMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaWxlIGhhbmRsZSBmb3IgdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQuCisJICogCisJICogQHJldHVybiB0aGUgZmlsZSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0LgorCSAqIEBzZWUgUGF0aAorCSAqLworCVBhdGggZ2V0RmlsZVBhdGgoKTsKKwkKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL0NvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL0NvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2E3NWMyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBleHRlbmRzIEV4ZWN1dGFibGVEZWNsYXJhdGlvbiB7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vRGVjbGFyYXRpb24uamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL0RlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiYWJhZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL0RlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIERlY2xhcmF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvblRhcmdldCB7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9FbGVtZW50LmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9FbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhMDEzZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL0VsZW1lbnQuamF2YQpAQCAtMCwwICsxLDE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworLyoqCisgKiBUaGUgc3VwZXIgdHlwZSBvZiBhbGwgQVNUIGVsZW1lbnRzIHVzZWQgaW4gdGhpcyBwYWNrYWdlCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnQgeworCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9FbnVtZXJhdGlvblR5cGVEZWNsYXJhdGlvbi5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vRW51bWVyYXRpb25UeXBlRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGU5ZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vRW51bWVyYXRpb25UeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIEVudW1lcmF0aW9uVHlwZURlY2xhcmF0aW9uIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uIHsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHZhbHVlcyBkaXJlY3RseSBkZWNsYXJlZCBhbmQgY29udGFpbmVkIGluIHRoZSBlbnVtZXJhdGlvbiB0eXBlIGRlY2xhcmF0aW9uCisJICovCisJSXRlcmFibGU8PyBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWVEZWNsYXJhdGlvbj4gZ2V0RGVjbGFyZWRWYWx1ZXMoKTsKKwkKKwkvKioKKwkgKiBAcGFyYW0gbmFtZSBvZiB0aGUgZmVhdHVyZQorCSAqIEByZXR1cm4gdGhlIGRlY2xhcmVkIHZhbHVlIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gb2Ygbm8gc3VjaCB2YWx1ZSBleGlzdHMuCisJICovCisJRW51bWVyYXRpb25WYWx1ZURlY2xhcmF0aW9uIGZpbmREZWNsYXJlZFZhbHVlKFN0cmluZyBuYW1lKTsKKwkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9FbnVtZXJhdGlvblZhbHVlRGVjbGFyYXRpb24uamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL0VudW1lcmF0aW9uVmFsdWVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OWQ1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9FbnVtZXJhdGlvblZhbHVlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgRW51bWVyYXRpb25WYWx1ZURlY2xhcmF0aW9uIGV4dGVuZHMgTWVtYmVyRGVjbGFyYXRpb24geworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGVudW1lcmF0aW9uIHR5cGUgZGVjbGFyaW5nIHRoaXMgdmFsdWUKKwkgKi8KKwlwdWJsaWMgRW51bWVyYXRpb25UeXBlRGVjbGFyYXRpb24gZ2V0RGVjbGFyaW5nVHlwZSgpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vRXhlY3V0YWJsZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9FeGVjdXRhYmxlRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDc1NDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vRXhlY3V0YWJsZURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5leHByZXNzaW9uLkV4cHJlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIEEgY29tbW9uIHN1cGVyIHR5cGUgZm9yIHtAbGluayBNZXRob2REZWNsYXJhdGlvbn0gYW5kIHtAbGluayBDb25zdHJ1Y3RvckRlY2xhcmF0aW9ufQorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgRXhlY3V0YWJsZURlY2xhcmF0aW9uIGV4dGVuZHMgVHlwZVBhcmFtZXRlckRlY2xhcmF0b3IgeworCQorCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgdmFyQXJzIGRlY2xhcmF0aW9uLgorCSAqLworCWJvb2xlYW4gaXNWYXJBcmdzKCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgYm9keSwgbWlnaHQgYmUgbnVsbCBmb3IgZXh0ZXJuYWwgZWxlbWVudHMgYXMgd2VsbCBhcyBhYnN0cmFjdCBtZXRob2RzLgorCSAqLworCUV4cHJlc3Npb24gZ2V0Qm9keSgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGRlY2xhcmVkIHBhcmFtZXRlcnMKKwkgKi8KKwlJdGVyYWJsZTw/IGV4dGVuZHMgUGFyYW1ldGVyRGVjbGFyYXRpb24+IGdldFBhcmFtZXRlcnMoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZWNsYXJlZCBleGNlcHRpb25zCisJICovCisJSXRlcmFibGU8PyBleHRlbmRzIFR5cGVSZWZlcmVuY2U+IGdldEV4Y2VwdGlvbnMoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9GaWVsZERlY2xhcmF0aW9uLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9GaWVsZERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhZDJmMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL0ZpZWxkRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5leHByZXNzaW9uLkV4cHJlc3Npb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBGaWVsZERlY2xhcmF0aW9uIGV4dGVuZHMgTWVtYmVyRGVjbGFyYXRpb24geworCQorCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZpZWxkIGlzIGRlY2xhcmVkICdmaW5hbCcKKwkgKi8KKwlib29sZWFuIGlzRmluYWwoKTsKKworCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZpZWxkIGlzIGRlY2xhcmVkICdzdGF0aWMnCisJICovCisJYm9vbGVhbiBpc1N0YXRpYygpOworCQorCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZpZWxkIGlzIGRlY2xhcmVkICd0cmFuc2llbnQnCisJICovCisJYm9vbGVhbiBpc1RyYW5zaWVudCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZpZWxkIGlzIGRlY2xhcmVkICd2b2xhdGlsZScKKwkgKi8KKwlib29sZWFuIGlzVm9sYXRpbGUoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBpbml0aWFsaXplci4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaW5pdGlhbGl6ZXIgaXMgcHJlc2VudCBvciB0aGlzIGlzIGFuIGV4dGVybmFsIGVsZW1lbnQuCisJICovCisJRXhwcmVzc2lvbiBnZXRJbml0aWFsaXplcigpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBleHByZXNzaW9uLiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlzIGEgc291cmNlIGZpZWxkIGRlY2xhcmF0aW9uIGFuZCB0aGUgdHlwZSBpcyBpbmZlcnJlZCBmcm9tIHRoZSBpbml0aWFsaXplci4KKwkgKi8KKwlUeXBlUmVmZXJlbmNlIGdldFR5cGUoKTsKKwkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9JbnRlcmZhY2VEZWNsYXJhdGlvbi5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vSW50ZXJmYWNlRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDgzN2IxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vSW50ZXJmYWNlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgSW50ZXJmYWNlRGVjbGFyYXRpb24gZXh0ZW5kcyBUeXBlRGVjbGFyYXRpb24sIFR5cGVQYXJhbWV0ZXJEZWNsYXJhdG9yIHsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBjbGFzcyBpcyBtYXJrZWQgPGNvZGU+c3RyaWN0ZnA8L2NvZGU+CisJICovCisJYm9vbGVhbiBpc1N0cmljdEZsb2F0aW5nUG9pbnQoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBleHRlbmRlZCBpbnRlcmZhY2VzCisJICovCisJSXRlcmFibGU8PyBleHRlbmRzIFR5cGVSZWZlcmVuY2U+IGdldEV4dGVuZGVkSW50ZXJmYWNlcygpOworCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL01lbWJlckRlY2xhcmF0aW9uLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NZW1iZXJEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NmJjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NZW1iZXJEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIE1lbWJlckRlY2xhcmF0aW9uIGV4dGVuZHMgRGVjbGFyYXRpb24geworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIEphdmFEb2MgY29tbWVudAorCSAqLworCVN0cmluZyBnZXREb2NDb21tZW50KCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB2aXNpYmlsaXR5IG9mIHRoaXMgbWVtYmVyCisJICovCisJVmlzaWJpbGl0eSBnZXRWaXNpYmlsaXR5KCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgdHlwZSBkZWNsYXJpbmcgdGhpcyBtZW1iZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcyBhIHRvcCBsZXZlbCBlbGVtZW50CisJICovCisJVHlwZURlY2xhcmF0aW9uIGdldERlY2xhcmluZ1R5cGUoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtb2RpZmllcnMgb2YgdGhpcyBYdGVuZCBlbGVtZW50IG9yIGFuIGVtcHR5IHNldCBvZiB0aGlzIGlzIGEgSmF2YSBlbGVtZW50LgorCSAqIEUuZy4gPGNvZGU+cHVibGljIHZhbCBmb28gPSAiZm9vIjwvY29kZT4gaGFzIHRoZSBtb2RpZmllcnMge0BsaW5rIE1vZGlmaWVyI1ZBTH0gYW5kIHtAbGluayBNb2RpZmllciNQVUJMSUN9IAorCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlTZXQ8TW9kaWZpZXI+IGdldE1vZGlmaWVycygpOworCQorCS8qKgorCSAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgbWVtYmVyIGlzIG1hcmtlZCBhcyBkZXByZWNhdGVkLgorCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgbWVtYmVyIGlzIG1hcmtlZCBhcyBkZXByZWNhdGVkLgorCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlib29sZWFuIGlzRGVwcmVjYXRlZCgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL01ldGhvZERlY2xhcmF0aW9uLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NZXRob2REZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMGIyODMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NZXRob2REZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgTWV0aG9kRGVjbGFyYXRpb24gZXh0ZW5kcyBFeGVjdXRhYmxlRGVjbGFyYXRpb24geworCQorCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIG1ldGhvZCBpcyBkZWNsYXJlZCA8Y29kZT5maW5hbDwvY29kZT4KKwkgKi8KKwlib29sZWFuIGlzRmluYWwoKTsKKworCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIG1ldGhvZCBpcyBkZWNsYXJlZCA8Y29kZT5hYnN0cmFjdDwvY29kZT4KKwkgKi8KKwlib29sZWFuIGlzQWJzdHJhY3QoKTsKKworCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIG1ldGhvZCBpcyBkZWNsYXJlZCA8Y29kZT5zdGF0aWM8L2NvZGU+CisJICovCisJYm9vbGVhbiBpc1N0YXRpYygpOworCQorCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIG1ldGhvZCBpcyBkZWNsYXJlZCA8Y29kZT5zeW5jaHJvbml6ZWQ8L2NvZGU+CisJICovCisJYm9vbGVhbiBpc1N5bmNocm9uaXplZCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIG1ldGhvZCBpcyBkZWNsYXJlZCA8Y29kZT5kZWZhdWx0PC9jb2RlPgorCSAqLworCWJvb2xlYW4gaXNEZWZhdWx0KCk7CisJCisJLyoqCisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgbWV0aG9kIGlzIGRlY2xhcmVkIDxjb2RlPnN0cmljdGZwPC9jb2RlPgorCSAqLworCWJvb2xlYW4gaXNTdHJpY3RGbG9hdGluZ1BvaW50KCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBtZXRob2QgaXMgZGVjbGFyZWQgPGNvZGU+bmF0aXZlPC9jb2RlPgorCSAqLworCWJvb2xlYW4gaXNOYXRpdmUoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG1ldGhvZAorCSAqLworCVR5cGVSZWZlcmVuY2UgZ2V0UmV0dXJuVHlwZSgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG92ZXJyaWRkZW4gb3IgaW1wbGVtZW50ZWQgbWV0aG9kcworCSAqIEBzaW5jZSAyLjIzCisJICovCisJZGVmYXVsdCBJdGVyYWJsZTw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IGdldE92ZXJyaWRkZW5PckltcGxlbWVudGVkTWV0aG9kcygpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9Nb2RpZmllci5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTW9kaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjk3MjMxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDk3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworLyoqCisgKiBBIGxpc3Qgb2YgYWxsIG1vZGlmaWVycyB0aGF0IGFyZSBhbGxvd2VkIG9uIHtAbGluayBNZW1iZXJEZWNsYXJhdGlvbn1zIGluCisgKiBYdGVuZCBzb3VyY2UgY29kZQorICovCitwdWJsaWMgZW51bSBNb2RpZmllciB7CisJLyoqCisJICogVGhlIHB1YmxpYyB2aXNpYmlsaXR5IG1vZGlmaWVyLCBjYW4gYmUgcHJlc2VudCBvbgorCSAqIHtAbGluayBGaWVsZERlY2xhcmF0aW9uIGZpZWxkc30sIHtAbGluayBUeXBlRGVjbGFyYXRpb24gdHlwZXN9IGFuZAorCSAqIHtAbGluayBFeGVjdXRhYmxlRGVjbGFyYXRpb24gZXhlY3V0YWJsZXN9CisJICovCisJUFVCTElDLAorCS8qKgorCSAqIFRoZSBwcml2YXRlIHZpc2liaWxpdHkgbW9kaWZpZXIsIGNhbiBiZSBwcmVzZW50IG9uCisJICoge0BsaW5rIEZpZWxkRGVjbGFyYXRpb24gZmllbGRzfSwge0BsaW5rIFR5cGVEZWNsYXJhdGlvbiB0eXBlc30gYW5kCisJICoge0BsaW5rIEV4ZWN1dGFibGVEZWNsYXJhdGlvbiBleGVjdXRhYmxlc30KKwkgKi8KKwlQUklWQVRFLAorCS8qKgorCSAqIFRoZSBwcm90ZWN0ZWQgdmlzaWJpbGl0eSBtb2RpZmllciwgY2FuIGJlIHByZXNlbnQgb24KKwkgKiB7QGxpbmsgRmllbGREZWNsYXJhdGlvbiBmaWVsZHN9LCB7QGxpbmsgVHlwZURlY2xhcmF0aW9uIHR5cGVzfSBhbmQKKwkgKiB7QGxpbmsgRXhlY3V0YWJsZURlY2xhcmF0aW9uIGV4ZWN1dGFibGVzfQorCSAqLworCVBST1RFQ1RFRCwKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBwcml2YXRlIHZpc2liaWxpdHkgbW9kaWZpZXIsIGNhbiBiZSBwcmVzZW50IG9uCisJICoge0BsaW5rIEZpZWxkRGVjbGFyYXRpb24gZmllbGRzfSwge0BsaW5rIFR5cGVEZWNsYXJhdGlvbiB0eXBlc30gYW5kCisJICoge0BsaW5rIEV4ZWN1dGFibGVEZWNsYXJhdGlvbiBleGVjdXRhYmxlc30KKwkgKi8KKwlQQUNLQUdFLAorCS8qKgorCSAqIFRoZSBhYnN0cmFjdCBtb2RpZmllciwgY2FuIGJlIHByZXNlbnQgb24ge0BsaW5rIENsYXNzRGVjbGFyYXRpb24gY2xhc3Nlc30KKwkgKiBhbmQge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZHN9CisJICovCisJQUJTVFJBQ1QsCisJLyoqCisJICogVGhlIHN0YXRpYyBtb2RpZmllciwgY2FuIGJlIHByZXNlbnQgb24ge0BsaW5rIFR5cGVEZWNsYXJhdGlvbiB0eXBlc30sCisJICoge0BsaW5rIEZpZWxkRGVjbGFyYXRpb24gZmllbGRzfSBhbmQge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZHN9CisJICovCisJU1RBVElDLAorCS8qKgorCSAqIFRoZSBkaXNwYXRjaCBtb2RpZmllciwgY2FuIGJlIHByZXNlbnQgb24ge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9uCisJICogbWV0aG9kc30KKwkgKi8KKwlESVNQQVRDSCwKKwkvKioKKwkgKiBUaGUgZmluYWwgbW9kaWZpZXIsIGNhbiBiZSBwcmVzZW50IG9uIHtAbGluayBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzZXN9LAorCSAqIHtAbGluayBGaWVsZERlY2xhcmF0aW9uIGZpZWxkc30gYW5kIHtAbGluayBNZXRob2REZWNsYXJhdGlvbiBtZXRob2RzfQorCSAqLworCUZJTkFMLAorCS8qKgorCSAqIFRoZSBzdHJpY3QgZmxvYXRpbmcgcG9pbnQgbW9kaWZpZXIsIGNhbiBiZSBwcmVzZW50IG9uCisJICoge0BsaW5rIENsYXNzRGVjbGFyYXRpb24gY2xhc3Nlc30gYW5kIHtAbGluayBNZXRob2REZWNsYXJhdGlvbiBtZXRob2RzfQorCSAqLworCVNUUklDVEZQLAorCS8qKgorCSAqIFRoZSBuYXRpdmUgbW9kaWZpZXIsIGNhbiBiZSBwcmVzZW50IG9uIHtAbGluayBNZXRob2REZWNsYXJhdGlvbiBtZXRob2RzfQorCSAqLworCU5BVElWRSwKKwkvKioKKwkgKiBUaGUgdm9sYXRpbGUgbW9kaWZpZXIsIGNhbiBiZSBwcmVzZW50IG9uIHtAbGluayBGaWVsZERlY2xhcmF0aW9uIGZpZWxkc30KKwkgKi8KKwlWT0xBVElMRSwKKwkvKioKKwkgKiBUaGUgc3luY2hyb25pZWQgbW9kaWZpZXIsIGNhbiBiZSBwcmVzZW50IG9uIHtAbGluayBNZXRob2REZWNsYXJhdGlvbgorCSAqIG1ldGhvZHN9CisJICovCisJU1lOQ0hST05JWkVELAorCS8qKgorCSAqIFRoZSB0cmFuc2llbnQgbW9kaWZpZXIsIGNhbiBiZSBwcmVzZW50IG9uIHtAbGluayBGaWVsZERlY2xhcmF0aW9uIGZpZWxkc30KKwkgKi8KKwlUUkFOU0lFTlQsCisJLyoqCisJICogVGhlIHZhbCBtb2RpZmllciwgY2FuIGJlIHByZXNlbnQgb24ge0BsaW5rIEZpZWxkRGVjbGFyYXRpb24gZmllbGRzfQorCSAqLworCVZBTCwKKwkvKioKKwkgKiBUaGUgdmFyIG1vZGlmaWVyLCBjYW4gYmUgcHJlc2VudCBvbiB7QGxpbmsgRmllbGREZWNsYXJhdGlvbiBmaWVsZHN9CisJICovCisJVkFSLAorCS8qKgorCSAqIFRoZSBkZWYgbW9kaWZpZXIsIGNhbiBiZSBwcmVzZW50IG9uIHtAbGluayBNZXRob2REZWNsYXJhdGlvbiBtZXRob2RzfQorCSAqLworCURFRiwKKwkvKioKKwkgKiBUaGUgb3ZlcnJpZGUgbW9kaWZpZXIsIGNhbiBiZSBwcmVzZW50IG9uIHtAbGluayBNZXRob2REZWNsYXJhdGlvbgorCSAqIG1ldGhvZHN9CisJICovCisJT1ZFUlJJREUsCisJCisJLyoqCisJICogVGhlIGV4dGVuc2lvbiBtb2RpZmllciwgY2FuIGJlIHByZXNlbnQgb24ge0BsaW5rIEZpZWxkRGVjbGFyYXRpb24gZmllbGRzfQorCSAqIEBzaW5jZSAyLjgKKwkgKi8KKwlFWFRFTlNJT04sCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlQW5ub3RhdGlvblRhcmdldC5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZUFubm90YXRpb25UYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGU2NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZUFubm90YXRpb25UYXJnZXQuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIE11dGFibGVBbm5vdGF0aW9uVGFyZ2V0IGV4dGVuZHMgTXV0YWJsZU5hbWVkRWxlbWVudCwgQW5ub3RhdGlvblRhcmdldCB7CisKKwkvKioKKwkgKiBBbm5vdGF0ZSB0aGlzIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiByZWZlcmVuY2UuCisJICogCisJICogQHBhcmFtIGFubm90YXRpb25SZWZlcmVuY2UgdGhlIGFubm90YXRpb24gcmVmZXJlbmNlCisJICogQHJldHVybiBhIG5ldyBhbm5vdGF0aW9uIHJlZmVyZW5jZQorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhbm5vdGF0aW9uIHJlZmVyZW5jZSBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBzaW5jZSAyLjYKKwkgKi8KKwlBbm5vdGF0aW9uUmVmZXJlbmNlIGFkZEFubm90YXRpb24oQW5ub3RhdGlvblJlZmVyZW5jZSBhbm5vdGF0aW9uUmVmZXJlbmNlKTsKKwkKKwkvKioKKwkgKiBSZW1vdmUgdGhlIGdpdmVuIGFubm90YXRpb24gcmVmZXJlbmNlIGZyb20gdGhpcyBlbGVtZW50LgorCSAqIAorCSAqIEBwYXJhbSBhbm5vdGF0aW9uUmVmZXJlbmNlIHRoZSBhbm5vdGF0aW9uIHJlZmVyZW5jZQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGNvbnRhaW5lZCB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24KKwkgKiBAc2luY2UgMi42CisJICovCisJYm9vbGVhbiByZW1vdmVBbm5vdGF0aW9uKEFubm90YXRpb25SZWZlcmVuY2UgYW5ub3RhdGlvblJlZmVyZW5jZSk7CisKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL011dGFibGVBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMDdhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBNdXRhYmxlQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBleHRlbmRzIE11dGFibGVUeXBlRGVjbGFyYXRpb24sIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24geworCisJTXV0YWJsZUFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uIGZpbmREZWNsYXJlZEFubm90YXRpb25UeXBlRWxlbWVudChTdHJpbmcgbmFtZSk7CisJCisJSXRlcmFibGU8PyBleHRlbmRzIE11dGFibGVBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbj4gZ2V0RGVjbGFyZWRBbm5vdGF0aW9uVHlwZUVsZW1lbnRzKCk7CisJCisJLyoqCisJICogQWRkcyBhIG5ldyBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lLiAKKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlIGVsZW1lbnQgdG8gYmUgYWRkZWQsIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHBhcmFtIGluaXRpYWxpemVyIGEgY2FsbGJhY2sgZm9yIGZ1cnRoZXIgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNyZWF0ZWQgYW5ub3RhdGlvbiB0eXBlIGVsZW1lbnQsIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CisJICogCisJICogQHJldHVybiB0aGUgY3JlYXRlZCBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudCBkZWNsYXJhdGlvbgorCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgdHlwZSBkZWNsYXJhdGlvbiBpcyBub3QgY2FwYWJsZSBvZiBjb250YWluaW5nIGFuIGFubm90YXRpb24gdHlwZSBlbGVtZW50LgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBpcyBub3QgYSB2YWxpZCBqYXZhIGlkZW50aWZpZXIgb3IgdGhlIDxjb2RlPmluaXRpYWxpemVyPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBNdXRhYmxlQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24gYWRkQW5ub3RhdGlvblR5cGVFbGVtZW50KFN0cmluZyBuYW1lLAorCQkJUHJvY2VkdXJlcy5Qcm9jZWR1cmUxPE11dGFibGVBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbj4gaW5pdGlhbGl6ZXIpOworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZUFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzFiZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZUFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZXhwcmVzc2lvbi5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kMi5saWIuU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBhbm5vdGF0aW9uIHByb3BlcnR5LgorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgTXV0YWJsZUFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uIGV4dGVuZHMgTXV0YWJsZU1lbWJlckRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbiB7CisJCisJLyoqCisJICogU2V0dGluZyBhbiBleHByZXNzaW9uIHdpbGwgYWx0ZXIgdGhlIHNjb3BlIG9mIGl0IGFjY29yZGluZ2x5LgorCSAqIEVhY2ggZXhwcmVzc2lvbiBjYW4gb25seSBiZSBhc3NpZ25lZCB0byBvbmUgZWxlbWVudCwgaWYgdGhpcyB7QGxpbmsgTXV0YWJsZUV4ZWN1dGFibGVEZWNsYXJhdGlvbn0gaGFzIGFscmVhZHkgc2V0IAorCSAqIGFub3RoZXIgZXhwcmVzc2lvbiBvciBjb21waWxhdGlvbiBzdHJhdGVneSB0aGUgb2xkIG9uZSB3aWxsIGJlIGRldGFjaGVkLgorCSAqIAorCSAqIElmIHRoZSBnaXZlbiBleHByZXNzaW9uIGlzIGFscmVhZHkgYXNzaWduZWQgdG8gYW5vdGhlciB7QGxpbmsgTXV0YWJsZUV4ZWN1dGFibGVEZWNsYXJhdGlvbn0gb3Ige0BsaW5rIE11dGFibGVGaWVsZERlY2xhcmF0aW9ufQorCSAqIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBkZXRhY2hlZCBmcm9tIGl0LgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgZXhwcmVzc2lvbiB0byBzZXQgYXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBhbm5vdGF0aW9uIHByb3BlcnR5CisJICogCisJICogQHNpbmNlIDIuMTIKKwkgKi8KKwl2b2lkIHNldERlZmF1bHRWYWx1ZUV4cHJlc3Npb24oRXhwcmVzc2lvbiB2YWx1ZSk7CisJCisJLyoqCisJICogU2V0cyB0aGUgZ2l2ZW4ge0BsaW5rIENvbXBpbGF0aW9uU3RyYXRlZ3l9IGFzIHRoZSBkZWZhdWx0IHZhbHVlLgorCSAqIAorCSAqIDxiPlRoZSBnaXZlbiB7QGxpbmsgQ29tcGlsYXRpb25TdHJhdGVneX0gd2lsbCBiZSBleGVjdXRlZCBsYXRlciBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLCBub3QgaW1tZWRpYXRlbHkuPC9iPgorCSAqIAorCSAqIElmIHRoaXMge0BsaW5rIE11dGFibGVFeGVjdXRhYmxlRGVjbGFyYXRpb259IGhhcyBhbHJlYWR5IHNldCBhbm90aGVyIGV4cHJlc3Npb24gb3IgY29tcGlsYXRpb24gc3RyYXRlZ3kgdGhlIG9sZCBvbmUgd2lsbCBiZSBkZXRhY2hlZC4KKwkgKiAKKwkgKiBAcGFyYW0gY29tcGlsYXRpb25TdHJhdGVneSB0aGUgY29tcGlsYXRpb24gc3RyYXRlZ3ksIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+Y29tcGlsYXRpb25TdHJhdGVneTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiAKKwkgKiBAc2luY2UgMi4xMgorCSAqLworCXZvaWQgc2V0RGVmYXVsdFZhbHVlRXhwcmVzc2lvbihDb21waWxhdGlvblN0cmF0ZWd5IGNvbXBpbGF0aW9uU3RyYXRlZ3kpOworCQorCS8qKgorCSAqIFNldHMgdGhlIGdpdmVuIHtAbGluayBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50fSBhcyB0aGUgZGVmYXVsdCB2YWx1ZS4KKwkgKiAKKwkgKiA8Yj5UaGUgZ2l2ZW4ge0BsaW5rIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnR9IHdpbGwgYmUgZXhlY3V0ZWQgbGF0ZXIgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiwgbm90IGltbWVkaWF0ZWx5LjwvYj4KKwkgKiAKKwkgKiBJZiB0aGlzIHtAbGluayBNdXRhYmxlRXhlY3V0YWJsZURlY2xhcmF0aW9ufSBoYXMgYWxyZWFkeSBzZXQgYW5vdGhlciBleHByZXNzaW9uIG9yIGNvbXBpbGF0aW9uIHN0cmF0ZWd5IHRoZSBvbGQgb25lIHdpbGwgYmUgZGV0YWNoZWQuCisJICogCisJICogQHBhcmFtIGNvbXBpbGF0aW9uVGVtcGxhdGUgdGhlIGNvbXBpbGF0aW9uIHN0cmF0ZWd5LCBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmNvbXBpbGF0aW9uU3RyYXRlZ3k8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICogCisJICogQHNpbmNlIDIuMTIKKwkgKi8KKwl2b2lkIHNldERlZmF1bHRWYWx1ZUV4cHJlc3Npb24oU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBjb21waWxhdGlvblRlbXBsYXRlKTsKKwkKKwkvKioKKwkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGlzIGFubm90YXRpb24gcHJvcGVydHksIG11c3QgYmUgbm90IDxjb2RlPm51bGw8L2NvZGU+CisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIDxjb2RlPnR5cGU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICogCisJICogQHNpbmNlIDIuMTIKKwkgKi8KKwl2b2lkIHNldFR5cGUoVHlwZVJlZmVyZW5jZSB0eXBlKTsKKwkKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL011dGFibGVDbGFzc0RlY2xhcmF0aW9uLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZGQxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBNdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbiBleHRlbmRzIE11dGFibGVUeXBlUGFyYW1ldGVyRGVjbGFyYXRvciwgTXV0YWJsZVR5cGVEZWNsYXJhdGlvbiwgQ2xhc3NEZWNsYXJhdGlvbiB7CisJCisJLyoqCisJICogQHBhcmFtIGlzRmluYWwgCisJICovCisJdm9pZCBzZXRGaW5hbChib29sZWFuIGlzRmluYWwpOworCQorCS8qKgorCSAqIFNldHMgdGhlIDxjb2RlPmFic3RyYWN0PC9jb2RlPiBwcm9wZXJ0eQorCSAqIAorCSAqIEBwYXJhbSBpc0Fic3RyYWN0IAorCSAqLworCXZvaWQgc2V0QWJzdHJhY3QoYm9vbGVhbiBpc0Fic3RyYWN0KTsKKwkKKwkvKioKKwkgKiBAcGFyYW0gaXNTdGF0aWMKKwkgKi8KKwl2b2lkIHNldFN0YXRpYyhib29sZWFuIGlzU3RhdGljKTsKKwkKKwkvKioKKwkgKiBAcGFyYW0gaXNTdHJpY3RGbG9hdGluZ1BvaW50CisJICovCisJdm9pZCBzZXRTdHJpY3RGbG9hdGluZ1BvaW50KGJvb2xlYW4gaXNTdHJpY3RGbG9hdGluZ1BvaW50KTsKKwkKKwkvKioKKwkgKiBAcGFyYW0gc3VwZXJjbGFzcyB0aGUgdHlwZSByZWZlcmVuY2UgdG8gdGhlIHN1cGVyIHR5cGUuIDxjb2RlPm51bGw8L2NvZGU+IHJlc2V0cyB0aGUgZXh0ZW5kZWQgY2xhc3MgdG8gamF2YS5sYW5nLk9iamVjdCAodGhlIGRlZmF1bHQpLgorCSAqLworCXB1YmxpYyB2b2lkIHNldEV4dGVuZGVkQ2xhc3MoVHlwZVJlZmVyZW5jZSBzdXBlcmNsYXNzKTsKKwkKKwkvKioKKwkgKiBAcGFyYW0gc3VwZXJpbnRlcmZhY2VzIHRoZSBpbnRlcmZhY2VzIHRoaXMgY2xhc3MgaW1wbGVtZW50cworCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnN1cGVyaW50ZXJmYWNlczwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRlZEludGVyZmFjZXMoSXRlcmFibGU8PyBleHRlbmRzIFR5cGVSZWZlcmVuY2U+IHN1cGVyaW50ZXJmYWNlcyk7CisJCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmRlMDE5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogCisgKiBBIG11dGFibGUgY29uc3RydWN0b3IgZGVjbGFyYXRpb24KKyAqIAorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIE11dGFibGVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGV4dGVuZHMgTXV0YWJsZUV4ZWN1dGFibGVEZWNsYXJhdGlvbiwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB7CisJCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlRGVjbGFyYXRpb24uamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL011dGFibGVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzY2Q2ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiAKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgTXV0YWJsZURlY2xhcmF0aW9uIGV4dGVuZHMgTXV0YWJsZUFubm90YXRpb25UYXJnZXQsIERlY2xhcmF0aW9uIHsKKworCS8qKgorCSAqIEluZGljYXRlIHRoYXQgdGhpcyBkZWNsYXJhdGlvbiBpcyBiZWluZyByZWFkIGxvY2FsbHkgYnkgc29tZSBzeW50aGV0aWNhbGx5IGdlbmVyYXRlZCBtZW1iZXIuIEl0IGVmZmVjdGl2ZWx5IHN1cHByZXNzZXMKKwkgKiB1bnVzZWQgd2FybmluZ3MuCisJICogQHNpbmNlIDIuNgorCSAqLworCXZvaWQgbWFya0FzUmVhZCgpOworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZUVsZW1lbnQuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL011dGFibGVFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiYjI5YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL011dGFibGVFbGVtZW50LmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIAorICogQGF1dGhvciBBbnRvbiBLb3N5YWtvdgorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBNdXRhYmxlRWxlbWVudCBleHRlbmRzIEVsZW1lbnQgeworCisJLyoqCisJICogUmVtb3ZlcyB0aGlzIGVsZW1lbnQgZnJvbSBpdHMgY29udGFpbmVyIGFuZCByZW5kZXJzIGl0IGludmFsaWQuCisJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBvciBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIHJlbW92ZQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZSgpOworCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlRW51bWVyYXRpb25UeXBlRGVjbGFyYXRpb24uamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL011dGFibGVFbnVtZXJhdGlvblR5cGVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZDM3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlRW51bWVyYXRpb25UeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBNdXRhYmxlRW51bWVyYXRpb25UeXBlRGVjbGFyYXRpb24gZXh0ZW5kcyBNdXRhYmxlVHlwZURlY2xhcmF0aW9uLCBFbnVtZXJhdGlvblR5cGVEZWNsYXJhdGlvbiB7CisKKwlJdGVyYWJsZTw/IGV4dGVuZHMgTXV0YWJsZUVudW1lcmF0aW9uVmFsdWVEZWNsYXJhdGlvbj4gZ2V0RGVjbGFyZWRWYWx1ZXMoKTsKKwkKKwlNdXRhYmxlRW51bWVyYXRpb25WYWx1ZURlY2xhcmF0aW9uIGZpbmREZWNsYXJlZFZhbHVlKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBBZGRzIGEgbmV3IHZhbHVlIHdpdGggdGhlIGdpdmVuIG5hbWUuIAorCSAqIAorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBiZSBhZGRlZCwgbXVzdCBiZSBub3QgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcGFyYW0gaW5pdGlhbGl6ZXIgYSBjYWxsYmFjayBmb3IgZnVydGhlciBpbml0aWFsaXphdGlvbiBvZiB0aGUgY3JlYXRlZCB2YWx1ZSwgbXVzdCBiZSBub3QgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIHZhbHVlIGRlY2xhcmF0aW9uCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIDxjb2RlPm5hbWU8L2NvZGU+IGlzIG5vdCBhIHZhbGlkIGphdmEgaWRlbnRpZmllciBvciB0aGUgPGNvZGU+aW5pdGlhbGl6ZXI8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJTXV0YWJsZUVudW1lcmF0aW9uVmFsdWVEZWNsYXJhdGlvbiBhZGRWYWx1ZShTdHJpbmcgbmFtZSwgUHJvY2VkdXJlcy5Qcm9jZWR1cmUxPE11dGFibGVFbnVtZXJhdGlvblZhbHVlRGVjbGFyYXRpb24+IGluaXRpYWxpemVyKTsKKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZUVudW1lcmF0aW9uVmFsdWVEZWNsYXJhdGlvbi5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZUVudW1lcmF0aW9uVmFsdWVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDEwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlRW51bWVyYXRpb25WYWx1ZURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworLyoqCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBNdXRhYmxlRW51bWVyYXRpb25WYWx1ZURlY2xhcmF0aW9uIGV4dGVuZHMgTXV0YWJsZU1lbWJlckRlY2xhcmF0aW9uLCBFbnVtZXJhdGlvblZhbHVlRGVjbGFyYXRpb24geworCQorCS8qKgorCSAqIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjaGFuZ2UgdmlzaWJpbGl0eSBvZiBlbnVtZXJhdGlvbiB2YWx1ZS4KKwkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGFsd2F5cworCSAqLworCXB1YmxpYyB2b2lkIHNldFZpc2liaWxpdHkoVmlzaWJpbGl0eSB2aXNpYmlsaXR5KTsKKwkKKwlwdWJsaWMgTXV0YWJsZUVudW1lcmF0aW9uVHlwZURlY2xhcmF0aW9uIGdldERlY2xhcmluZ1R5cGUoKTsKKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZUV4ZWN1dGFibGVEZWNsYXJhdGlvbi5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZUV4ZWN1dGFibGVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMmZlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlRXhlY3V0YWJsZURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZXhwcmVzc2lvbi5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kMi5saWIuU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIE11dGFibGVFeGVjdXRhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBNdXRhYmxlVHlwZVBhcmFtZXRlckRlY2xhcmF0b3IsIEV4ZWN1dGFibGVEZWNsYXJhdGlvbiB7CisJCisJSXRlcmFibGU8PyBleHRlbmRzIE11dGFibGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gZ2V0UGFyYW1ldGVycygpOworCQorCS8qKgorCSAqIEBwYXJhbSBpc1ZhckFyZ3Mgd2hldGhlciB0aGUgbGFzdCBhcmd1bWVudCBpcyBhIHZhciBhcmcuCisJICovCisJdm9pZCBzZXRWYXJBcmdzKGJvb2xlYW4gaXNWYXJBcmdzKTsKKwkKKwkvKioKKwkgKiBTZXR0aW5nIGFuIGV4cHJlc3Npb24gd2lsbCBhbHRlciB0aGUgc2NvcGUgb2YgaXQgYWNjb3JkaW5nbHkuCisJICogRWFjaCBleHByZXNzaW9uIGNhbiBvbmx5IGJlIGFzc2lnbmVkIHRvIG9uZSBlbGVtZW50LCBpZiB0aGlzIHtAbGluayBNdXRhYmxlRXhlY3V0YWJsZURlY2xhcmF0aW9ufSBoYXMgYWxyZWFkeSBzZXQgCisJICogYW5vdGhlciBleHByZXNzaW9uIG9yIGNvbXBpbGF0aW9uIHN0cmF0ZWd5IHRoZSBvbGQgb25lIHdpbGwgYmUgZGV0YWNoZWQuCisJICogCisJICogSWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gaXMgYWxyZWFkeSBhc3NpZ25lZCB0byBhbm90aGVyIHtAbGluayBNdXRhYmxlRXhlY3V0YWJsZURlY2xhcmF0aW9ufSBvciB7QGxpbmsgTXV0YWJsZUZpZWxkRGVjbGFyYXRpb259CisJICogaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRldGFjaGVkIGZyb20gaXQuCisJICogCisJICogQHBhcmFtIGJvZHkgdGhlIGV4cHJlc3Npb24gdG8gc2V0IGFzIHRoZSBib2R5IG9mIHRoaXMgZXhlY3V0YWJsZQorCSAqLworCXZvaWQgc2V0Qm9keShFeHByZXNzaW9uIGJvZHkpOworCQorCS8qKgorCSAqIFNldHMgdGhlIGdpdmVuIHtAbGluayBDb21waWxhdGlvblN0cmF0ZWd5fSBhcyB0aGUgYm9keS4KKwkgKiAKKwkgKiA8Yj5UaGUgZ2l2ZW4ge0BsaW5rIENvbXBpbGF0aW9uU3RyYXRlZ3l9IHdpbGwgYmUgZXhlY3V0ZWQgbGF0ZXIgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiwgbm90IGltbWVkaWF0ZWx5LjwvYj4KKwkgKiAKKwkgKiBJZiB0aGlzIHtAbGluayBNdXRhYmxlRXhlY3V0YWJsZURlY2xhcmF0aW9ufSBoYXMgYWxyZWFkeSBzZXQgYW5vdGhlciBleHByZXNzaW9uIG9yIGNvbXBpbGF0aW9uIHN0cmF0ZWd5IHRoZSBvbGQgb25lIHdpbGwgYmUgZGV0YWNoZWQuCisJICogCisJICogQHBhcmFtIGNvbXBpbGF0aW9uU3RyYXRlZ3kgdGhlIGNvbXBpbGF0aW9uIHN0cmF0ZWd5LCBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmNvbXBpbGF0aW9uU3RyYXRlZ3k8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJdm9pZCBzZXRCb2R5KENvbXBpbGF0aW9uU3RyYXRlZ3kgY29tcGlsYXRpb25TdHJhdGVneSk7CisJCisJLyoqCisJICogU2V0cyB0aGUgZ2l2ZW4ge0BsaW5rIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnR9IGFzIHRoZSBib2R5LgorCSAqIAorCSAqIDxiPlRoZSBnaXZlbiB7QGxpbmsgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudH0gd2lsbCBiZSBleGVjdXRlZCBsYXRlciBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLCBub3QgaW1tZWRpYXRlbHkuPC9iPgorCSAqIAorCSAqIElmIHRoaXMge0BsaW5rIE11dGFibGVFeGVjdXRhYmxlRGVjbGFyYXRpb259IGhhcyBhbHJlYWR5IHNldCBhbm90aGVyIGV4cHJlc3Npb24gb3IgY29tcGlsYXRpb24gc3RyYXRlZ3kgdGhlIG9sZCBvbmUgd2lsbCBiZSBkZXRhY2hlZC4KKwkgKiAKKwkgKiBAcGFyYW0gY29tcGlsYXRpb25UZW1wbGF0ZSB0aGUgY29tcGlsYXRpb24gc3RyYXRlZ3ksIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+Y29tcGlsYXRpb25TdHJhdGVneTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwl2b2lkIHNldEJvZHkoU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBjb21waWxhdGlvblRlbXBsYXRlKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBkZWNsYXJlZCBleGNlcHRpb25zLgorCSAqIAorCSAqIEBwYXJhbSBleGNlcHRpb25zIHRoZSBkZWNsYXJlZCBleGNlcHRpb25zCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIDxjb2RlPmV4Y2VwdGlvbnM8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGNvbnRhaW5zIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJdm9pZCBzZXRFeGNlcHRpb25zKFR5cGVSZWZlcmVuY2UuLi4gZXhjZXB0aW9ucyk7CisJCisJLyoqCisJICogQWRkcyBhIHBhcmFtZXRlcgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIsIG11c3QgYmUgYSB2YWxpZCBqYXZhIGlkZW50aWZpZXIKKwkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyLCBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgcGFyYW1ldGVyCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgbm90IGEgdmFsaWQgamF2YSBpZGVudGlmaWVyIG9yIHRoZSB0eXBlIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJTXV0YWJsZVBhcmFtZXRlckRlY2xhcmF0aW9uIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgVHlwZVJlZmVyZW5jZSB0eXBlKTsKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL011dGFibGVGaWVsZERlY2xhcmF0aW9uLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlRmllbGREZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NTE1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlRmllbGREZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5leHByZXNzaW9uLkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQyLmxpYi5TdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIAorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBleHRlbmRzIE11dGFibGVNZW1iZXJEZWNsYXJhdGlvbiwgRmllbGREZWNsYXJhdGlvbiB7CisJCisJLyoqCisJICogc2V0cyB0aGUgJ2ZpbmFsJyBwcm9wZXJ0eQorCSAqIAorCSAqIEBwYXJhbSBpc0ZpbmFsCisJICovCisJdm9pZCBzZXRGaW5hbChib29sZWFuIGlzRmluYWwpOworCisJLyoqCisJICogc2V0cyB0aGUgJ3N0YXRpYycgcHJvcGVydHkKKwkgKiAKKwkgKiBAcGFyYW0gaXNTdGF0aWMKKwkgKi8KKwl2b2lkIHNldFN0YXRpYyhib29sZWFuIGlzU3RhdGljKTsKKwkKKwkvKioKKwkgKiBzZXRzIHRoZSAndHJhbnNpZW50JyBwcm9wZXJ0eQorCSAqIAorCSAqIEBwYXJhbSBpc1RyYW5zaWVudAorCSAqLworCXZvaWQgc2V0VHJhbnNpZW50KGJvb2xlYW4gaXNUcmFuc2llbnQpOworCQorCS8qKgorCSAqIHNldHMgdGhlICd2b2xhdGlsZScgcHJvcGVydHkKKwkgKiAKKwkgKiBAcGFyYW0gaXNWb2xhdGlsZQorCSAqLworCXZvaWQgc2V0Vm9sYXRpbGUoYm9vbGVhbiBpc1ZvbGF0aWxlKTsKKwkKKwkvKioKKwkgKiBzZXRzIHRoZSAnaW5pdGlhbGl6ZXInIGV4cHJlc3Npb24gb2YgdGhpcyBmaWVsZCBkZWNsYXJhdGlvbi4KKwkgKiBBdXRvbWF0aWNhbGx5IGRldGFjaGVzIGFueSBwcmV2aW91c2x5IGFzc2lnbmVkIGluaXRpYWxpemVycyBmcm9tIHRoaXMgZmllbGQgZGVjbGFyYXRpb24uCisJICogCisJICogIElmIHRoZSBnaXZlbiBleHByZXNzaW9uIGlzIGFzc2lnbmVkIHRvIGFub3RoZXIge0BsaW5rIE11dGFibGVFeGVjdXRhYmxlRGVjbGFyYXRpb259IG9yIHtAbGluayBNdXRhYmxlRmllbGREZWNsYXJhdGlvbn0sIGl0CisJICogIHdpbGwgYmUgZGV0YWNoZWQgZnJvbSB0aGVyZSBhcyB3ZWxsLgorCSAqIAorCSAqIEBwYXJhbSBpbml0aWFsaXplcgorCSAqLworCXZvaWQgc2V0SW5pdGlhbGl6ZXIoRXhwcmVzc2lvbiBpbml0aWFsaXplcik7CisJCisJLyoqCisJICogc2V0cyB0aGUgJ2luaXRpYWxpemVyJyBleHByZXNzaW9uIG9mIHRoaXMgZmllbGQgZGVjbGFyYXRpb24uCisJICogQXV0b21hdGljYWxseSBkZXRhY2hlcyBhbnkgcHJldmlvdXNseSBhc3NpZ25lZCBpbml0aWFsaXplcnMgZnJvbSB0aGlzIGZpZWxkIGRlY2xhcmF0aW9uLgorCSAqIAorCSAqIDxiPlRoZSBnaXZlbiB7QGxpbmsgQ29tcGlsYXRpb25TdHJhdGVneX0gd2lsbCBiZSBleGVjdXRlZCBsYXRlciBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLCBub3QgaW1tZWRpYXRlbHkuPC9iPgorCSAqIAorCSAqIEBwYXJhbSBpbml0aWFsaXplciB0aGUgY29tcGlsYXRpb24gc3RyYXRlZ3ksIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIDxjb2RlPmluaXRpYWxpemVyPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXZvaWQgc2V0SW5pdGlhbGl6ZXIoQ29tcGlsYXRpb25TdHJhdGVneSBpbml0aWFsaXplcik7CisKKwkvKioKKwkgKiBzZXRzIHRoZSAnaW5pdGlhbGl6ZXInIGV4cHJlc3Npb24gb2YgdGhpcyBmaWVsZCBkZWNsYXJhdGlvbi4KKwkgKiBBdXRvbWF0aWNhbGx5IGRldGFjaGVzIGFueSBwcmV2aW91c2x5IGFzc2lnbmVkIGluaXRpYWxpemVycyBmcm9tIHRoaXMgZmllbGQgZGVjbGFyYXRpb24uCisJICogCisJICogPGI+VGhlIGdpdmVuIHtAbGluayBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50fSB3aWxsIGJlIGV4ZWN1dGVkIGxhdGVyIGR1cmluZyBjb2RlIGdlbmVyYXRpb24sIG5vdCBpbW1lZGlhdGVseS48L2I+CisJICogCisJICogQHBhcmFtIHRlbXBsYXRlIHRoZSBjb21waWxhdGlvbiB0ZW1wbGF0ZSwgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+aW5pdGlhbGl6ZXI8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJdm9pZCBzZXRJbml0aWFsaXplcihTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IHRlbXBsYXRlKTsKKwkKKwkvKioKKwkgKiBzZXRzIHRoZSAnY29uc3RhbnQnIHZhbHVlIG9mIHRoaXMgZmllbGQuCisJICogQXV0b21hdGljYWxseSBkZXRhY2hlcyBhbnkgcHJldmlvdXNseSBhc3NpZ25lZCBpbml0aWFsaXplcnMgZnJvbSB0aGlzIGZpZWxkIGRlY2xhcmF0aW9uLgorCSAqIEFsc28gbWFya3MgdGhpcyBmaWVsZCBhcyAnc3RhdGljJyBhbmQgJ2ZpbmFsJworCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgY29uc3RhbnQgdmFsdWUKKwkgKiAKKwkgKiBAc2luY2UgMi44CisJICovCisJdm9pZCBzZXRDb25zdGFudFZhbHVlQXNMb25nKGxvbmcgdmFsdWUpOworCisJLyoqCisJICogc2V0cyB0aGUgJ2NvbnN0YW50JyB2YWx1ZSBvZiB0aGlzIGZpZWxkLgorCSAqIEF1dG9tYXRpY2FsbHkgZGV0YWNoZXMgYW55IHByZXZpb3VzbHkgYXNzaWduZWQgaW5pdGlhbGl6ZXJzIGZyb20gdGhpcyBmaWVsZCBkZWNsYXJhdGlvbi4KKwkgKiBBbHNvIG1hcmtzIHRoaXMgZmllbGQgYXMgJ3N0YXRpYycgYW5kICdmaW5hbCcKKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIGNvbnN0YW50IHZhbHVlCisJICogCisJICogQHNpbmNlIDIuOAorCSAqLworCXZvaWQgc2V0Q29uc3RhbnRWYWx1ZUFzSW50KGludCB2YWx1ZSk7CisKKwkvKioKKwkgKiBzZXRzIHRoZSAnY29uc3RhbnQnIHZhbHVlIG9mIHRoaXMgZmllbGQuCisJICogQXV0b21hdGljYWxseSBkZXRhY2hlcyBhbnkgcHJldmlvdXNseSBhc3NpZ25lZCBpbml0aWFsaXplcnMgZnJvbSB0aGlzIGZpZWxkIGRlY2xhcmF0aW9uLgorCSAqIEFsc28gbWFya3MgdGhpcyBmaWVsZCBhcyAnc3RhdGljJyBhbmQgJ2ZpbmFsJworCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgY29uc3RhbnQgdmFsdWUKKwkgKiAKKwkgKiBAc2luY2UgMi44CisJICovCisJdm9pZCBzZXRDb25zdGFudFZhbHVlQXNTaG9ydChzaG9ydCB2YWx1ZSk7CisKKwkvKioKKwkgKiBzZXRzIHRoZSAnY29uc3RhbnQnIHZhbHVlIG9mIHRoaXMgZmllbGQuCisJICogQXV0b21hdGljYWxseSBkZXRhY2hlcyBhbnkgcHJldmlvdXNseSBhc3NpZ25lZCBpbml0aWFsaXplcnMgZnJvbSB0aGlzIGZpZWxkIGRlY2xhcmF0aW9uLgorCSAqIEFsc28gbWFya3MgdGhpcyBmaWVsZCBhcyAnc3RhdGljJyBhbmQgJ2ZpbmFsJworCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgY29uc3RhbnQgdmFsdWUKKwkgKiAKKwkgKiBAc2luY2UgMi44CisJICovCisJdm9pZCBzZXRDb25zdGFudFZhbHVlQXNCeXRlKGJ5dGUgdmFsdWUpOworCisJLyoqCisJICogc2V0cyB0aGUgJ2NvbnN0YW50JyB2YWx1ZSBvZiB0aGlzIGZpZWxkLgorCSAqIEF1dG9tYXRpY2FsbHkgZGV0YWNoZXMgYW55IHByZXZpb3VzbHkgYXNzaWduZWQgaW5pdGlhbGl6ZXJzIGZyb20gdGhpcyBmaWVsZCBkZWNsYXJhdGlvbi4KKwkgKiBBbHNvIG1hcmtzIHRoaXMgZmllbGQgYXMgJ3N0YXRpYycgYW5kICdmaW5hbCcKKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIGNvbnN0YW50IHZhbHVlCisJICogCisJICogQHNpbmNlIDIuOAorCSAqLworCXZvaWQgc2V0Q29uc3RhbnRWYWx1ZUFzRG91YmxlKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBzZXRzIHRoZSAnY29uc3RhbnQnIHZhbHVlIG9mIHRoaXMgZmllbGQuCisJICogQXV0b21hdGljYWxseSBkZXRhY2hlcyBhbnkgcHJldmlvdXNseSBhc3NpZ25lZCBpbml0aWFsaXplcnMgZnJvbSB0aGlzIGZpZWxkIGRlY2xhcmF0aW9uLgorCSAqIEFsc28gbWFya3MgdGhpcyBmaWVsZCBhcyAnc3RhdGljJyBhbmQgJ2ZpbmFsJworCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgY29uc3RhbnQgdmFsdWUKKwkgKiAKKwkgKiBAc2luY2UgMi44CisJICovCisJdm9pZCBzZXRDb25zdGFudFZhbHVlQXNGbG9hdChmbG9hdCB2YWx1ZSk7CisKKwkvKioKKwkgKiBzZXRzIHRoZSAnY29uc3RhbnQnIHZhbHVlIG9mIHRoaXMgZmllbGQuCisJICogQXV0b21hdGljYWxseSBkZXRhY2hlcyBhbnkgcHJldmlvdXNseSBhc3NpZ25lZCBpbml0aWFsaXplcnMgZnJvbSB0aGlzIGZpZWxkIGRlY2xhcmF0aW9uLgorCSAqIEFsc28gbWFya3MgdGhpcyBmaWVsZCBhcyAnc3RhdGljJyBhbmQgJ2ZpbmFsJworCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgY29uc3RhbnQgdmFsdWUKKwkgKiAKKwkgKiBAc2luY2UgMi44CisJICovCisJdm9pZCBzZXRDb25zdGFudFZhbHVlQXNDaGFyKGNoYXIgdmFsdWUpOworCisJLyoqCisJICogc2V0cyB0aGUgJ2NvbnN0YW50JyB2YWx1ZSBvZiB0aGlzIGZpZWxkLgorCSAqIEF1dG9tYXRpY2FsbHkgZGV0YWNoZXMgYW55IHByZXZpb3VzbHkgYXNzaWduZWQgaW5pdGlhbGl6ZXJzIGZyb20gdGhpcyBmaWVsZCBkZWNsYXJhdGlvbi4KKwkgKiBBbHNvIG1hcmtzIHRoaXMgZmllbGQgYXMgJ3N0YXRpYycgYW5kICdmaW5hbCcKKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIGNvbnN0YW50IHZhbHVlCisJICogCisJICogQHNpbmNlIDIuOAorCSAqLworCXZvaWQgc2V0Q29uc3RhbnRWYWx1ZUFzQm9vbGVhbihib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIHNldHMgdGhlICdjb25zdGFudCcgdmFsdWUgb2YgdGhpcyBmaWVsZC4KKwkgKiBBdXRvbWF0aWNhbGx5IGRldGFjaGVzIGFueSBwcmV2aW91c2x5IGFzc2lnbmVkIGluaXRpYWxpemVycyBmcm9tIHRoaXMgZmllbGQgZGVjbGFyYXRpb24uCisJICogQWxzbyBtYXJrcyB0aGlzIGZpZWxkIGFzICdzdGF0aWMnIGFuZCAnZmluYWwnCisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBjb25zdGFudCB2YWx1ZSwgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICogCisJICogQHNpbmNlIDIuOAorCSAqLworCXZvaWQgc2V0Q29uc3RhbnRWYWx1ZUFzU3RyaW5nKFN0cmluZyB2YWx1ZSk7CisJCisJLyoqCisJICogSW5kaWNhdGUgdGhhdCB0aGlzIGZpZWxkIGlzIHByb3Blcmx5IGluaXRpYWxpemVkIGJ5IHRoZSBnaXZlbiBjb25zdHJ1Y3Rvci4KKwkgKiBAcGFyYW0gY29uc3RydWN0b3JEZWNsYXJhdGlvbiBhIGNvbnN0cnVjdG9yIHRoYXQgaW5pdGlhbGl6ZXMgdGhpcyBmaWVsZAorCSAqIAorCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwl2b2lkIG1hcmtBc0luaXRpYWxpemVkQnkoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uKTsKKwkKKwkvKioKKwkgKiBzZXRzIHRoZSAndHlwZScgb2YgdGhpcyBmaWVsZCBkZWNsYXJhdGlvbgorCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlLCBtdXN0IGJlIG5vdCA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSA8Y29kZT50eXBlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPmwKKwkgKi8KKwl2b2lkIHNldFR5cGUoVHlwZVJlZmVyZW5jZSB0eXBlKTsKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL011dGFibGVJbnRlcmZhY2VEZWNsYXJhdGlvbi5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZUludGVyZmFjZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E4OTY4MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL011dGFibGVJbnRlcmZhY2VEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCisvKioKKyAqIAorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTXV0YWJsZUludGVyZmFjZURlY2xhcmF0aW9uIGV4dGVuZHMgTXV0YWJsZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdG9yLCBNdXRhYmxlVHlwZURlY2xhcmF0aW9uLCBJbnRlcmZhY2VEZWNsYXJhdGlvbiB7CisKKwkvKioKKwkgKiBAcGFyYW0gaXNTdHJpY3RGbG9hdGluZ1BvaW50CisJICovCisJdm9pZCBzZXRTdHJpY3RGbG9hdGluZ1BvaW50KGJvb2xlYW4gaXNTdHJpY3RGbG9hdGluZ1BvaW50KTsKKworCS8qKgorCSAqIEBwYXJhbSBzdXBlcmludGVyZmFjZXMgdGhlIGludGVyZmFjZXMgdGhpcyBjbGFzcyBpbXBsZW1lbnRzLCBtdXN0IGJlIG5vdCA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnN1cGVyaW50ZXJmYWNlczwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFeHRlbmRlZEludGVyZmFjZXMoSXRlcmFibGU8PyBleHRlbmRzIFR5cGVSZWZlcmVuY2U+IHN1cGVyaW50ZXJmYWNlcyk7Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlTWVtYmVyRGVjbGFyYXRpb24uamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL011dGFibGVNZW1iZXJEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzM4NTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlTWVtYmVyRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgTXV0YWJsZU1lbWJlckRlY2xhcmF0aW9uIGV4dGVuZHMgTXV0YWJsZURlY2xhcmF0aW9uLCBNZW1iZXJEZWNsYXJhdGlvbiB7CisJCisJLyoqCisJICogU2V0cyB0aGUgSmF2YURvYyBjb21tZW50IGZvciB0aGlzIG1lbWJlcgorCSAqIEBwYXJhbSBkb2NDb21tZW50CisJICovCisJcHVibGljIHZvaWQgc2V0RG9jQ29tbWVudChTdHJpbmcgZG9jQ29tbWVudCk7CisJCisJLyoqCisJICogU2V0cyB0aGUge0BsaW5rIFZpc2liaWxpdHl9IG9mIHRoaXMgbWVtYmVyLgorCSAqIAorCSAqIEBwYXJhbSB2aXNpYmlsaXR5CisJICovCisJcHVibGljIHZvaWQgc2V0VmlzaWJpbGl0eShWaXNpYmlsaXR5IHZpc2liaWxpdHkpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHR5cGUgZGVjbGFyaW5nIHRoaXMgbWVtYmVyCisJICovCisJcHVibGljIE11dGFibGVUeXBlRGVjbGFyYXRpb24gZ2V0RGVjbGFyaW5nVHlwZSgpOworCQorCS8qKgorCSAqIFNldCB0aGUgZGVwcmVjYXRlZCBmbGFnIG9mIHRoaXMgbWVtYmVyLiBJdCB3aWxsIGFkZCBvciByZW1vdmUgdGhlIHtAbGluayBEZXByZWNhdGVkfSBhbm5vdGF0aW9uCisJICogaWYgYXBwcm9wcmlhdGUuCisJICogQHBhcmFtIGRlcHJlY2F0ZWQge0Bjb2RlIHRydWV9IGlmIHRoaXMgbWVtYmVyIHNob3VsZCBiZSBtYXJrZWQgYXMgZGVwcmVjYXRlZC4KKwkgKiBAc2luY2UgMi43CisJICovCisJdm9pZCBzZXREZXByZWNhdGVkKGJvb2xlYW4gZGVwcmVjYXRlZCk7Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlTWV0aG9kRGVjbGFyYXRpb24uamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL011dGFibGVNZXRob2REZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkY2MzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlTWV0aG9kRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIE11dGFibGVNZXRob2REZWNsYXJhdGlvbiBleHRlbmRzIE11dGFibGVFeGVjdXRhYmxlRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uIHsKKwkKKwkvKioKKwkgKiBAcGFyYW0gdHlwZSB0aGUgcmV0dXJuIHR5cGUgb2YgdGhpcyBtZXRob2QsIG11c3QgYmUgbm90IDxjb2RlPm51bGw8L2NvZGU+CisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIDxjb2RlPnR5cGU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJdm9pZCBzZXRSZXR1cm5UeXBlKFR5cGVSZWZlcmVuY2UgdHlwZSk7CisJCisJLyoqCisJICogQHBhcmFtIGlzU3RhdGljIHdoZXRoZXIgdGhpcyBtZXRob2QgZGVjbGFyYXRpb24gaXMgPGNvZGU+c3RhdGljPC9jb2RlPgorCSAqLworCXZvaWQgc2V0U3RhdGljKGJvb2xlYW4gaXNTdGF0aWMpOworCQorCS8qKgorCSAqIEBwYXJhbSBpc0ZpbmFsIHdoZXRoZXIgdGhpcyBtZXRob2QgZGVjbGFyYXRpb24gaXMgPGNvZGU+ZmluYWw8L2NvZGU+CisJICovCisJdm9pZCBzZXRGaW5hbChib29sZWFuIGlzRmluYWwpOworCQorCS8qKgorCSAqIEBwYXJhbSBpc1N0cmljdEZsb2F0aW5nUG9pbnQgd2hldGhlciB0aGlzIG1ldGhvZCBkZWNsYXJhdGlvbiBpcyA8Y29kZT5zdHJpY3RmcDwvY29kZT4KKwkgKi8KKwl2b2lkIHNldFN0cmljdEZsb2F0aW5nUG9pbnQoYm9vbGVhbiBpc1N0cmljdEZsb2F0aW5nUG9pbnQpOworCisJLyoqCisJICogQHBhcmFtIGlzTmF0aXZlIHdoZXRoZXIgdGhpcyBtZXRob2QgZGVjbGFyYXRpb24gaXMgPGNvZGU+bmF0aXZlPC9jb2RlPgorCSAqLworCXZvaWQgc2V0TmF0aXZlKGJvb2xlYW4gaXNOYXRpdmUpOworCisJLyoqCisJICogQHBhcmFtIGlzQWJzdHJhY3Qgd2hldGhlciB0aGlzIG1ldGhvZCBkZWNsYXJhdGlvbiBpcyA8Y29kZT5hYnN0cmFjdDwvY29kZT4KKwkgKi8KKwl2b2lkIHNldEFic3RyYWN0KGJvb2xlYW4gaXNBYnN0cmFjdCk7CisJCisJLyoqCisJICogQHBhcmFtIGlzU3luY2hyb25pemVkIHdoZXRoZXIgdGhpcyBtZXRob2QgZGVjbGFyYXRpb24gaXMgPGNvZGU+c3luY2hyb25pemVkPC9jb2RlPgorCSAqLworCXZvaWQgc2V0U3luY2hyb25pemVkKGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQpOworCisJLyoqCisJICogQHBhcmFtIGlzRGVmYXVsdCB3aGV0aGVyIHRoaXMgbWV0aG9kIGRlY2xhcmF0aW9uIGlzIDxjb2RlPmRlZmF1bHQ8L2NvZGU+CisJICovCisJdm9pZCBzZXREZWZhdWx0KGJvb2xlYW4gaXNEZWZhdWx0KTsKKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZU5hbWVkRWxlbWVudC5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZU5hbWVkRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDY3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlTmFtZWRFbGVtZW50LmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBNdXRhYmxlTmFtZWRFbGVtZW50IGV4dGVuZHMgTmFtZWRFbGVtZW50LCBNdXRhYmxlRWxlbWVudCB7CisJCisJLyoqCisJICogQHBhcmFtIHNpbXBsZU5hbWUgdGhlIHNpbXBsZSBuYW1lIG9mIHRoaXMgZWxlbWVudCwgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+c2ltcGxlTmFtZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwl2b2lkIHNldFNpbXBsZU5hbWUoU3RyaW5nIHNpbXBsZU5hbWUpOworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZVBhcmFtZXRlckRlY2xhcmF0aW9uLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlUGFyYW1ldGVyRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWViYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vTXV0YWJsZVBhcmFtZXRlckRlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBNdXRhYmxlUGFyYW1ldGVyRGVjbGFyYXRpb24gZXh0ZW5kcyBNdXRhYmxlRGVjbGFyYXRpb24sIFBhcmFtZXRlckRlY2xhcmF0aW9uIHsKKwlwdWJsaWMgTXV0YWJsZUV4ZWN1dGFibGVEZWNsYXJhdGlvbiBnZXREZWNsYXJpbmdFeGVjdXRhYmxlKCk7Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlVHlwZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlVHlwZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1MTQxMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL011dGFibGVUeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQSBtdXRhYmxlIHR5cGUgZGVjbGFyYXRpb24uCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBNdXRhYmxlVHlwZURlY2xhcmF0aW9uIGV4dGVuZHMgTXV0YWJsZU1lbWJlckRlY2xhcmF0aW9uLCBUeXBlRGVjbGFyYXRpb24geworCQorCUl0ZXJhYmxlPD8gZXh0ZW5kcyBNdXRhYmxlTWVtYmVyRGVjbGFyYXRpb24+IGdldERlY2xhcmVkTWVtYmVycygpOworCQorCUl0ZXJhYmxlPD8gZXh0ZW5kcyBNdXRhYmxlTWV0aG9kRGVjbGFyYXRpb24+IGdldERlY2xhcmVkTWV0aG9kcygpOworCQorCUl0ZXJhYmxlPD8gZXh0ZW5kcyBNdXRhYmxlRmllbGREZWNsYXJhdGlvbj4gZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKwkKKwlJdGVyYWJsZTw/IGV4dGVuZHMgTXV0YWJsZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24+IGdldERlY2xhcmVkQ29uc3RydWN0b3JzKCk7CisJCisJSXRlcmFibGU8PyBleHRlbmRzIE11dGFibGVDbGFzc0RlY2xhcmF0aW9uPiBnZXREZWNsYXJlZENsYXNzZXMoKTsKKwkKKwlJdGVyYWJsZTw/IGV4dGVuZHMgTXV0YWJsZUludGVyZmFjZURlY2xhcmF0aW9uPiBnZXREZWNsYXJlZEludGVyZmFjZXMoKTsKKwkKKwkvKioKKwkgKiBAc2luY2UgMi44CisJICovCisJSXRlcmFibGU8PyBleHRlbmRzIE11dGFibGVFbnVtZXJhdGlvblR5cGVEZWNsYXJhdGlvbj4gZ2V0RGVjbGFyZWRFbnVtZXJhdGlvblR5cGVzKCk7CisJCisJLyoqCisJICogQHNpbmNlIDIuOAorCSAqLworCUl0ZXJhYmxlPD8gZXh0ZW5kcyBNdXRhYmxlQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbj4gZ2V0RGVjbGFyZWRBbm5vdGF0aW9uVHlwZXMoKTsKKwkKKwkvKioKKwkgKiBAc2luY2UgMi44CisJICovCisJSXRlcmFibGU8PyBleHRlbmRzIE11dGFibGVUeXBlRGVjbGFyYXRpb24+IGdldERlY2xhcmVkVHlwZXMoKTsKKwkKKwlNdXRhYmxlRmllbGREZWNsYXJhdGlvbiBmaW5kRGVjbGFyZWRGaWVsZChTdHJpbmcgbmFtZSk7CisJCisJLyoqCisJICogQHNpbmNlIDIuOAorCSAqLworCU11dGFibGVUeXBlRGVjbGFyYXRpb24gZmluZERlY2xhcmVkVHlwZShTdHJpbmcgbmFtZSk7CisKKwlNdXRhYmxlTWV0aG9kRGVjbGFyYXRpb24gZmluZERlY2xhcmVkTWV0aG9kKFN0cmluZyBuYW1lLCBUeXBlUmVmZXJlbmNlLi4uIHBhcmFtZXRlclR5cGVzKTsKKworCU11dGFibGVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGZpbmREZWNsYXJlZENvbnN0cnVjdG9yKFR5cGVSZWZlcmVuY2UuLi4gcGFyYW1ldGVyVHlwZXMpOworCQorCS8qKgorCSAqIEFkZHMgYSBuZXcgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gCisJICogCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGJlIGFkZGVkLCBtdXN0IGJlIG5vdCA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBwYXJhbSBpbml0aWFsaXplciBhIGNhbGxiYWNrIGZvciBmdXJ0aGVyIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjcmVhdGVkIGZpZWxkLCBtdXN0IGJlIG5vdCA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZmllbGQgZGVjbGFyYXRpb24KKwkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSB1bmRlcmx5aW5nIHR5cGUgZGVjbGFyYXRpb24gaXMgbm90IGNhcGFibGUgb2YgY29udGFpbmluZyBtZXRob2RzLgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBpcyBub3QgYSB2YWxpZCBqYXZhIGlkZW50aWZpZXIgb3IgdGhlIDxjb2RlPmluaXRpYWxpemVyPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCU11dGFibGVGaWVsZERlY2xhcmF0aW9uIGFkZEZpZWxkKFN0cmluZyBuYW1lLCBQcm9jZWR1cmVzLlByb2NlZHVyZTE8TXV0YWJsZUZpZWxkRGVjbGFyYXRpb24+IGluaXRpYWxpemVyKTsKKworCS8qKgorCSAqIEFkZHMgYSBuZXcgbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUgdG8gdGhpcyB0eXBlIGRlY2xhcmF0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKKwkgKiBAcGFyYW0gaW5pdGlhbGl6ZXIgYSBjYWxsIGJhY2sgZm9yIGZ1cnRoZXIgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG1ldGhvZAorCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgbWV0aG9kIGRlY2xhcmF0aW9uCisJICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgdW5kZXJseWluZyB0eXBlIGRlY2xhcmF0aW9uIGlzIG5vdCBjYXBhYmxlIG9mIGNvbnRhaW5pbmcgbWV0aG9kcy4KKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+bmFtZTwvY29kZT4gaXMgbm90IGEgdmFsaWQgamF2YSBpZGVudGlmaWVyIG9yIHRoZSA8Y29kZT5pbml0aWFsaXplcjwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlNdXRhYmxlTWV0aG9kRGVjbGFyYXRpb24gYWRkTWV0aG9kKFN0cmluZyBuYW1lLCBQcm9jZWR1cmVzLlByb2NlZHVyZTE8TXV0YWJsZU1ldGhvZERlY2xhcmF0aW9uPiBpbml0aWFsaXplcik7CisJCisJLyoqCisJICogQWRkcyBhIG5ldyBjb25zdHJ1Y3RvciB0byB0aGlzIHR5cGUgZGVjbGFyYXRpb24uCisJICogCisJICogQHBhcmFtIGluaXRpYWxpemVyIGEgY2FsbCBiYWNrIGZvciBmdXJ0aGVyIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjb25zdHJ1Y3RvcgorCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgY29uc3RydWN0b3IgZGVjbGFyYXRpb24KKwkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSB1bmRlcmx5aW5nIHR5cGUgZGVjbGFyYXRpb24gaXMgbm90IGNhcGFibGUgb2YgY29udGFpbmluZyBjb25zdHJ1Y3RvcnMuCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIDxjb2RlPmluaXRpYWxpemVyPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCU11dGFibGVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGFkZENvbnN0cnVjdG9yKFByb2NlZHVyZXMuUHJvY2VkdXJlMTxNdXRhYmxlQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gaW5pdGlhbGl6ZXIpOworCQorCS8qKgorCSAqIEl0IGlzIG5vdCBwb3NzaWJsZSB0byByZW5hbWUgYSB0eXBlLiAKKwkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGFsd2F5cworCSAqLworCXB1YmxpYyB2b2lkIHNldFNpbXBsZU5hbWUoU3RyaW5nIHNpbXBsZU5hbWUpOworCQorCS8qKgorCSAqIEl0IGlzIG5vdCBwb3NzaWJsZSB0byByZW1vdmUgYSB0eXBlLgorCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gYWx3YXlzCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlKCk7CisJCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwYTIxMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL011dGFibGVUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIE11dGFibGVUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gZXh0ZW5kcyBNdXRhYmxlRGVjbGFyYXRpb24sIFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB7CisJcHVibGljIE11dGFibGVUeXBlUGFyYW1ldGVyRGVjbGFyYXRvciBnZXRUeXBlUGFyYW1ldGVyRGVjbGFyYXRvcigpOworCisJLyoqCisJICogQHBhcmFtIHVwcGVyQm91bmRzIC0gdGhlIHVwcGVyIGJvdW5kcywgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT51cHBlckJvdW5kczwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRVcHBlckJvdW5kcyhJdGVyYWJsZTw/IGV4dGVuZHMgVHlwZVJlZmVyZW5jZT4gdXBwZXJCb3VuZHMpOworCQorCS8qKgorCSAqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBhbHdheXMgCisJICovCisJcHVibGljIEFubm90YXRpb25SZWZlcmVuY2UgYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uUmVmZXJlbmNlIGFubm90YXRpb25SZWZlcmVuY2UpOworCQorCS8qKgorCSAqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBhbHdheXMgCisJICovCisJcHVibGljIGJvb2xlYW4gcmVtb3ZlQW5ub3RhdGlvbihBbm5vdGF0aW9uUmVmZXJlbmNlIGFubm90YXRpb25SZWZlcmVuY2UpOworCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlVHlwZVBhcmFtZXRlckRlY2xhcmF0b3IuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL011dGFibGVUeXBlUGFyYW1ldGVyRGVjbGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyODllY2UKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9NdXRhYmxlVHlwZVBhcmFtZXRlckRlY2xhcmF0b3IuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIE11dGFibGVUeXBlUGFyYW1ldGVyRGVjbGFyYXRvciBleHRlbmRzIE11dGFibGVNZW1iZXJEZWNsYXJhdGlvbiwgVHlwZVBhcmFtZXRlckRlY2xhcmF0b3IgeworCQorCUl0ZXJhYmxlPD8gZXh0ZW5kcyBNdXRhYmxlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBnZXRUeXBlUGFyYW1ldGVycygpOworCisJLyoqCisJICogQ3JlYXRlcyBhbmQgYWRkcyBhIG5ldyB7QGxpbmsgTXV0YWJsZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbn0gdG8gdGhpcworCSAqIGRlY2xhcmF0b3IuCisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0eXBlIHBhcmFtZXRlcgorCSAqIEBwYXJhbSB1cHBlckJvdW5kcworCSAqICAgICAgICAgICAgdGhlIHVwcGVyYm91bmRzCisJICogQHJldHVybiB0aGUgY3JlYXRlZCBhbmQgYXR0YWNoZWQge0BsaW5rIE11dGFibGVUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb259CisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICAgICA8b2w+PGxpPmlmIHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBpcyBub3QgYSB2YWxpZCBqYXZhIGlkZW50aWZpZXI8L2xpPgorCSAqICAgICAgICAgICAgICAgIDxsaT5pZiB0aGUgPGNvZGU+dXBwZXJCb3VuZHM8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGNvbnRhaW5zIDxjb2RlPm51bGw8L2NvZGU+PC9saT48L29sPgorCSAqLworCU11dGFibGVUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gYWRkVHlwZVBhcmFtZXRlcihTdHJpbmcgbmFtZSwgVHlwZVJlZmVyZW5jZS4uLiB1cHBlckJvdW5kcyk7Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9OYW1lZEVsZW1lbnQuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL05hbWVkRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMDRmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9OYW1lZEVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIE5hbWVkRWxlbWVudCBleHRlbmRzIEVsZW1lbnQgeworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50CisJICovCisJU3RyaW5nIGdldFNpbXBsZU5hbWUoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIGNvbXBpbGF0aW9uIHVuaXQgdGhpcyBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQgY29tcGlsYXRpb24gdW5pdC4KKwkgKi8KKwlDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vUGFyYW1ldGVyRGVjbGFyYXRpb24uamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1BhcmFtZXRlckRlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwM2ZjYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1BhcmFtZXRlckRlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBQYXJhbWV0ZXJEZWNsYXJhdGlvbiBleHRlbmRzIERlY2xhcmF0aW9uIHsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIKKwkgKi8KKwlUeXBlUmVmZXJlbmNlIGdldFR5cGUoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRXhlY3V0YWJsZURlY2xhcmF0aW9ufSB0aGlzIHBhcmFtZXRlciBpcyBjb250YWluZWQgaW4KKwkgKi8KKwlFeGVjdXRhYmxlRGVjbGFyYXRpb24gZ2V0RGVjbGFyaW5nRXhlY3V0YWJsZSgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1ByaW1pdGl2ZVR5cGUuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1ByaW1pdGl2ZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDkyNGY4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vUHJpbWl0aXZlVHlwZS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgUHJpbWl0aXZlVHlwZSBleHRlbmRzIFR5cGUgeworCS8qKgorCSAqIFJldHVybnMgdGhlIGtpbmQgb2YgcHJpbWl0aXZlIHR5cGUgdGhhdCB0aGlzIG9iamVjdCByZXByZXNlbnRzLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGtpbmQgb2YgcHJpbWl0aXZlIHR5cGUgdGhhdCB0aGlzIG9iamVjdCByZXByZXNlbnRzCisJICovCisJS2luZCBnZXRLaW5kKCk7CisKKwkvKioKKwkgKiBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgZGlmZmVyZW50IGtpbmRzIG9mIHByaW1pdGl2ZSB0eXBlcy4KKwkgKi8KKwllbnVtIEtpbmQgeworCQkvKiogVGhlIHByaW1pdGl2ZSB0eXBlIDx0dD5ib29sZWFuPC90dD4gKi8KKwkJQk9PTEVBTiwKKwkJLyoqIFRoZSBwcmltaXRpdmUgdHlwZSA8dHQ+Ynl0ZTwvdHQ+ICovCisJCUJZVEUsCisJCS8qKiBUaGUgcHJpbWl0aXZlIHR5cGUgPHR0PnNob3J0PC90dD4gKi8KKwkJU0hPUlQsCisJCS8qKiBUaGUgcHJpbWl0aXZlIHR5cGUgPHR0PmludDwvdHQ+ICovCisJCUlOVCwKKwkJLyoqIFRoZSBwcmltaXRpdmUgdHlwZSA8dHQ+bG9uZzwvdHQ+ICovCisJCUxPTkcsCisJCS8qKiBUaGUgcHJpbWl0aXZlIHR5cGUgPHR0PmNoYXI8L3R0PiAqLworCQlDSEFSLAorCQkvKiogVGhlIHByaW1pdGl2ZSB0eXBlIDx0dD5mbG9hdDwvdHQ+ICovCisJCUZMT0FULAorCQkvKiogVGhlIHByaW1pdGl2ZSB0eXBlIDx0dD5kb3VibGU8L3R0PiAqLworCQlET1VCTEUKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vUmVzb2x2ZWRDb25zdHJ1Y3Rvci5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vUmVzb2x2ZWRDb25zdHJ1Y3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZDBkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9SZXNvbHZlZENvbnN0cnVjdG9yLmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb247CisKKy8qKgorICoge0BsaW5rIFJlc29sdmVkRXhlY3V0YWJsZSBSZXNvbHZlZH0gcmVwcmVzZW50YXRpb24gb2YgYQorICoge0BsaW5rIENvbnN0cnVjdG9yRGVjbGFyYXRpb259LgorICogCisgKiBAc2luY2UgMi43CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzb2x2ZWRDb25zdHJ1Y3RvciBleHRlbmRzIFJlc29sdmVkRXhlY3V0YWJsZSB7CisJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbigpOworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vUmVzb2x2ZWRFeGVjdXRhYmxlLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9SZXNvbHZlZEV4ZWN1dGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzVjMzRmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vUmVzb2x2ZWRFeGVjdXRhYmxlLmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFJlc29sdmVkIHJlcHJlc2VudGF0aW9uIG9mIGFuIHtAbGluayBFeGVjdXRhYmxlRGVjbGFyYXRpb259LgorICogCisgKiBQYXJhbWV0ZXIgdHlwZXMgYW5kIGRlY2xhcmVkIGV4Y2VwdGlvbnMgYXJlIHB1dCBpbnRvIHRoZSBjb250ZXh0IG9mIGEKKyAqIHNwZWNpZmljIGRlY2xhcmluZyByZWZlcmVuY2UsIGUuZy4ge0BsaW5rIExpc3QjYWRkKE9iamVjdCkgTGlzdCNhZGQoT2JqZWN0KX0KKyAqIGJlY29tZXMgPGNvZGU+TGlzdCNhZGQoU3RyaW5nKTwvY29kZT4gaW4gdGhlIGNvbnRleHQgb2YgYW4ge0BsaW5rIEFycmF5TGlzdAorICogQXJyYXlMaXN0Jmx0O1N0cmluZyZndDt9CisgKiAKKyAqIEBzaW5jZSAyLjcKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvbHZlZEV4ZWN1dGFibGUgeworCisJLyoqCisJICogQHJldHVybiB0aGUgZXhlY3V0YWJsZSB0aGF0IGlzIHtAbGluayBSZXNvbHZlZEV4ZWN1dGFibGUgcmVzb2x2ZWR9CisJICovCisJRXhlY3V0YWJsZURlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgUmVzb2x2ZWRFeGVjdXRhYmxlIHJlc29sdmVkfSBwYXJhbWV0ZXJzCisJICovCisJSXRlcmFibGU8PyBleHRlbmRzIFJlc29sdmVkUGFyYW1ldGVyPiBnZXRSZXNvbHZlZFBhcmFtZXRlcnMoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHtAbGluayBSZXNvbHZlZEV4ZWN1dGFibGUgcmVzb2x2ZWR9IGV4Y2VwdGlvbnMKKwkgKi8KKwlJdGVyYWJsZTw/IGV4dGVuZHMgVHlwZVJlZmVyZW5jZT4gZ2V0UmVzb2x2ZWRFeGNlcHRpb25UeXBlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgc2ltcGxlIHNpZ25hdHVyZSBvZiB0aGlzIGV4ZWN1dGFibGUuIFRoZSBzaW1wbGUgc2lnbmF0dXJlIG9mCisJICogPGNvZGU+TGlzdCZsdDtTdHJpbmcmZ3Q7LmFkZEFsbChpbnQsIENvbGxlY3Rpb24mbHQ7RSZndDspPC9jb2RlPiBpcworCSAqIDxjb2RlPmFkZEFsbChpbnQsIENvbGxlY3Rpb24mbHQ7U3RyaW5nJmd0Oyk8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIHNpbXBsZSwgaHVtYW4tcmVhZGFibGUgc2lnbmF0dXJlCisJICovCisJU3RyaW5nIGdldFNpbXBsZVNpZ25hdHVyZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgZXJhc2VkIHNpZ25hdHVyZSBvZiB0aGlzIGZlYXR1cmUuIFRoZSByZXNvbHZlZCByZXByZXNlbnRhdGlvbiBvZgorCSAqIDxjb2RlPkxpc3QmbHQ7U3RyaW5nJmd0Oy5hZGRBbGwoaW50LGphdmEudXRpbC5Db2xsZWN0aW9uJmx0O0UmZ3Q7KTwvY29kZT4gaXMKKwkgKiA8Y29kZT5hZGRBbGwoaW50LENvbGxlY3Rpb24pPC9jb2RlPi4KKwkgKiAKKwkgKiBAc2luY2UgMi4xNAorCSAqIEByZXR1cm4gcmVzb2x2ZWQgZXJhc3VyZSBzaWduYXR1cmUKKwkgKi8KKwlTdHJpbmcgZ2V0UmVzb2x2ZWRFcmFzdXJlU2lnbmF0dXJlKCk7Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9SZXNvbHZlZE1ldGhvZC5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vUmVzb2x2ZWRNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWZlNGZjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vUmVzb2x2ZWRNZXRob2QuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworLyoqCisgKiB7QGxpbmsgUmVzb2x2ZWRFeGVjdXRhYmxlIFJlc29sdmVkfSByZXByZXNlbnRhdGlvbiBvZiBhCisgKiB7QGxpbmsgTWV0aG9kRGVjbGFyYXRpb259LgorICogCisgKiBAc2luY2UgMi43CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzb2x2ZWRNZXRob2QgZXh0ZW5kcyBSZXNvbHZlZEV4ZWN1dGFibGUgeworCisJTWV0aG9kRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHtAbGluayBSZXNvbHZlZEV4ZWN1dGFibGUgcmVzb2x2ZWR9IHJldHVybiB0eXBlCisJICovCisJVHlwZVJlZmVyZW5jZSBnZXRSZXNvbHZlZFJldHVyblR5cGUoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHtAbGluayBSZXNvbHZlZEV4ZWN1dGFibGUgcmVzb2x2ZWR9IHR5cGUgcGFyYW1ldGVycy4KKwkgKi8KKwlJdGVyYWJsZTw/IGV4dGVuZHMgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyPiBnZXRSZXNvbHZlZFR5cGVQYXJhbWV0ZXJzKCk7Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9SZXNvbHZlZFBhcmFtZXRlci5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vUmVzb2x2ZWRQYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGIzNmU3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vUmVzb2x2ZWRQYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworLyoqCisgKiBUaGUgcmVzb2x2ZWQgcmVwcmVzZW50YXRpb24gb2YgYSBwYXJhbWV0ZXIgaW4gdGhlIGNvbnRleHQgb2YgYSB0eXBlCisgKiByZWZlcmVuY2UuIENvbnNpZGVyIGZvciBpbnN0YW5jZSB0aGlzIG1ldGhvZAorICogCisgKiA8cHJlPgorICogaW50ZXJmYWNlIEZvbyZsdDtUJmd0OyB7CisgKiAgZGVmIHZvaWQgZm9vKFQgYXJnKQorICogfQorICogPC9wcmU+CisgKiAKKyAqIEluIHRoZSBjb250ZXh0IG9mIHRoZSB0eXBlIHJlZmVyZW5jZSA8Y29kZT5Gb28mbHQ7U3RyaW5nJmd0OzwvY29kZT4sIHRoZQorICogcGFyYW1ldGVyIDxjb2RlPmFyZzwvY29kZT4gaGFzIHRoZSB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4KKyAqIAorICogQHNpbmNlIDIuNworICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc29sdmVkUGFyYW1ldGVyIHsKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZWNsYXJhdGlvbiBiZWluZyB7QGxpbmsgUmVzb2x2ZWRQYXJhbWV0ZXIgcmVzb2x2ZWR9CisJICovCisJUGFyYW1ldGVyRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHtAbGluayBSZXNvbHZlZFBhcmFtZXRlciByZXNvbHZlZH0gdHlwZSBvZiB0aGUgcGFyYW1ldGVyCisJICovCisJVHlwZVJlZmVyZW5jZSBnZXRSZXNvbHZlZFR5cGUoKTsKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1Jlc29sdmVkVHlwZVBhcmFtZXRlci5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vUmVzb2x2ZWRUeXBlUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA0ODhlNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1Jlc29sdmVkVHlwZVBhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCisvKioKKyAqIFRoZSByZXNvbHZlZCByZXByZXNlbnRhdGlvbiBvZiBhIHR5cGUgcGFyYW1ldGVyIGluIHRoZSBjb250ZXh0IG9mIGEgdHlwZQorICogcmVmZXJlbmNlLiBDb25zaWRlciBmb3IgaW5zdGFuY2UgdGhpcyBtZXRob2Q6CisgKiAKKyAqIDxwcmU+CisgKiBpbnRlcmZhY2UgRm9vJmx0O1QmZ3Q7IHsKKyAqICBkZWYgJmx0O1UgZXh0ZW5kcyBUJmd0OyB2b2lkIGZvbyhVIGFyZykKKyAqIH0KKyAqIDwvcHJlPgorICogCisgKiBGb3IgYSA8Y29kZT5Gb28mbHQ7Q2hhclNlcXVlbmNlJmd0OzwvY29kZT4sIHRoZSB0eXBlIHBhcmFtZXRlciA8Y29kZT5VPC9jb2RlPgorICogd291bGQgaGF2ZSB0aGUgdXBwZXIgYm91bmQgPGNvZGU+Q2hhclNlcXVlbmNlPC9jb2RlPgorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc29sdmVkVHlwZVBhcmFtZXRlciB7CisJLyoqCisJICogQHJldHVybiB0aGUgZGVjbGFyYXRpb24gdGhhdCBpcyB7QGxpbmsgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyIHJlc29sdmVkfQorCSAqLworCVR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbigpOworCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIFJlc29sdmVkVHlwZVBhcmFtZXRlciByZXNvbHZlZH0gdXBwZXIgYm91bmRzCisJICovCisJSXRlcmFibGU8PyBleHRlbmRzIFR5cGVSZWZlcmVuY2U+IGdldFJlc29sdmVkVXBwZXJCb3VuZHMoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9UeXBlLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkODViMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1R5cGUuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIFR5cGUgZXh0ZW5kcyBOYW1lZEVsZW1lbnQgeworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgdHlwZSBkZWNsYXJhdGlvbi4gTmVzdGVkIHR5cGVzIHVzZSB0aGUgJy4nIGNoYXIgYXMgdGhlCisJICogaW5uZXIgY2xhc3MgZGVsaW1pdGVyLgorCSAqIEByZXR1cm4gdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgdHlwZSBkZWNsYXJhdGlvbi4KKwkgKi8KKwlTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpOworCQorCS8qKgorICAgICAqIERldGVybWluZXMgaWYgdGhlIHR5cGUgcmVwcmVzZW50ZWQgYnkgdGhpcworICAgICAqIDxjb2RlPlR5cGU8L2NvZGU+IG9iamVjdCBpcyBlaXRoZXIgdGhlIHNhbWUgYXMsIG9yIGlzIGEgc3VwZXJ0eXBlIG9mLCAKKyAgICAgKiB0aGUgdHlwZSByZXByZXNlbnRlZCBieSB0aGUgc3BlY2lmaWVkIDxjb2RlPlR5cGU8L2NvZGU+IHBhcmFtZXRlci4gCisgICAgICogSXQgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBzbzsKKyAgICAgKiBvdGhlcndpc2UgaXQgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uIElmIHRoaXMgPGNvZGU+VHlwZTwvY29kZT4KKyAgICAgKiBvYmplY3QgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSB0eXBlLCB0aGlzIG1ldGhvZCByZXR1cm5zCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5UeXBlPC9jb2RlPiBwYXJhbWV0ZXIgaXMKKyAgICAgKiBleGFjdGx5IHRoaXMgPGNvZGU+VHlwZTwvY29kZT4gb2JqZWN0OyBvdGhlcndpc2UgaXQgcmV0dXJucworICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdGhlclR5cGUgdGhlIDxjb2RlPlR5cGU8L2NvZGU+IG9iamVjdCB0byBiZSBjaGVja2VkCisgICAgICogQHJldHVybiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG9iamVjdHMgb2YgdGhlCisgICAgICogdHlwZSA8Y29kZT5jbHM8L2NvZGU+IGNhbiBiZSBhc3NpZ25lZCB0byBvYmplY3RzIG9mIHRoaXMgdHlwZS4gVGhlIG1ldGhvZCByZXR1cm5zIGZhbHNlIGlmCisgICAgICogdGhlIGdpdmVuIHBhcmFtZXRlciBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKwlib29sZWFuIGlzQXNzaWduYWJsZUZyb20oVHlwZSBvdGhlclR5cGUpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1R5cGVEZWNsYXJhdGlvbi5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vVHlwZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0NTk2MwotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1R5cGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIFR5cGVEZWNsYXJhdGlvbiBleHRlbmRzIFR5cGUsIE1lbWJlckRlY2xhcmF0aW9uIHsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG1lbWJlcnMgZGlyZWN0bHkgZGVjbGFyZWQgYW5kIGNvbnRhaW5lZCBpbiB0aGUgdHlwZSBkZWNsYXJhdGlvbgorCSAqLworCUl0ZXJhYmxlPD8gZXh0ZW5kcyBNZW1iZXJEZWNsYXJhdGlvbj4gZ2V0RGVjbGFyZWRNZW1iZXJzKCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgbWV0aG9kcyBkaXJlY3RseSBkZWNsYXJlZCBhbmQgY29udGFpbmVkIGluIHRoZSB0eXBlIGRlY2xhcmF0aW9uCisJICovCisJSXRlcmFibGU8PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBnZXREZWNsYXJlZE1ldGhvZHMoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBmaWVsZHMgZGlyZWN0bHkgZGVjbGFyZWQgYW5kIGNvbnRhaW5lZCBpbiB0aGUgdHlwZSBkZWNsYXJhdGlvbgorCSAqLworCUl0ZXJhYmxlPD8gZXh0ZW5kcyBGaWVsZERlY2xhcmF0aW9uPiBnZXREZWNsYXJlZEZpZWxkcygpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdG9ycyBkaXJlY3RseSBkZWNsYXJlZCBhbmQgY29udGFpbmVkIGluIHRoZSB0eXBlIGRlY2xhcmF0aW9uCisJICovCisJSXRlcmFibGU8PyBleHRlbmRzIENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IGdldERlY2xhcmVkQ29uc3RydWN0b3JzKCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgY2xhc3NlcyBkaXJlY3RseSBkZWNsYXJlZCBhbmQgY29udGFpbmVkIGluIHRoZSB0eXBlIGRlY2xhcmF0aW9uCisJICovCisJSXRlcmFibGU8PyBleHRlbmRzIENsYXNzRGVjbGFyYXRpb24+IGdldERlY2xhcmVkQ2xhc3NlcygpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGludGVyZmFjZXMgZGlyZWN0bHkgZGVjbGFyZWQgYW5kIGNvbnRhaW5lZCBpbiB0aGUgdHlwZSBkZWNsYXJhdGlvbgorCSAqLworCUl0ZXJhYmxlPD8gZXh0ZW5kcyBJbnRlcmZhY2VEZWNsYXJhdGlvbj4gZ2V0RGVjbGFyZWRJbnRlcmZhY2VzKCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgZW51bWVyYXRpb24gdHlwZXMgZGlyZWN0bHkgZGVjbGFyZWQgYW5kIGNvbnRhaW5lZCBpbiB0aGlzIHR5cGUgZGVjbGFyYXRpb24KKwkgKiBAc2luY2UgMi44CisJICovCisJSXRlcmFibGU8PyBleHRlbmRzIEVudW1lcmF0aW9uVHlwZURlY2xhcmF0aW9uPiBnZXREZWNsYXJlZEVudW1lcmF0aW9uVHlwZXMoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIHR5cGVzIGRpcmVjdGx5IGRlY2xhcmVkIGFuZCBjb250YWluZWQgaW4gdGhpcyB0eXBlIGRlY2xhcmF0aW9uCisJICogQHNpbmNlIDIuOAorCSAqLworCUl0ZXJhYmxlPD8gZXh0ZW5kcyBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uPiBnZXREZWNsYXJlZEFubm90YXRpb25UeXBlcygpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHR5cGVzIGRpcmVjdGx5IGRlY2xhcmVkIGFuZCBjb250YWluZWQgaW4gdGhpcyB0eXBlIGRlY2xhcmF0aW9uCisJICogQHNpbmNlIDIuOAorCSAqLworCUl0ZXJhYmxlPD8gZXh0ZW5kcyBUeXBlRGVjbGFyYXRpb24+IGdldERlY2xhcmVkVHlwZXMoKTsKKwkKKwkvKioKKwkgKiBAcGFyYW0gbmFtZSBvZiB0aGUgZmVhdHVyZQorCSAqIEByZXR1cm4gdGhlIGRlY2xhcmVkIGZpZWxkIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gb2Ygbm8gc3VjaCBmaWVsZCBleGlzdHMuCisJICovCisJRmllbGREZWNsYXJhdGlvbiBmaW5kRGVjbGFyZWRGaWVsZChTdHJpbmcgbmFtZSk7CisJCisJLyoqCisJICogQHBhcmFtIG5hbWUgb2YgdGhlIG5lc3RlZCB0eXBlCisJICogQHJldHVybiB0aGUgZGVjbGFyZWQsIG5lc3RlZCB0eXBlIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gb2Ygbm8gc3VjaCB0eXBlIGV4aXN0cy4KKwkgKiBAc2luY2UgMi44CisJICovCisJVHlwZURlY2xhcmF0aW9uIGZpbmREZWNsYXJlZFR5cGUoU3RyaW5nIG5hbWUpOworCQorCS8qKgorCSAqIEBwYXJhbSBuYW1lIG9mIHRoZSBtZXRob2QKKwkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMgLSB0aGUgdHlwZXMgb2YgdGhlIG1ldGhvZAorCSAqIEByZXR1cm4gdGhlIGRlY2xhcmVkIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciB0eXBlcyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIG1ldGhvZCBleGlzdHMuCisJICovCisJTWV0aG9kRGVjbGFyYXRpb24gZmluZERlY2xhcmVkTWV0aG9kKFN0cmluZyBuYW1lLCBUeXBlUmVmZXJlbmNlLi4uIHBhcmFtZXRlclR5cGVzKTsKKwkKKwkvKioKKwkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMgLSB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSBjb25zdHJ1Y3RvcgorCSAqIEByZXR1cm4gdGhlIGRlY2xhcmVkIGNvbnN0cnVjdG9yIHdpdGggdGhlIGV4YWN0IHNhbWUgcGFyYW1ldGVyIHR5cGVzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggY29uc3RydWN0b3JzIGV4aXN0cy4KKwkgKi8KKwlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGZpbmREZWNsYXJlZENvbnN0cnVjdG9yKFR5cGVSZWZlcmVuY2UuLi4gcGFyYW1ldGVyVHlwZXMpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2MTM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIGV4dGVuZHMgVHlwZSwgRGVjbGFyYXRpb24geworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHVwcGVyIGJvdW5kcworCSAqLworCUl0ZXJhYmxlPD8gZXh0ZW5kcyBUeXBlUmVmZXJlbmNlPiBnZXRVcHBlckJvdW5kcygpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHtAbGluayBUeXBlUGFyYW1ldGVyRGVjbGFyYXRvcn0gZGVjbGFyaW5nIHRoZSB0eXBlIHBhcmFtZXRlcgorCSAqLworCVR5cGVQYXJhbWV0ZXJEZWNsYXJhdG9yIGdldFR5cGVQYXJhbWV0ZXJEZWNsYXJhdG9yKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vVHlwZVBhcmFtZXRlckRlY2xhcmF0b3IuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1R5cGVQYXJhbWV0ZXJEZWNsYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4YzExMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1R5cGVQYXJhbWV0ZXJEZWNsYXJhdG9yLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBUeXBlUGFyYW1ldGVyRGVjbGFyYXRvciBleHRlbmRzIE1lbWJlckRlY2xhcmF0aW9uIHsKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZWNsYXJlZCB0eXBlIHBhcmFtZXRlcnMKKwkgKi8KKwlJdGVyYWJsZTw/IGV4dGVuZHMgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBnZXRUeXBlUGFyYW1ldGVycygpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1R5cGVSZWZlcmVuY2UuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1R5cGVSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzRkOTRjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgVHlwZVJlZmVyZW5jZSBleHRlbmRzIEVsZW1lbnQgeworCQorCS8qKgorCSAqIFJldHVybnMgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIHVzaW5nIHRoZSBzaW1wbGUgbmFtZXMgb2YgdGhlIGludm9sdmVkIHR5cGVzLgorCSAqIAorCSAqIEkuZS4gZm9yIAorCSAqIAorCSAqICAgJ2phdmEudXRpbC5MaXN0Jmx0Oz8gZXh0ZW5kcyBqYXZhLm1hdGguQmlnRGVjaW1hbCZndDsnIHRoaXMgbWV0aG9kIHJldHVybnMKKwkgKiAgICdMaXN0Jmx0Oz8gZXh0ZW5kcyBCaWdEZWNpbWFsJmd0OycKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGlzIHR5cGUgcmVmZXJlbmNlCisJICovCisJU3RyaW5nIGdldFNpbXBsZU5hbWUoKTsKKwkKKwkvKioKKwkgKiByZXR1cm5zIHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIHVzaW5nIHRoZSBxdWFsaWZpZWQgbmFtZXMgb2YgdGhlIGludm9sdmVkIHR5cGVzLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgdHlwZSByZWZlcmVuY2UKKwkgKi8KKwlTdHJpbmcgZ2V0TmFtZSgpOworCisJLyoqCisJICogQHJldHVybiB0aGUgcmVmZXJlbmNlZCB0eXBlLgorCSAqLworCVR5cGUgZ2V0VHlwZSgpOworCisJLyoqCisJICogQHJldHVybiB0aGUgdHlwZSBhcmd1bWVudHMKKwkgKi8KKwlMaXN0PFR5cGVSZWZlcmVuY2U+IGdldEFjdHVhbFR5cGVBcmd1bWVudHMoKTsKKworCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgd2lsZGNhcmQgcmVmZXJlbmNlCisJICovCisJYm9vbGVhbiBpc1dpbGRDYXJkKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB1cHBlciBib3VuZHMKKwkgKi8KKwlUeXBlUmVmZXJlbmNlIGdldFVwcGVyQm91bmQoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGxvd2VyIGJvdW5kcworCSAqLworCVR5cGVSZWZlcmVuY2UgZ2V0TG93ZXJCb3VuZCgpOworCisJLyoqCisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYW4gYXJyYXkKKwkgKi8KKwlib29sZWFuIGlzQXJyYXkoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGNvbXBvbmVudCB0eXBlIGlmIHRoaXMgdHllIHJlZmVyZW5jZSBpcyBhbiBhcnJheSB0eXBlIHJlZmVyZW5jZSwgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgorCSAqLworCVR5cGVSZWZlcmVuY2UgZ2V0QXJyYXlDb21wb25lbnRUeXBlKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyB0aGUgYW55IHR5cGUsIFRoZSBhbnkgdHlwZSBpcyB0aGUgc3VidHlwZSBvZiBldmVyeSByZWZlcmVuY2UgdHlwZSBhbmQgaXRzIG9ubHkgaW5zdGFuY2UgaXMgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJYm9vbGVhbiBpc0FueVR5cGUoKTsKKworCS8qKgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgcHJpbWl0aXZlIHR5cGUgKGkuZS4gb25lIG9mIGJvb2xlYW4sIGNoYXIsIGJ5dGUsIHNob3J0LCBpbnQsIGxvbmcsIGZsb2F0LCBkb3VibGUpLgorCSAqLworCWJvb2xlYW4gaXNQcmltaXRpdmUoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgd3JhcHBlciA8Y29kZT5UeXBlUmVmZXJlbmNlPC9jb2RlPiBpZiB0aGlzIHR5cGUgcmVmZXJlbmNlcyBpcyBhIHByaW1pdGl2ZSB0eXBlLiBSZXR1cm5zIDxjb2RlPnRoaXM8L2NvZGU+IG90aGVyd2lzZS4KKwkgKi8KKwlUeXBlUmVmZXJlbmNlIGdldFdyYXBwZXJJZlByaW1pdGl2ZSgpOworCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhpcyB0eXBlIGlzIG9uZSBvZiB0aGUgd3JhcHBlciB0eXBlcyBmb3IgdGhlIHByaW1pdGl2ZSB2YWx1ZSB0eXBlcy4KKwkgKiAKKwkgKiBAcmV0dXJuIHdpdGhlciB0aGlzIGlzIG9uZSBvZiB0aGUgd3JhcHBlciB0eXBlcyBmb3IgdGhlIHByaW1pdGl2ZSB2YWx1ZSB0eXBlcy4KKwkgKi8KKwlib29sZWFuIGlzV3JhcHBlcigpOworCisJLyoqCisJICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBwcmltaXRpdmUgPGNvZGU+VHlwZVJlZmVyZW5jZTwvY29kZT4gaWYgdGhpcyB0eXBlIHJlZmVyZW5jZXMgaXMgYSB3cmFwcGVyIHR5cGUuIFJldHVybnMgPGNvZGU+dGhpczwvY29kZT4gb3RoZXJ3aXNlLgorCSAqLworCVR5cGVSZWZlcmVuY2UgZ2V0UHJpbWl0aXZlSWZXcmFwcGVyKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB0eXBlIGlzICd2b2lkJyAoZG9lc24ndCBpbmNsdWRlICdqYXZhLmxhbmcuVm9pZCcpCisJICovCisJYm9vbGVhbiBpc1ZvaWQoKTsKKworCS8qKgorCSAqIERldGVybWluZXMgaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5UeXBlUmVmZXJlbmNlPC9jb2RlPiBwYXJhbWV0ZXIgY2FuIGJlIGFzc2lnbmVkIHRvIHRoaXMgCisJICogPGNvZGU+VHlwZVJlZmVyZW5jZTwvY29kZT4uIEl0IHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc287CisJICogb3RoZXJ3aXNlIGl0IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSB0eXBlUmVmZXJlbmNlCisJICogQHJldHVybiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlzIHRoZSBzcGVjaWZpZWQgdHlwZSByZWZlcmVuY2UgcGFyYW1ldGVyIGNhbiBiZSBhc3NpZ25lZCB0byB0aGlzIHR5cGUgcmVmZXJlbmNlLgorCSAqLworCWJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UpOworCQorCS8qKgorCSAqIFdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgcmVmZXJlbmNlIGlzIGFuIGluZmVycmVkIHJlZmVyZW5jZS4gCisJICogVGhhdCBpcyB0aGUgdHlwZSBpcyB0byBiZSBjb21wdXRlZCBmcm9tIHNvbWUgRXhwcmVzc2lvbiwgZS5nLiBhIG1ldGhvZCBib2R5IG9yIGEgZmllbGQgaW5pdGlhbGl6ZXIuCisJICogCisJICogSW5mZXJyZWQgdHlwZSByZWZlcmVuY2VzIGNhbiBvbmx5IGJlIHVzZWQgYXMgaGFuZGxlcywgYW5kIHdpbGwgdGhyb3VnaCBhbiB7QGxpbmsgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259IG9uIGV2ZXJ5IG1ldGhvZCBvdGhlciB0aGFuCisJICogCisJICogPHVsPgorCSAqICA8bGk+e0BsaW5rICN0b1N0cmluZygpfTwvbGk+CisJICogIDxsaT57QGxpbmsgI2VxdWFscyhPYmplY3QpfTwvbGk+CisJICogIDxsaT57QGxpbmsgI2hhc2hDb2RlKCl9PC9saT4KKwkgKiA8L3VsPgorCSAqIAorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIHR5cGUgcmVmZXJlbmNlIGlzIGFuIGluZmVycmVkIHR5cGUgcmVmZXJlbmNlLgorCSAqLworCWJvb2xlYW4gaXNJbmZlcnJlZCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHN1cGVydHlwZXMgKHN1cGVyY2xhc3MgYW5kIGludGVyZmFjZXMpIGRpcmVjdGx5IGltcGxlbWVudGVkL2V4dGVuZGVkIGJ5IHRoaXMgdHlwZQorCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlJdGVyYWJsZTw/IGV4dGVuZHMgVHlwZVJlZmVyZW5jZT4gZ2V0RGVjbGFyZWRTdXBlclR5cGVzKCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgcmVzb2x2ZWQgbWV0aG9kcyBkaXJlY3RseSBkZWNsYXJlZCBieSB0aGlzIHR5cGUKKwkgKiBAc2luY2UgMi43CisJICovCisJSXRlcmFibGU8PyBleHRlbmRzIFJlc29sdmVkTWV0aG9kPiBnZXREZWNsYXJlZFJlc29sdmVkTWV0aG9kcygpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIGNvbnN0cnVjdG9ycyBkaXJlY3RseSBkZWNsYXJlZCBieSB0aGlzIHR5cGUKKwkgKiBAc2luY2UgMi43CisJICovCisJSXRlcmFibGU8PyBleHRlbmRzIFJlc29sdmVkQ29uc3RydWN0b3I+IGdldERlY2xhcmVkUmVzb2x2ZWRDb25zdHJ1Y3RvcnMoKTsKKwkKKwkvKioKKwkgKiBDb21wdXRlcyBhbGwgdGhlIHJlc29sdmVkIG1ldGhvZHMgdGhhdCBjYW4gYmUgY2FsbGVkIG9uIHRoaXMgdHlwZSwgZWl0aGVyIGJlY2F1c2UgdGhleSB3ZXJlCisJICogZGVjbGFyZWQgZGlyZWN0bHkgYnkgdGhlIHR5cGUgb3IgYnkgb25lIG9mIGl0cyBzdXBlcnR5cGVzLgorCSAqIEZvciBvdmVybG9hZGVkIG1ldGhvZHMsIHRoZSBvbmUgZGVjbGFyZWQgY2xvc2VzdCB0byB0aGlzIHR5cGUgaXMgdXNlZC4gRS5nLiB3aGVuCisJICogY2FsbGVkIG9uIHRoZSBjbGFzcyA8Y29kZT5DPC9jb2RlPiBpbiB0aGlzIGhpZXJhcmNoeToKKwkgKiAKKwkgKiA8cHJlPgorCSAqIGNsYXNzIEEgeworCSAqICBkZWYgQ2hhclNlcXVlbmNlIGZvbygpCisJICogfQorCSAqIGNsYXNzIEIgZXh0ZW5kcyBBIHsKKwkgKiAgb3ZlcnJpZGUgU3RyaW5nIGZvbygpCisJICogfQorCSAqIGNsYXNzIEMgZXh0ZW5kcyBCIHt9CisJICogPHByZT4KKwkgKiAKKwkgKiBCI2ZvbygpIHdvdWxkIGJlIGNvbnRhaW5lZCwgYnV0IG5vdCBBI2ZvbygpLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIG1ldGhvZHMgZGVjbGFyZWQgaW4gdGhpcyB0eXBlIGFuZCBpdHMgc3VwZXJ0eXBlcy4gCisJICogQHNpbmNlIDIuNworCSAqLworCUl0ZXJhYmxlPD8gZXh0ZW5kcyBSZXNvbHZlZE1ldGhvZD4gZ2V0QWxsUmVzb2x2ZWRNZXRob2RzKCk7CisJCisvLwkvKioKKy8vCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMge0BsaW5rIFR5cGVSZWZlcmVuY2V9IHJlZmVycyB0byB0aGUgc2FtZSB0eXBlIGFzIHRoZSBvdGhlciBvbmUuCisvLwkgKiBAcGFyYW0gb3RoZXIgdGhlIHR5cGUgdG8gdGVzdCBlcXVpdmFsZW5jZSBhZ2FpbnN0CisvLwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0eXBlIGFuZCB0aGUgZ2l2ZW4gdHlwZSBhcmUgZXF1aXZhbGVudAorLy8JICogQHNpbmNlIDIuNworLy8JICovCisvLwlib29sZWFuIGlzKFR5cGVSZWZlcmVuY2Ugb3RoZXIpOworCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhpcyB0eXBlIHJlZmVyZW5jZSBlcXVhbHMgdGhlIGdpdmVuIHR5cGUgcmVmZXJlbmNlLgorCSAqIAorCSAqIEZvciB0eXBlIFJlZmVyZW5jZXMgd2hlcmUge0BsaW5rICNpc0luZmVycmVkKCl9IGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24KKwkgKiBpZGVudGl0eSBvZiB0aGUgdW5kZXJseWluZyBBU1QuCisJICogIAorCSAqIEBwYXJhbSBvYmoKKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG9iaiBpcyB0aGUgc2FtZSBpbnN0YW5jZQorCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7CisJCisJLyoqCisJICogVmFsdWUtYmFzZWQgZm9yIGFsbCB7QGxpbmsgVHlwZVJlZmVyZW5jZX1zIHdoZXJlIHtAbGluayAjaXNJbmZlcnJlZCgpfSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCisJICogQHNpbmNlIDIuNworCSAqLworCXB1YmxpYyBpbnQgaGFzaENvZGUoKTsKKwkKKwkvKioKKwkgKiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyB0eXBlIHJlZmVyZW5jZS4gSWYgdGhpcyByZWZlcmVuY2UgaXMgcmVzb2x2ZWQsIGl0IHdpbGwKKwkgKiByZXR1cm4gdGhlIHNpbXBsZSBuYW1lIG9mIHRoaXMgcmVmZXJlbmNlLiBPdGhlcndpc2UgYSB0ZWNobmljYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluZmVycmVkIHR5cGUKKwkgKiByZWZlcmVuY2UuCisJICogCisJICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbgorCSAqIAorCSAqIEBzaW5jZSAyLjgKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCk7Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9WaXNpYmlsaXR5LmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9kZWNsYXJhdGlvbi9WaXNpYmlsaXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhMjYzMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1Zpc2liaWxpdHkuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKi8KK0BCZXRhCitwdWJsaWMgZW51bSBWaXNpYmlsaXR5IHsKKwkvKioKKwkgKiBkZWZhdWx0IHBhY2thZ2UtcHJpdmF0ZQorCSAqLworCURFRkFVTFQsIAorCQorCS8qKgorCSAqIHByaXZhdGUgdmlzaWJpbGl0eQorCSAqLworCVBSSVZBVEUsIAorCQorCS8qKgorCSAqIHByb3RlY3RlZCB2aXNpYmlsaXR5CisJICovCisJUFJPVEVDVEVELCAKKwkKKwkvKioKKwkgKiBwdWJsaWMgdmlzaWJpbGl0eQorCSAqLworCVBVQkxJQworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZGVjbGFyYXRpb24vVm9pZFR5cGUuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1ZvaWRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJjZmZiOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2RlY2xhcmF0aW9uL1ZvaWRUeXBlLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIFZvaWRUeXBlIGV4dGVuZHMgVHlwZSB7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZXhwcmVzc2lvbi9FeHByZXNzaW9uLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9leHByZXNzaW9uL0V4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWYzNTIyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZXhwcmVzc2lvbi9FeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZXhwcmVzc2lvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5FbGVtZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgRXhwcmVzc2lvbiBleHRlbmRzIEVsZW1lbnQgeworCQorfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZmlsZS9GaWxlTG9jYXRpb25zLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9maWxlL0ZpbGVMb2NhdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDUwNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZmlsZS9GaWxlTG9jYXRpb25zLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZmlsZTsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIEEgc2VydmljZSB3aGljaCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYXRpb24gb2YgYSBwYXRoLgorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgRmlsZUxvY2F0aW9ucyB7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzb3VyY2UgZm9sZGVyIHRoZSBnaXZlbiBoYW5kbGUgaXMgY29udGFpbmVkIGluIG9yCisJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZ2l2ZW4ge0BsaW5rIFBhdGh9IGlzIG5vdAorCSAqICAgICAgICAgbG9jYXRlZCBpbiBhIHNvdXJjZSBmb2xkZXIuCisJICogICAgICAgICAKKwkgKiBAcGFyYW0gcGF0aCBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgcmVzb3VyY2UKKwkgKiBAcmV0dXJuIHRoZSBzb3VyY2UgZm9sZGVyIHRoZSBnaXZlbiBoYW5kbGUgaXMgY29udGFpbmVkIGluIG9yCisJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZ2l2ZW4ge0BsaW5rIFBhdGh9IGlzIG5vdAorCSAqICAgICAgICAgbG9jYXRlZCBpbiBhIHNvdXJjZSBmb2xkZXIuCisJICogQHNlZSBQYXRoCisJICovCisJUGF0aCBnZXRTb3VyY2VGb2xkZXIoUGF0aCBwYXRoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHRhcmdldCBmb2xkZXIgZm9yIHRoZSBnaXZlbiBzb3VyY2UgZm9sZGVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBnaXZlbgorCSAqIGZvbGRlciBpcyBub3QgYSBzb3VyY2UgZm9sZGVyIG9yIGRvZXNuJ3QgaGF2ZSBhIGNvbmZpZ3VyZWQgdGFyZ2V0IGZvbGRlci4KKwkgKiAKKwkgKiBAcGFyYW0gc291cmNlRm9sZGVyIHRoZSBzb3VyY2UgZm9sZGVyIHRvIGZpbmQgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0IGZvbGRlciBmb3IuCisJICogQHJldHVybiB0aGUgdGFyZ2V0IGZvbGRlcgorCSAqLworCVBhdGggZ2V0VGFyZ2V0Rm9sZGVyKFBhdGggc291cmNlRm9sZGVyKTsKKworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHByb2plY3Qgcm9vdCBmb3IgdGhlIGdpdmVuIHJlc291cmNlIGhhbmRsZS4KKwkgKiAKKwkgKiBAcGFyYW0gcGF0aCBhbiBhYnNvbHV0ZSBwYXRoIAorCSAqIEByZXR1cm4gdGhlIHByb2plY3QncyByb290CisJICovCisJUGF0aCBnZXRQcm9qZWN0Rm9sZGVyKFBhdGggcGF0aCk7CisJCisJLyoqCisJICogQHBhcmFtIHBhdGggYW4gYWJzb2x1dGUgcGF0aAorCSAqIEByZXR1cm4gdGhlIHNvdXJjZSBmb2xkZXJzIG9mIHRoZSBwcm9qZWN0IHRoZSBnaXZlbiBwYXRoIGlzIGNvbnRhaW5lZCBpbgorCSAqIEBzaW5jZSAyLjgKKwkgKi8KKwlTZXQ8UGF0aD4gZ2V0UHJvamVjdFNvdXJjZUZvbGRlcnMoUGF0aCBwYXRoKTsKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2ZpbGUvRmlsZVN5c3RlbVN1cHBvcnQuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2ZpbGUvRmlsZVN5c3RlbVN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGFmMThlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZmlsZS9GaWxlU3lzdGVtU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5maWxlOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIAorICogU3VwcG9ydCBmb3IgYWNjZXNzaW5nIHRoZSBmaWxlIHN5c3RlbS4KKyAqIAorICogQGF1dGhvciBBbnRvbiBLb3N5YWtvdgorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIEZpbGVTeXN0ZW1TdXBwb3J0IHsKKworCS8qKgorCSAqIEBwYXJhbSBwYXRoCisJICogQHJldHVybiB0aGUgY2hpbGRyZW4gb2YgdGhlIGZvbGRlciB0aGUgZ2l2ZW4gcGF0aCBwb2ludHMgdG87IAorCSAqIAkJICAgZW1wdHkgaXRlcmFibGUgaWYgdGhlIHBhdGggcG9pbnRzIHRvIGEgbm9uIGV4aXN0ZW50IGZpbGUgb3IgZm9sZGVyCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGdldCBjaGlsZHJlbiBvZiBhIGdpdmVuIHBhdGggZm9yIHNvbWUgcmVhc29uIAorCSAqLworCUl0ZXJhYmxlPD8gZXh0ZW5kcyBQYXRoPiBnZXRDaGlsZHJlbihQYXRoIHBhdGgpOworCQorCS8qKgorCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCisJICogQHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIHBvaW50cyB0byBhbiBleGlzdGVudCBmaWxlLgorCSAqLworCWJvb2xlYW4gZXhpc3RzKFBhdGggcGF0aCk7CisJCisJLyoqCisJICogQHBhcmFtIHBhdGgKKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggcG9pbnRzIHRvIGFuIGV4aXN0ZW50IGZvbGRlcgorCSAqLworCWJvb2xlYW4gaXNGb2xkZXIoUGF0aCBwYXRoKTsKKwkKKwkvKioKKwkgKiBAcGFyYW0gcGF0aAorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBwb2ludHMgdG8gYW4gZXhpc3RlbnQgZmlsZQorCSAqLworCWJvb2xlYW4gaXNGaWxlKFBhdGggcGF0aCk7CisJCisJLyoqCisJICogQHBhcmFtIHBhdGgKKwkgKiBAcmV0dXJuICBBIDxjb2RlPmxvbmc8L2NvZGU+IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgdGltZSB0aGUgZmlsZSB3YXMKKyAgICAgKiAgICAgICAgICBsYXN0IG1vZGlmaWVkLCBtZWFzdXJlZCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoCisgICAgICogICAgICAgICAgKDAwOjAwOjAwIEdNVCwgSmFudWFyeSAxLCAxOTcwKSwgb3IgPGNvZGU+MEw8L2NvZGU+IGlmIHRoZQorICAgICAqICAgICAgICAgIGZpbGUgZG9lcyBub3QgZXhpc3QuCisJICovCisJbG9uZyBnZXRMYXN0TW9kaWZpY2F0aW9uKFBhdGggcGF0aCk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiBhIGNoYXJzZXQgdG8gYmUgdXNlZCB3aGVuIGRlY29kaW5nIHRoZSBjb250ZW50cyBvZiB0aGlzIAorCSAqIGZpbGUgaW50byBjaGFyYWN0ZXJzLiAKKwkgKiAKKwkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgYSBjaGFyc2V0CisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGdldCBjaGFyc2V0IG9mIGEgZ2l2ZW4gcGF0aCBmb3Igc29tZSByZWFzb24KKwkgKi8KKwlTdHJpbmcgZ2V0Q2hhcnNldChQYXRoIHBhdGgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFzIGEgY2hhciBzZXF1ZW5jZS4KKwkgKiAKKwkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAorCSAqIEByZXR1cm4gYW4gaW5wdXQgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBhdGggcG9pbnRzIHRvIGEgbm9uIGV4aXN0ZW50IGZpbGUKKwkgKi8KKwlDaGFyU2VxdWVuY2UgZ2V0Q29udGVudHMoUGF0aCBwYXRoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIGFuIG9wZW4gaW5wdXQgc3RyZWFtIG9uIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUuCisJICogCisJICogQHBhcmFtIHBhdGggdGhlIHBhdGgKKwkgKiBAcmV0dXJuIGFuIGlucHV0IHN0cmVhbSBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwYXRoIHBvaW50cyB0byBhIG5vbiBleGlzdGVudCBmaWxlCisJICovCisJSW5wdXRTdHJlYW0gZ2V0Q29udGVudHNBc1N0cmVhbShQYXRoIHBhdGgpOworCQorCS8qKgorCSAqIDxwPgorCSAqIFJldHVybnMgdGhlIFVSSSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHBhdGguCisJICogPC9wPgorCSAqIAorCSAqIDxwPgorCSAqIDxiPldhcm5pbmc8L2I+OiBEb24ndCB1c2UgdGhpcyBtZXRob2QgdG8gZ2V0IHdyaXRlIGFjY2Vzcy4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHBhdGgKKwkgKiAgICAgICAgICAgIHRoZSBwYXRoCisJICogQHJldHVybiB0aGUgVVJJIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gcGF0aCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcGF0aCBwb2ludHMgdG8gYSBub24gZXhpc3RlbnQgZmlsZSBvciBhIGZvbGRlci4KKwkgKi8KKwlVUkkgdG9VUkkoUGF0aCBwYXRoKTsKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2ZpbGUvTXV0YWJsZUZpbGVTeXN0ZW1TdXBwb3J0LmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9maWxlL011dGFibGVGaWxlU3lzdGVtU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OTc1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9maWxlL011dGFibGVGaWxlU3lzdGVtU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmZpbGU7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworLyoqCisgKiBBbGxvd3MgbW9kaWZpY2F0aW9ucyBvbiB0aGUgZmlsZSBzeXN0ZW0uCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBNdXRhYmxlRmlsZVN5c3RlbVN1cHBvcnQgZXh0ZW5kcyBGaWxlU3lzdGVtU3VwcG9ydCB7CisKKwkvKioKKwkgKiBXcml0ZXMgdGhlIGdpdmVuIGNvbnRlbnRzIHRvIHRoZSBnaXZlbiBwYXRoLgorCSAqIEl0IHdpbGwgY3JlYXRlIHRoZSBmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGFuZCBjcmVhdGUgZm9sZGVycyBmb3IgYWxsIHBhcmVudHMgaWYgdGhleSBkb24ndCBleGlzdC4KKwkgKiAKKwkgKiBJbXBsZW1lbnRvcnMgbWF5IGRlY2lkZSB0byBwZXJmb3JtIHRoaXMgbWV0aG9kIGFzeW5jaHJvbm91c2x5LiBDbGllbnRzIHNob3VsZCBub3QgcmVseSBvbiBpbnZvY2F0aW9uIHRpbWluZy4gCisJICogCisJICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gd3JpdGUgdGhlIGNvbnRlbnRzIHRvCisJICogQHBhcmFtIGNvbnRlbnRzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZQorCSAqLworCXZvaWQgc2V0Q29udGVudHMoUGF0aCBwYXRoLCBDaGFyU2VxdWVuY2UgY29udGVudHMpOworCQorCS8qKgorCSAqIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSB0byB0aGUgYnl0ZXMgaW4gdGhlIGdpdmVuIGlucHV0IHN0cmVhbS4KKwkgKiBUaGUgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIGFmdGVyIHRoZSBvcGVyYXRpb24gaGFzIGZpbmlzaGVkLgorCSAqIAorCSAqIEltcGxlbWVudG9ycyBtYXkgZGVjaWRlIHRvIHBlcmZvcm0gdGhpcyBtZXRob2QgYXN5bmNocm9ub3VzbHkuIENsaWVudHMgc2hvdWxkIG5vdCByZWx5IG9uIGludm9jYXRpb24gdGltaW5nLgorCSAqCisJICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdGhlIGZpbGUKKwkgKiBAcGFyYW0gc291cmNlIGFuIGlucHV0IHN0cmVhbSBjb250YWluaW5nIHRoZSBuZXcgY29udGVudHMgb2YgdGhlIGZpbGUKKwkgKi8KKwl2b2lkIHNldENvbnRlbnRzQXNTdHJlYW0oUGF0aCBwYXRoLCBJbnB1dFN0cmVhbSBzb3VyY2UpOworCQorCS8qKgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuCisJICogTWV0aG9kcyB7QGxpbmsgI3NldENvbnRlbnRzfSBhbmQge0BsaW5rICNzZXRDb250ZW50c0FzU3RyZWFtKFBhdGgsIElucHV0U3RyZWFtKX0gY3JlYXRlIGZvbGRlcnMgZm9yIGFsbCBwYXJlbnRzIGlmIHRoZXkgZG9uJ3QgZXhpc3QuCisJICogPC9wPgorCSAqIAorCSAqIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIHRoZSBnaXZlbiBwYXRoIGFuZCBhbGwgaXRzIHBhcmVudHMgaWYgbmVjZXNzYXJ5LgorCSAqIAorCSAqIEltcGxlbWVudG9ycyBtYXkgZGVjaWRlIHRvIHBlcmZvcm0gdGhpcyBtZXRob2QgYXN5bmNocm9ub3VzbHkuIENsaWVudHMgc2hvdWxkIG5vdCByZWx5IG9uIGludm9jYXRpb24gdGltaW5nLgorCSAqIAorCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRoZSBmaWxlCisJICogQHNpbmNlIDIuNworCSAqLworCUBEZXByZWNhdGVkCisJdm9pZCBta2RpcihQYXRoIHBhdGgpOworCQorCS8qKgorCSAqIERlbGV0ZXMgdGhlIGZpbGUgb3IgZm9sZGVyIHRoZSBnaXZlbiBwYXRoIHBvaW50cyB0by4gCisJICogSWYgcGF0aCBwb2ludHMgdG8gYSBmb2xkZXIgdGhpcyBtZXRob2Qgd2lsbCBhbHNvIGRlbGV0ZSBhbGwgaXRzIGNvbnRlbnRzLgorCSAqIAorCSAqIEltcGxlbWVudG9ycyBtYXkgZGVjaWRlIHRvIHBlcmZvcm0gdGhpcyBtZXRob2QgYXN5bmNocm9ub3VzbHkuIENsaWVudHMgc2hvdWxkIG5vdCByZWx5IG9uIGludm9jYXRpb24gdGltaW5nLgorCSAqIAorCSAqIEBwYXJhbSBwYXRoCisJICogQHNpbmNlIDIuNworCSAqLworCXZvaWQgZGVsZXRlKFBhdGggcGF0aCk7CisKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2ZpbGUvUGF0aC5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vZmlsZS9QYXRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3YWZhMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL2ZpbGUvUGF0aC5qYXZhCkBAIC0wLDAgKzEsMzEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5maWxlOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHMubmV3QXJyYXlMaXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworCisvKioKKyAqIEEgcGF0aCBwb2ludHMgdG8gc29tZSBmaWxlIG9yIGZvbGRlciB3aXRoaW4gYSB7QGxpbmsgRmlsZVN5c3RlbVN1cHBvcnR9IGFuZCB7QGxpbmsgTXV0YWJsZUZpbGVTeXN0ZW1TdXBwb3J0fS4KKyAqIAorICogQSBwYXRoIGVpdGhlciBzdGFydHMgd2l0aCBhIHNsYXNoIHdoaWNoIGRlbm90ZXMgYW4gYWJzb2x1dGUgcGF0aCBvciBhIHNlZ21lbnQgd2hpY2ggZGVub3RlcyBhIHJlbGF0aXZlIHBhdGguCisgKiBOb3RlIHRoYXQgdGhpcyBpcyBhbiBhYnN0cmFjdGlvbiBvdmVyIGRpZmZlcmVudCAncmVhbCcgZmlsZSBzeXN0ZW1zIGFuZCBkb2Vzbid0IHVuZGVyc3RhbmQgcGxhdGZvcm0gc3BlY2lmaWMgdGhpbmdzIGxpa2UsIGUuZy4gCisgKiAiYzovIiBvbiB3aW5kb3dzLgorICogCisgKiBUaGUgcGF0aCBzZWdtZW50IHNlcGFyYXRvciBpcyAnLycuCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICovCitAQmV0YQorcHVibGljIGZpbmFsIGNsYXNzIFBhdGggeworCQorCS8qKgorCSAqIHRoZSBzZWdtZW50IHNlcGFyYXRvciB1c2VkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTRUdNRU5UX1NFUEFSQVRPUiA9ICcvJzsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTcGxpdHRlciBzcGxpdHRlciA9IFNwbGl0dGVyLm9uKFNFR01FTlRfU0VQQVJBVE9SICk7CisJLyoqCisJICogdGhlIHJvb3QgcGF0aAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0aCBST09UID0gbmV3IFBhdGgoIi8iKTsKKwkKKwlwcml2YXRlIGZpbmFsIEltbXV0YWJsZUxpc3Q8U3RyaW5nPiBzZWdtZW50czsKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW4gYWJzb2x1dGU7CisKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFBhdGggb2JqZWN0IGZyb20gYSBnaXZlbiBzdHJpbmcuCisJICogCisJICogdGhlIHVzZWQgZmlsZSBzZXBhcmF0b3IgaXMgJy8nIGFuZCBhIGxlYWRpbmcgb25lIGluZGljYXRlcyBhbiBhYnNvbHV0ZSBwYXRoLgorCSAqIAorCSAqIEBwYXJhbSBwYXRoQXNTdHJpbmcKKwkgKi8KKwlwdWJsaWMgUGF0aChTdHJpbmcgcGF0aEFzU3RyaW5nKSB7CisJCWlmIChwYXRoQXNTdHJpbmcgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQlpZiAocGF0aEFzU3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZW1wdHkgcGF0aCIpOworCQlwYXRoQXNTdHJpbmcgPSBwYXRoQXNTdHJpbmcucmVwbGFjZSgnXFwnLCBTRUdNRU5UX1NFUEFSQVRPUiApOyAvL3JlcGxhY2Ugd2luZG93cyBzZXBhcmF0b3JzCisJCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBzcGxpdHRlci5zcGxpdChwYXRoQXNTdHJpbmcpOworCQkKKwkJLy8gaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgZW1wdHkgaXQgaGFzIGEgbGVhZGluZyBzZXBhcmF0b3I7CisJCXRoaXMuYWJzb2x1dGUgPSBpdGVyYWJsZS5pdGVyYXRvcigpLm5leHQoKS5sZW5ndGgoKSA9PSAwOworCQkKKwkJSXRlcmFibGU8U3RyaW5nPiB3aXRob3V0RW1wdHlTZWdtZW50cyA9IEl0ZXJhYmxlcy5maWx0ZXIoaXRlcmFibGUsIG5ldyBQcmVkaWNhdGU8U3RyaW5nPigpIHsKKworCQkJcHVibGljIGJvb2xlYW4gYXBwbHkoU3RyaW5nIGlucHV0KSB7CisJCQkJcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgaW5wdXQudHJpbSgpLmxlbmd0aCgpID4gMDsKKwkJCX0KKwkJfSk7CisJCXNlZ21lbnRzID0gSW1tdXRhYmxlTGlzdC5jb3B5T2Yobm9ybWFsaXplKHdpdGhvdXRFbXB0eVNlZ21lbnRzKSk7CisJfQorCQorCXByaXZhdGUgUGF0aChMaXN0PFN0cmluZz4gc2VnbWVudHMsIGJvb2xlYW4gaXNBYnNvbHV0ZSkgeworCQl0aGlzLnNlZ21lbnRzID0gSW1tdXRhYmxlTGlzdC5jb3B5T2Yobm9ybWFsaXplKHNlZ21lbnRzKSk7CisJCXRoaXMuYWJzb2x1dGUgPSBpc0Fic29sdXRlOworCX0KKwkKKwlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gbm9ybWFsaXplKEl0ZXJhYmxlPFN0cmluZz4gc2VnbWVudHMpIHsKKwkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ld0FycmF5TGlzdCgpOworCQlib29sZWFuIGNhblJlbW92ZVNlZ21lbnQgPSBmYWxzZTsKKwkJZm9yIChTdHJpbmcgc2VnIDogc2VnbWVudHMpIHsKKwkJCVN0cmluZyBzdHJpbmcgPSBzZWcudHJpbSgpOworCQkJaWYgKGNhblJlbW92ZVNlZ21lbnQgJiYgc3RyaW5nLmVxdWFscygiLi4iKSkgeworCQkJCXJlc3VsdC5yZW1vdmUocmVzdWx0LnNpemUoKS0xKTsKKwkJCQljYW5SZW1vdmVTZWdtZW50ID0gIXJlc3VsdC5pc0VtcHR5KCkgJiYgIXJlc3VsdC5nZXQoMCkuZXF1YWxzKCIuLiIpOworCQkJfSBlbHNlIGlmIChzdHJpbmcuZXF1YWxzKCIuIikpIHsKKwkJCQkvLyBkbyBub3RoaW5nCisJCQl9IGVsc2UgeworCQkJCXJlc3VsdC5hZGQoc3RyaW5nKTsKKwkJCQljYW5SZW1vdmVTZWdtZW50ID0gIXN0cmluZy5lcXVhbHMoIi4uIik7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhbiBhYnNvbHV0ZSBwYXRoCisJICovCisJcHVibGljIGJvb2xlYW4gaXNBYnNvbHV0ZSgpIHsKKwkJcmV0dXJuIGFic29sdXRlOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzZWdtZW50cworCSAqLworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0U2VnbWVudHMoKSB7CisJCXJldHVybiBzZWdtZW50czsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0cmFpbGluZyBzZWdtZW50LCBpLmUuIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgdW5kZXJseWluZyBlbGVtZW50LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdFNlZ21lbnQoKSB7CisJCXJldHVybiBzZWdtZW50cy5pc0VtcHR5KCkgPyBudWxsIDogc2VnbWVudHMuZ2V0KHNlZ21lbnRzLnNpemUoKS0xKTsKKwl9CisJCisJLyoqCisJICogQXBwZW5kcyB0aGUgZ2l2ZW4gc3VmZml4IHRvIHRoaXMgcGF0aC4KKwkgKiAKKwkgKiBAcGFyYW0gc3VmZml4IHRoZSBzdWZmaXggdG8gYXBwZW5kIHRvIHRoaXMgcGF0aAorCSAqIEByZXR1cm4gYSBuZXcgUGF0aCB3aXRoIHRoZSBnaXZlbiBzdWZmaXggYXBwZW5kZWQgdG8gdGhpcyBwYXRoJ3Mgc2VnbWVudHMuCisJICovCisJcHVibGljIFBhdGggYXBwZW5kKFN0cmluZyBzdWZmaXgpIHsKKwkJcmV0dXJuIG5ldyBQYXRoKHRvU3RyaW5nKCkrIFNFR01FTlRfU0VQQVJBVE9SICsgc3VmZml4KTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFyZW50IG9mIHRoaXMgcGF0aCBvciBudWxsIGlmIHRoaXMgcGF0aCBpcyB0aGUgcm9vdCBwYXRoLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGlzIHBhdGggb3IgbnVsbCBpZiB0aGlzIHBhdGggaXMgdGhlIHJvb3QgcGF0aC4KKwkgKi8KKwlwdWJsaWMgUGF0aCBnZXRQYXJlbnQoKSB7CisJCWlmICghaXNBYnNvbHV0ZSgpKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicGF0aCBpcyBub3QgYWJzb2x1dGU6ICIgKyB0b1N0cmluZygpKTsKKwkJaWYgKHNlZ21lbnRzLmlzRW1wdHkoKSkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gbmV3IFBhdGgoc2VnbWVudHMuc3ViTGlzdCgwLCBzZWdtZW50cy5zaXplKCktMSksIHRydWUpOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBmaWxlIGV4dGVuc2lvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHBhdGgncyBsYXN0IHNlZ21lbnQgZG9lc24ndCBoYXZlIGEgZmlsZSBleHRlbnNpb24uCisJICovCisJcHVibGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCkgeworCQlTdHJpbmcgbGFzdFNlZ21lbnQgPSBnZXRMYXN0U2VnbWVudCgpOworCQlpbnQgaWR4ID0gbGFzdFNlZ21lbnQubGFzdEluZGV4T2YoJy4nKTsKKwkJaWYgKGlkeCA9PSAtMSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGxhc3RTZWdtZW50LnN1YnN0cmluZyhpZHgrMSk7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKKwkgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoCisJICovCisJcHVibGljIFBhdGggZ2V0QWJzb2x1dGVQYXRoKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKwkJUGF0aCBvdGhlciA9IG5ldyBQYXRoKHJlbGF0aXZlUGF0aCk7CisJCXJldHVybiBnZXRBYnNvbHV0ZVBhdGgob3RoZXIpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKKwkgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoCisJICovCisJcHVibGljIFBhdGggZ2V0QWJzb2x1dGVQYXRoKFBhdGggcmVsYXRpdmVQYXRoKSB7CisJCWlmIChyZWxhdGl2ZVBhdGguaXNBYnNvbHV0ZSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZ2l2ZW4gcGF0aCAnIityZWxhdGl2ZVBhdGgrIicgaXMgbm90IHJlbGF0aXZlLiIpOworCQl9CisJCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXdBcnJheUxpc3QoZ2V0U2VnbWVudHMoKSk7CisJCWZvciAoU3RyaW5nIHNlZ21lbnQgOiByZWxhdGl2ZVBhdGguZ2V0U2VnbWVudHMoKSkgeworCQkJaWYgKHNlZ21lbnQuZXF1YWxzKCIuLiIpKSB7CisJCQkJLy8gZ28gdXAKKwkJCQlyZXN1bHQucmVtb3ZlKHJlc3VsdC5zaXplKCktMSk7CisJCQl9IGVsc2UgaWYgKHNlZ21lbnQuZXF1YWxzKCIuIikpIHsKKwkJCQkvLyBzdGF5IGluIGN1cnJlbnQgZGlyZWN0b3J5CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdC5hZGQoc2VnbWVudCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG5ldyBQYXRoKHJlc3VsdCwgdHJ1ZSk7CisJfQorCisJLyoqCisJICogU2VlIHtAbGluayAjcmVsYXRpdml6ZShQYXRoKX0KKwkgKiAKKwkgKiBAcGFyYW0gb3RoZXIgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgcGF0aAorCSAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyByZWxhdGl2ZSBwYXRoIG9yIG51bGwgaWYgbmVpdGhlciBvZiB0aGUgZ2l2ZW4gcGF0aHMgaXMgYSBwcmVmaXggb2YgdGhlIG90aGVyCisJICovCisJcHVibGljIFBhdGggcmVsYXRpdml6ZShTdHJpbmcgb3RoZXIpIHsKKwkJcmV0dXJuIHJlbGF0aXZpemUobmV3IFBhdGgob3RoZXIpKTsKKwl9CisJCisJLyoqCisgICAgKiBDb25zdHJ1Y3RzIGEgcmVsYXRpdmUgcGF0aCBiZXR3ZWVuIHRoaXMgcGF0aCBhbmQgYSBnaXZlbiBwYXRoLgorICAgICoKKyAgICAqIDxwPiBSZWxhdGl2aXphdGlvbiBpcyB0aGUgaW52ZXJzZSBvZiB7QGxpbmsgI2dldEFic29sdXRlUGF0aChQYXRoKSByZXNvbHV0aW9ufS4KKyAgICAqIFRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIGNvbnN0cnVjdCBhIHtAbGluayAjaXNBYnNvbHV0ZSByZWxhdGl2ZX0gcGF0aAorICAgICogdGhhdCB3aGVuIHtAbGluayAjZ2V0QWJzb2x1dGVQYXRoKFBhdGgpIHJlc29sdmVkfSBhZ2FpbnN0IHRoaXMgcGF0aCwgeWllbGRzIGEKKyAgICAqIHBhdGggdGhhdCBsb2NhdGVzIHRoZSBzYW1lIGZpbGUgYXMgdGhlIGdpdmVuIHBhdGguIEZvciBleGFtcGxlLCBvbiBVTklYLAorICAgICogaWYgdGhpcyBwYXRoIGlzIHtAY29kZSAiL2EvYiJ9IGFuZCB0aGUgZ2l2ZW4gcGF0aCBpcyB7QGNvZGUgIi9hL2IvYy9kIn0KKyAgICAqIHRoZW4gdGhlIHJlc3VsdGluZyByZWxhdGl2ZSBwYXRoIHdvdWxkIGJlIHtAY29kZSAiYy9kIn0uIAorIAkqIEJvdGggcGF0aHMgbXVzdCBiZSBhYnNvbHV0ZSBhbmQgYW5kIGVpdGhlciB0aGlzIHBhdGggb3IgdGhlIGdpdmVuIHBhdGggbXVzdCBiZSBhCisgCSoge0BsaW5rICNzdGFydHNXaXRoKFBhdGgpIHByZWZpeH0gb2YgdGhlIG90aGVyLgorICAgICoKKyAgICAqIEBwYXJhbSAgIG90aGVyCisgICAgKiAgICAgICAgICB0aGUgcGF0aCB0byByZWxhdGl2aXplIGFnYWluc3QgdGhpcyBwYXRoCisgICAgKgorICAgICogQHJldHVybiAgdGhlIHJlc3VsdGluZyByZWxhdGl2ZSBwYXRoIG9yIG51bGwgaWYgbmVpdGhlciBvZiB0aGUgZ2l2ZW4gcGF0aHMgaXMgYSBwcmVmaXggb2YgdGhlIG90aGVyCisgICAgKgorICAgICogQHRocm93cyAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgKiAgICAgICAgICBpZiB0aGlzIHBhdGggYW5kIHtAY29kZSBvdGhlcn0gYXJlIG5vdCBib3RoIGFic29sdXRlIG9yIHJlbGF0aXZlCisgICAgKi8KKwlwdWJsaWMgUGF0aCByZWxhdGl2aXplKFBhdGggb3RoZXIpIHsKKwkJaWYgKG90aGVyLmlzQWJzb2x1dGUoKSAhPSBpc0Fic29sdXRlKCkpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGlzIHBhdGggYW5kIHRoZSBnaXZlbiBwYXRoIGFyZSBub3QgYm90aCBhYnNvbHV0ZSBvciBib3RoIHJlbGF0aXZlOiAiICsgdG9TdHJpbmcoKSArICIgfCAiICsgb3RoZXIudG9TdHJpbmcoKSk7CisJCWlmIChzdGFydHNXaXRoKG90aGVyKSkgeworCQkJcmV0dXJuIGludGVybmFsUmVsYXRpdml6ZSh0aGlzLCBvdGhlcik7CisJCX0gZWxzZSBpZiAob3RoZXIuc3RhcnRzV2l0aCh0aGlzKSkgeworCQkJcmV0dXJuIGludGVybmFsUmVsYXRpdml6ZShvdGhlciwgdGhpcyk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByaXZhdGUgUGF0aCBpbnRlcm5hbFJlbGF0aXZpemUoUGF0aCBwYXRoLCBQYXRoIHByZWZpeCkgeworCQlyZXR1cm4gbmV3IFBhdGgocGF0aC5nZXRTZWdtZW50cygpLnN1Ykxpc3QocHJlZml4LmdldFNlZ21lbnRzKCkuc2l6ZSgpLCBwYXRoLmdldFNlZ21lbnRzKCkuc2l6ZSgpKSwgZmFsc2UpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhdGggc3RhcnRzIHdpdGggdGhlIHNhbWUgc2VnbWVudHMgYW5kCisJICogaGFzIHRoZSBzYW1lIHtAbGluayAjaXNBYnNvbHV0ZSgpfSB2YWx1ZS4KKwkgKiAKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIHBhdGgsIHdoaWNoIG1pZ2h0IGJlIGEgcHJlZml4IG9mIHRoaXMgcGF0aAorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBhIHByZWZpeCBvZiB0aGlzIHBhdGgKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdGFydHNXaXRoKFBhdGggb3RoZXIpIHsKKwkJaWYgKGlzQWJzb2x1dGUoKSAhPSBvdGhlci5pc0Fic29sdXRlKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCUxpc3Q8U3RyaW5nPiBvdGhlclNlZ21lbnRzID0gb3RoZXIuZ2V0U2VnbWVudHMoKTsKKwkJTGlzdDxTdHJpbmc+IHRoaXNTZWdtZW50cyA9IGdldFNlZ21lbnRzKCk7CisJCWludCBvdGhlclNlZ21lbnRTaXplID0gb3RoZXJTZWdtZW50cy5zaXplKCk7CisJCWludCB0aGlzU2VnbWVudFNpemUgPSB0aGlzU2VnbWVudHMuc2l6ZSgpOworCQlpZiAob3RoZXJTZWdtZW50U2l6ZSA+IHRoaXNTZWdtZW50U2l6ZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXJTZWdtZW50U2l6ZTsgaSsrKSB7CisJCQlTdHJpbmcgb3RoZXJTZWcgPSBvdGhlclNlZ21lbnRzLmdldChpKTsKKwkJCVN0cmluZyB0aGlzU2VnID0gdGhpc1NlZ21lbnRzLmdldChpKTsKKwkJCWlmICghb3RoZXJTZWcuZXF1YWxzKHRoaXNTZWcpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwkJaW50IHJlc3VsdCA9IDE7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKGFic29sdXRlID8gMTIzMSA6IDEyMzcpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdAorCQkJCSsgKChzZWdtZW50cyA9PSBudWxsKSA/IDAgOiBzZWdtZW50cy5oYXNoQ29kZSgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAodGhpcyA9PSBvYmopCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKG9iaiA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJUGF0aCBvdGhlciA9IChQYXRoKSBvYmo7CisJCWlmIChhYnNvbHV0ZSAhPSBvdGhlci5hYnNvbHV0ZSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHNlZ21lbnRzID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5zZWdtZW50cyAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghc2VnbWVudHMuZXF1YWxzKG90aGVyLnNlZ21lbnRzKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJaWYgKGlzQWJzb2x1dGUoKSkgeworCQkJcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7CisJCX0KKwkJaW50IHNpemUgPSBzZWdtZW50cy5zaXplKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlTdHJpbmcgc2VnbWVudCA9IHNlZ21lbnRzLmdldChpKTsKKwkJCXJlc3VsdC5hcHBlbmQoc2VnbWVudCk7CisJCQlpZiAoaSA8IHNpemUtMSkgeworCQkJCXJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisJCisKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL3NlcnZpY2VzL0Fubm90YXRpb25SZWZlcmVuY2VCdWlsZENvbnRleHQuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL3NlcnZpY2VzL0Fubm90YXRpb25SZWZlcmVuY2VCdWlsZENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmY2MDQyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vc2VydmljZXMvQW5ub3RhdGlvblJlZmVyZW5jZUJ1aWxkQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE0IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5zZXJ2aWNlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5FbnVtZXJhdGlvblZhbHVlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLlR5cGVSZWZlcmVuY2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIFNlcnZpY2VzIHByb3ZpZGVkIGR1cmluZyBhbiBhbm5vdGF0aW9uIHJlZmVyZW5jZSBpbml0aWFsaXphdGlvbi4gIAorICogCisgKiBAYXV0aG9yIEFudG9uIEtvc3lha292CisgKiBAc2luY2UgMi42CisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25SZWZlcmVuY2VCdWlsZENvbnRleHQgeworCisJLyoqCisJICogU2V0cyB0aGUgYW5ub3RhdGlvbiBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZQorCSAqIAorCSAqIERlcGVuZGluZyBvZiB0aGUgcmVzcGVjdGl2ZSBhbm5vdGF0aW9uIHR5cGUgZWxlbWVudCwgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKwkgKiBhcmUgcGVybWl0dGVkOgorCSAqIDx1bD4KKwkgKiA8bGk+U2hvcnQgb3Igc2hvcnRbXTwvbGk+CisJICogPGxpPkludGVnZXIgb3IgaW50W108L2xpPgorCSAqIDxsaT5Mb25nIG9yIGxvbmdbXTwvbGk+CisJICogPGxpPkZsb2F0IG9yIGZsb2F0W108L2xpPgorCSAqIDxsaT5Eb3VibGUgb3IgZG91YmxlW108L2xpPgorCSAqIDxsaT5Cb29sZWFuIG9yIGJvb2xlYW5bXTwvbGk+CisJICogPGxpPlR5cGVSZWZlcmVuY2Ugb3IgVHlwZVJlZmVyZW5jZVtdIC0gZm9yIGVsZW1lbnRzIG9mIHR5cGUgQ2xhc3MmbHQ7PyZndDs8L2xpPgorCSAqIDxsaT5Bbm5vdGF0aW9uUmVmZXJlbmNlIG9yIEFubm90YXRpb25SZWZlcmVuY2VbXSAtIGZvciBlbGVtZW50cyBvZiBhbiBhbm5vdGF0aW9uIHR5cGU8L2xpPgorCSAqIDxsaT5FbnVtZXJhdGlvblZhbHVlRGVjbGFyYXRpb24gb3IgRW51bWVyYXRpb25WYWx1ZURlY2xhcmF0aW9uW10gLSBmb3IgZWxlbWVudHMgb2YgYW4gZW51bSB0eXBlPC9saT4KKwkgKiA8bGk+RXhwcmVzc2lvbiAtIGZvciBhbnkgZWxlbWVudCB0eXBlIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbidzIHR5cGU8L2xpPgorCSAqIDxsaT5udWxsIC0gd2lsbCByZW1vdmUgYW55IGV4aXN0aW5nIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBuYW1lPC9saT4KKwkgKiA8L3VsPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIGEgdmFsaWQgbmFtZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUuCisJICogQHBhcmFtIHZhbHVlIGFuIGFubm90YXRpb24gdmFsdWUgb3IgbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiB2YWx1ZSBzaG91bGQgYmUgcmVtb3ZlZC4KKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgICAgIGlmIHRoZSB2YWx1ZSBpcyBub3QgdmFsaWQuIFNlZSBleHBsYW5hdGlvbiBhYm92ZSBvciBpZiB0aGUKKwkgKiAgICAgICAgICAgICAgICBuYW1lIGRvZXMgbm90IGlkZW50aWZ5IGEgbWV0aG9kIGluIHRoZSByZWZlcmVuY2VkCisJICogICAgICAgICAgICAgICAgYW5ub3RhdGlvbiB0eXBlLgorCSAqLworCXZvaWQgc2V0KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpOworCisJLyoqCisJICogU2V0cyB0aGUgZ2l2ZW4gdmFsdWUgZm9yIHRoZSBnaXZlbiBhbm5vdGF0aW9uIGVsZW1lbnQgbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSBhIHZhbGlkIG5hbWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlLgorCSAqIEBwYXJhbSB2YWx1ZSBhIG5vbi1udWxsIHZhbHVlIGFycmF5CisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgbmFtZSBkb2VzIG5vdCBwb2ludCB0byBhIHZhbGlkIG1lbWJlciBvZiB0aGUKKwkgKiAgICAgICAgICAgICByZWZlcmVuY2VkIGFubm90YXRpb24gdHlwZS4KKwkgKi8KKwl2b2lkIHNldEludFZhbHVlKFN0cmluZyBuYW1lLCBpbnQuLi4gdmFsdWUpOworCisJLyoqCisJICogU2V0cyB0aGUgZ2l2ZW4gdmFsdWUgZm9yIHRoZSBnaXZlbiBhbm5vdGF0aW9uIGVsZW1lbnQgbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSBhIHZhbGlkIG5hbWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlLgorCSAqIEBwYXJhbSB2YWx1ZSBhIG5vbi1udWxsIHZhbHVlIGFycmF5CisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgbmFtZSBkb2VzIG5vdCBwb2ludCB0byBhIHZhbGlkIG1lbWJlciBvZiB0aGUKKwkgKiAgICAgICAgICAgICByZWZlcmVuY2VkIGFubm90YXRpb24gdHlwZS4KKwkgKi8KKwl2b2lkIHNldExvbmdWYWx1ZShTdHJpbmcgbmFtZSwgbG9uZy4uLiB2YWx1ZSk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSBnaXZlbiB2YWx1ZSBmb3IgdGhlIGdpdmVuIGFubm90YXRpb24gZWxlbWVudCBuYW1lLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIGEgdmFsaWQgbmFtZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUuCisJICogQHBhcmFtIHZhbHVlIGEgbm9uLW51bGwgdmFsdWUgYXJyYXkKKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBuYW1lIGRvZXMgbm90IHBvaW50IHRvIGEgdmFsaWQgbWVtYmVyIG9mIHRoZQorCSAqICAgICAgICAgICAgIHJlZmVyZW5jZWQgYW5ub3RhdGlvbiB0eXBlLgorCSAqLworCXZvaWQgc2V0U2hvcnRWYWx1ZShTdHJpbmcgbmFtZSwgc2hvcnQuLi4gdmFsdWUpOworCisJLyoqCisJICogU2V0cyB0aGUgZ2l2ZW4gdmFsdWUgZm9yIHRoZSBnaXZlbiBhbm5vdGF0aW9uIGVsZW1lbnQgbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSBhIHZhbGlkIG5hbWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlLgorCSAqIEBwYXJhbSB2YWx1ZSBhIG5vbi1udWxsIHZhbHVlIGFycmF5CisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgbmFtZSBkb2VzIG5vdCBwb2ludCB0byBhIHZhbGlkIG1lbWJlciBvZiB0aGUKKwkgKiAgICAgICAgICAgICByZWZlcmVuY2VkIGFubm90YXRpb24gdHlwZS4KKwkgKi8KKwl2b2lkIHNldERvdWJsZVZhbHVlKFN0cmluZyBuYW1lLCBkb3VibGUuLi4gdmFsdWUpOworCisJLyoqCisJICogU2V0cyB0aGUgZ2l2ZW4gdmFsdWUgZm9yIHRoZSBnaXZlbiBhbm5vdGF0aW9uIGVsZW1lbnQgbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSBhIHZhbGlkIG5hbWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlLgorCSAqIEBwYXJhbSB2YWx1ZSBhIG5vbi1udWxsIHZhbHVlIGFycmF5CisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgbmFtZSBkb2VzIG5vdCBwb2ludCB0byBhIHZhbGlkIG1lbWJlciBvZiB0aGUKKwkgKiAgICAgICAgICAgICByZWZlcmVuY2VkIGFubm90YXRpb24gdHlwZS4KKwkgKi8KKwl2b2lkIHNldEZsb2F0VmFsdWUoU3RyaW5nIG5hbWUsIGZsb2F0Li4uIHZhbHVlKTsKKworCS8qKgorCSAqIFNldHMgdGhlIGdpdmVuIHZhbHVlIGZvciB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiBlbGVtZW50IG5hbWUuCisJICogCisJICogQHBhcmFtIG5hbWUgYSB2YWxpZCBuYW1lIG9mIGEgcHJvcGVydHkgb2YgdGhlIGFubm90YXRpb24gdHlwZS4KKwkgKiBAcGFyYW0gdmFsdWUgYSBub24tbnVsbCB2YWx1ZSBhcnJheQorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIG5hbWUgZG9lcyBub3QgcG9pbnQgdG8gYSB2YWxpZCBtZW1iZXIgb2YgdGhlCisJICogICAgICAgICAgICAgcmVmZXJlbmNlZCBhbm5vdGF0aW9uIHR5cGUuCisJICovCisJdm9pZCBzZXRCeXRlVmFsdWUoU3RyaW5nIG5hbWUsIGJ5dGUuLi4gdmFsdWUpOworCisJLyoqCisJICogU2V0cyB0aGUgZ2l2ZW4gdmFsdWUgZm9yIHRoZSBnaXZlbiBhbm5vdGF0aW9uIGVsZW1lbnQgbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSBhIHZhbGlkIG5hbWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlLgorCSAqIEBwYXJhbSB2YWx1ZSBhIG5vbi1udWxsIHZhbHVlIGFycmF5CisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgbmFtZSBkb2VzIG5vdCBwb2ludCB0byBhIHZhbGlkIG1lbWJlciBvZiB0aGUKKwkgKiAgICAgICAgICAgICByZWZlcmVuY2VkIGFubm90YXRpb24gdHlwZS4KKwkgKi8KKwl2b2lkIHNldEJvb2xlYW5WYWx1ZShTdHJpbmcgbmFtZSwgYm9vbGVhbi4uLiB2YWx1ZSk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSBnaXZlbiB2YWx1ZSBmb3IgdGhlIGdpdmVuIGFubm90YXRpb24gZWxlbWVudCBuYW1lLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIGEgdmFsaWQgbmFtZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUuCisJICogQHBhcmFtIHZhbHVlIGEgbm9uLW51bGwgdmFsdWUgYXJyYXkKKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBuYW1lIGRvZXMgbm90IHBvaW50IHRvIGEgdmFsaWQgbWVtYmVyIG9mIHRoZQorCSAqICAgICAgICAgICAgIHJlZmVyZW5jZWQgYW5ub3RhdGlvbiB0eXBlLgorCSAqLworCXZvaWQgc2V0Q2hhclZhbHVlKFN0cmluZyBuYW1lLCBjaGFyLi4uIHZhbHVlKTsKKworCS8qKgorCSAqIFNldHMgdGhlIGdpdmVuIHZhbHVlIGZvciB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiBlbGVtZW50IG5hbWUuCisJICogCisJICogQHBhcmFtIG5hbWUgYSB2YWxpZCBuYW1lIG9mIGEgcHJvcGVydHkgb2YgdGhlIGFubm90YXRpb24gdHlwZS4KKwkgKiBAcGFyYW0gdmFsdWUgYSBub24tbnVsbCB2YWx1ZSBhcnJheSB3aXRob3V0IGFueSBudWxsIGVudHJpZXMKKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBuYW1lIGRvZXMgbm90IHBvaW50IHRvIGEgdmFsaWQgbWVtYmVyIG9mIHRoZQorCSAqICAgICAgICAgICAgIHJlZmVyZW5jZWQgYW5ub3RhdGlvbiB0eXBlLgorCSAqLworCXZvaWQgc2V0U3RyaW5nVmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZy4uLiB2YWx1ZSk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSBnaXZlbiB2YWx1ZSBmb3IgdGhlIGdpdmVuIGFubm90YXRpb24gZWxlbWVudCBuYW1lLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIGEgdmFsaWQgbmFtZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUuCisJICogQHBhcmFtIHZhbHVlIGEgbm9uLW51bGwgdmFsdWUgYXJyYXkgd2l0aG91dCBhbnkgbnVsbCBlbnRyaWVzCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgbmFtZSBkb2VzIG5vdCBwb2ludCB0byBhIHZhbGlkIG1lbWJlciBvZiB0aGUKKwkgKiAgICAgICAgICAgICByZWZlcmVuY2VkIGFubm90YXRpb24gdHlwZS4KKwkgKi8KKwl2b2lkIHNldENsYXNzVmFsdWUoU3RyaW5nIG5hbWUsIFR5cGVSZWZlcmVuY2UuLi4gdmFsdWUpOworCisJLyoqCisJICogU2V0cyB0aGUgZ2l2ZW4gdmFsdWUgZm9yIHRoZSBnaXZlbiBhbm5vdGF0aW9uIGVsZW1lbnQgbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSBhIHZhbGlkIG5hbWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlLgorCSAqIEBwYXJhbSB2YWx1ZSBhIG5vbi1udWxsIHZhbHVlIGFycmF5IHdpdGhvdXQgYW55IG51bGwgZW50cmllcworCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIG5hbWUgZG9lcyBub3QgcG9pbnQgdG8gYSB2YWxpZCBtZW1iZXIgb2YgdGhlCisJICogICAgICAgICAgICAgcmVmZXJlbmNlZCBhbm5vdGF0aW9uIHR5cGUuCisJICovCisJdm9pZCBzZXRFbnVtVmFsdWUoU3RyaW5nIG5hbWUsIEVudW1lcmF0aW9uVmFsdWVEZWNsYXJhdGlvbi4uLiB2YWx1ZSk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSBnaXZlbiB2YWx1ZSBmb3IgdGhlIGdpdmVuIGFubm90YXRpb24gZWxlbWVudCBuYW1lLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIGEgdmFsaWQgbmFtZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUuCisJICogQHBhcmFtIHZhbHVlIGEgbm9uLW51bGwgdmFsdWUgYXJyYXkgd2l0aG91dCBhbnkgbnVsbCBlbnRyaWVzCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgbmFtZSBkb2VzIG5vdCBwb2ludCB0byBhIHZhbGlkIG1lbWJlciBvZiB0aGUKKwkgKiAgICAgICAgICAgICByZWZlcmVuY2VkIGFubm90YXRpb24gdHlwZS4KKwkgKi8KKwl2b2lkIHNldEFubm90YXRpb25WYWx1ZShTdHJpbmcgbmFtZSwgQW5ub3RhdGlvblJlZmVyZW5jZS4uLiB2YWx1ZSk7CisJCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9zZXJ2aWNlcy9Bbm5vdGF0aW9uUmVmZXJlbmNlUHJvdmlkZXIuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL3NlcnZpY2VzL0Fubm90YXRpb25SZWZlcmVuY2VQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNmQyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9zZXJ2aWNlcy9Bbm5vdGF0aW9uUmVmZXJlbmNlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uQW5ub3RhdGlvblJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogQ3JlYXRlcyB7QGxpbmsgQW5ub3RhdGlvblJlZmVyZW5jZX0gaW5zdGFuY2VzLgorICogCisgKiBAYXV0aG9yIEFudG9uIEtvc3lha292CisgKiBAc2luY2UgMi42CisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25SZWZlcmVuY2VQcm92aWRlciB7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhbm5vdGF0aW9uIHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIG5hbWUuCisJICogIAorCSAqIEBwYXJhbSBhbm5vdGF0aW9uVHlwZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24gdHlwZSB0byBwb2ludCB0bywgbXVzdCBiZSBhIHZhbGlkIGphdmEgaWRlbnRpZmllcgorCSAqIEByZXR1cm4gYSB7QGxpbmsgQW5ub3RhdGlvblJlZmVyZW5jZX0gcG9pbnRpbmcgdG8gdGhlIHR5cGUgd2l0aCB0aGUgZ2l2ZSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGFubm90YXRpb24gdHlwZSBjb3VsZCBiZSBmb3VuZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+bmFtZTwvY29kZT4gaXMgbm90IGEgdmFsaWQgamF2YSBpZGVudGlmaWVyCisJICovCisJQW5ub3RhdGlvblJlZmVyZW5jZSBuZXdBbm5vdGF0aW9uUmVmZXJlbmNlKFN0cmluZyBhbm5vdGF0aW9uVHlwZU5hbWUpOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhbm5vdGF0aW9uIHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIHR5cGUgZGVjbGFyYXRpb24uCisJICogIAorCSAqIEBwYXJhbSBhbm5vdGF0aW9uVHlwZURlbGNhcmF0aW9uIHRoZSBhbm5vdGF0aW9uIHR5cGUgdG8gcG9pbnQgdG8sIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYSB7QGxpbmsgQW5ub3RhdGlvblJlZmVyZW5jZX0gcG9pbnRpbmcgdG8gdGhlIGdpdmVuIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBnaXZlbiB0eXBlIGlzIG5vdCBhbiBhbm5vdGF0aW9uIHR5cGUuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHR5cGUgZGVjbGFyYXRpb24gaXMgbnVsbAorCSAqLworCUFubm90YXRpb25SZWZlcmVuY2UgbmV3QW5ub3RhdGlvblJlZmVyZW5jZShUeXBlIGFubm90YXRpb25UeXBlRGVsY2FyYXRpb24pOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhbm5vdGF0aW9uIHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIHtAbGluayBDbGFzc30uCisJICogIAorCSAqIEBwYXJhbSBhbm5vdGF0aW9uQ2xhc3MgdGhlIHtAbGluayBDbGFzc30gdG8gcG9pbnQgdG8sIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYSB7QGxpbmsgQW5ub3RhdGlvblJlZmVyZW5jZX0gcG9pbnRpbmcgdG8gdGhlIGdpdmVuIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBnaXZlbiB0eXBlIGlzIG5vdCBvbiB0aGUgY2xhc3MgcGF0aCBvZiB0aGUgY29tcGlsZWQgcHJvamVjdCBvciBhbiBhbm5vdGF0aW9uIHR5cGUuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHtAbGluayBDbGFzc30gaXMgbnVsbAorCSAqLworCUFubm90YXRpb25SZWZlcmVuY2UgbmV3QW5ub3RhdGlvblJlZmVyZW5jZShDbGFzczw/PiBhbm5vdGF0aW9uQ2xhc3MpOworCQorCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBhbm5vdGF0aW9uIHJlZmVyZW5jZSBiYXNlIG9uIHRoZSBnaXZlbiBhbm5vdGF0aW9uIHJlZmVyZW5jZS4KKwkgKiAKKwkgKiBAcGFyYW0gYW5ub3RhdGlvblJlZmVyZW5jZSBhbiBhbm5vdGF0aW9uIHJlZmVyZW5jZSB3aGljaCBpcyB1c2VkIGFzIGEgYmFzZSBmb3IgYSBuZXcgYW5ub3RhdGlvbiByZWZlcmVuY2UsIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIGRldGFjaGVkLiAgCisJICogQHJldHVybiBhIHtAbGluayBBbm5vdGF0aW9uUmVmZXJlbmNlfSBjb25zdHJ1Y3RlZCBiYXNlZCBvbiB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiByZWZlcmVuY2UsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhbm5vdGF0aW9uIHJlZmVyZW5jZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBkZXRhY2hlZAorCSAqLworCUFubm90YXRpb25SZWZlcmVuY2UgbmV3QW5ub3RhdGlvblJlZmVyZW5jZShBbm5vdGF0aW9uUmVmZXJlbmNlIGFubm90YXRpb25SZWZlcmVuY2UpOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYW5ub3RhdGlvbiByZWZlcmVuY2UgZm9yIHRoZSBnaXZlbiBuYW1lLgorCSAqICAKKwkgKiBAcGFyYW0gYW5ub3RhdGlvblR5cGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgdG8gcG9pbnQgdG8KKwkgKiBAcGFyYW0gaW5pdGlhbGl6ZXIgYSBjYWxsYmFjayBmb3IgZnVydGhlciBpbml0aWFsaXphdGlvbiBvZiB0aGUgY3JlYXRlIGFubm90YXRpb24gcmVmZXJlbmNlLCBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGEge0BsaW5rIEFubm90YXRpb25SZWZlcmVuY2V9IHBvaW50aW5nIHRvIHRoZSB0eXBlIHdpdGggdGhlIGdpdmUgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBhbm5vdGF0aW9uIHR5cGUgY291bGQgYmUgZm91bmQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIDxjb2RlPm5hbWU8L2NvZGU+IGlzIG5vdCBhIHZhbGlkIGphdmEgaWRlbnRpZmllciBvciB0aGUgPGNvZGU+aW5pdGlhbGl6ZXI8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJQW5ub3RhdGlvblJlZmVyZW5jZSBuZXdBbm5vdGF0aW9uUmVmZXJlbmNlKFN0cmluZyBhbm5vdGF0aW9uVHlwZU5hbWUsIFByb2NlZHVyZXMuUHJvY2VkdXJlMTxBbm5vdGF0aW9uUmVmZXJlbmNlQnVpbGRDb250ZXh0PiBpbml0aWFsaXplcik7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhbm5vdGF0aW9uIHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIHR5cGUgZGVjbGFyYXRpb24uCisJICogIAorCSAqIEBwYXJhbSBhbm5vdGF0aW9uVHlwZURlbGNhcmF0aW9uIHRoZSBhbm5vdGF0aW9uIHR5cGUgdG8gcG9pbnQgdG8sIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBpbml0aWFsaXplciBhIGNhbGxiYWNrIGZvciBmdXJ0aGVyIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjcmVhdGUgYW5ub3RhdGlvbiByZWZlcmVuY2UsIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYSB7QGxpbmsgQW5ub3RhdGlvblJlZmVyZW5jZX0gcG9pbnRpbmcgdG8gdGhlIGdpdmVuIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBnaXZlbiB0eXBlIGlzIG5vdCBhbiBhbm5vdGF0aW9uIHR5cGUuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHR5cGUgZGVjbGFyYXRpb24gaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlIDxjb2RlPmluaXRpYWxpemVyPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCUFubm90YXRpb25SZWZlcmVuY2UgbmV3QW5ub3RhdGlvblJlZmVyZW5jZShUeXBlIGFubm90YXRpb25UeXBlRGVsY2FyYXRpb24sIFByb2NlZHVyZXMuUHJvY2VkdXJlMTxBbm5vdGF0aW9uUmVmZXJlbmNlQnVpbGRDb250ZXh0PiBpbml0aWFsaXplcik7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhbm5vdGF0aW9uIHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIHtAbGluayBDbGFzc30uCisJICogIAorCSAqIEBwYXJhbSBhbm5vdGF0aW9uQ2xhc3MgdGhlIHtAbGluayBDbGFzc30gdG8gcG9pbnQgdG8sIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBpbml0aWFsaXplciBhIGNhbGxiYWNrIGZvciBmdXJ0aGVyIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjcmVhdGUgYW5ub3RhdGlvbiByZWZlcmVuY2UsIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYSB7QGxpbmsgQW5ub3RhdGlvblJlZmVyZW5jZX0gcG9pbnRpbmcgdG8gdGhlIGdpdmVuIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBnaXZlbiB0eXBlIGlzIG5vdCBvbiB0aGUgY2xhc3MgcGF0aCBvZiB0aGUgY29tcGlsZWQgcHJvamVjdCBvciBhbiBhbm5vdGF0aW9uIHR5cGUuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHtAbGluayBDbGFzc30gaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlIDxjb2RlPmluaXRpYWxpemVyPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCUFubm90YXRpb25SZWZlcmVuY2UgbmV3QW5ub3RhdGlvblJlZmVyZW5jZShDbGFzczw/PiBhbm5vdGF0aW9uQ2xhc3MsIFByb2NlZHVyZXMuUHJvY2VkdXJlMTxBbm5vdGF0aW9uUmVmZXJlbmNlQnVpbGRDb250ZXh0PiBpbml0aWFsaXplcik7CisJCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IGFubm90YXRpb24gcmVmZXJlbmNlIGJhc2Ugb24gdGhlIGdpdmVuIGFubm90YXRpb24gcmVmZXJlbmNlLgorCSAqIAorCSAqIEBwYXJhbSBhbm5vdGF0aW9uUmVmZXJlbmNlIGFuIGFubm90YXRpb24gcmVmZXJlbmNlIHdoaWNoIGlzIHVzZWQgYXMgYSBiYXNlIGZvciBhIG5ldyBhbm5vdGF0aW9uIHJlZmVyZW5jZSwgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gb3IgZGV0YWNoZWQuIAorCSAqIEBwYXJhbSBpbml0aWFsaXplciBhIGNhbGxiYWNrIGZvciBmdXJ0aGVyIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjcmVhdGUgYW5ub3RhdGlvbiByZWZlcmVuY2UsIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYSB7QGxpbmsgQW5ub3RhdGlvblJlZmVyZW5jZX0gY29uc3RydWN0ZWQgYmFzZWQgb24gdGhlIGdpdmVuIGFubm90YXRpb24gcmVmZXJlbmNlLCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGFubm90YXRpb24gcmVmZXJlbmNlIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGRldGFjaGVkOyBvciB0aGUgPGNvZGU+aW5pdGlhbGl6ZXI8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJQW5ub3RhdGlvblJlZmVyZW5jZSBuZXdBbm5vdGF0aW9uUmVmZXJlbmNlKEFubm90YXRpb25SZWZlcmVuY2UgYW5ub3RhdGlvblJlZmVyZW5jZSwgUHJvY2VkdXJlcy5Qcm9jZWR1cmUxPEFubm90YXRpb25SZWZlcmVuY2VCdWlsZENvbnRleHQ+IGluaXRpYWxpemVyKTsKKwkKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL3NlcnZpY2VzL0Fzc29jaWF0b3IuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL3NlcnZpY2VzL0Fzc29jaWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjM3MGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vc2VydmljZXMvQXNzb2NpYXRvci5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLnNlcnZpY2VzOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVFbGVtZW50OworCisvKioKKyAqIEFzc29jaWF0ZXMgZ2VuZXJhdGVkIEphdmEgZWxlbWVudHMgd2l0aCB0aGVpciBzb3VyY2UgWHRlbmQgZWxlbWVudHMgCisgKiBAc2luY2UgMi43CisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiBAc2VlIFRyYWNhYmlsaXR5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXNzb2NpYXRvciB7CisJLyoqCisJICogQXNzb2NpYXRlcyB0aGUgZ2VuZXJhdGUgZWxlbWVudCB3aXRoIHRoZSBYdGVuZCBzb3VyY2UgY29kZS4gRXZlcnkgZ2VuZXJhdGVkIGVsZW1lbnQgc2hvdWxkIGhhdmUKKwkgKiBhIHNvdXJjZSBlbGVtZW50LiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgZmVhdHVyZXMgbGlrZSAiR28gdG8gRGVjbGFyYXRpb24iIGFuZCB0aGUgb3V0bGluZSB2aWV3LgorCSAqIEEgdHlwaWNhbCB1c2UgY2FzZSAoZ2VuZXJhdGluZyBhIGdldHRlciBmb3IgYSBmaWVsZCkgd291bGQgbG9vayBsaWtlIHRoaXM6CisJICogCisJICogPHByZT4KKwkgKiBteUNsYXNzLmRlY2xhcmVkRmllbGRzLmZvckVhY2hbZmllbGR8CisJICogIG15Q2xhc3MuYWRkTWV0aG9kKCJnZXQiICsgZmllbGQuc2ltcGxlTmFtZS50b0ZpcnN0VXBwZXIpIFsKKwkgKiAgIHByaW1hcnlTb3VyY2VFbGVtZW50ID0gZmllbGQKKwkgKiAgIC8vIHJldHVybiB0eXBlLCBib2R5IGV0Yy4uLgorCSAqICBdCisJICogXQorCSAqIDwvcHJlPgorCSAqIAorCSAqIFRoaXMgd2F5LCB0aGUgZ2V0dGVyIGdlbmVyYXRlZCBpbiB0aGUgYWN0aXZlIGFubm90YXRpb24gYWJvdmUgd291bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWVsZCBpbiB0aGUgWHRlbmQgc291cmNlIGNvZGUuCisJICogTm90aWNlIHRoYXQgd2UgcGFzc2VkIHRoZSBmaWVsZCBmcm9tIHRoZSBKYXZhIEFTVCBhcyBhIHNvdXJjZSBlbGVtZW50LiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yCisJICogCisJICogPHByZT4KKwkgKiBwcmltYXJ5U291cmNlRWxlbWVudCA9IGZpZWxkLnByaW1hcnlTb3VyY2VFbGVtZW50CisJICogPC9wcmU+CisJICogCisJICogQHBhcmFtIHNvdXJjZUVsZW1lbnQgdGhlIHNvdXJjZSBlbGVtZW50IHRoYXQgdGhlIHNlY29uZGFyeUVsZW1lbnQgd2FzIGRlcml2ZWQgZnJvbQorCSAqIEBwYXJhbSBqYXZhRWxlbWVudCB0aGUgZ2VuZXJhdGVkIEphdmEgZWxlbWVudCAKKwkgKi8KKwl2b2lkIHNldFByaW1hcnlTb3VyY2VFbGVtZW50KE11dGFibGVFbGVtZW50IGphdmFFbGVtZW50LCBFbGVtZW50IHNvdXJjZUVsZW1lbnQpOworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vc2VydmljZXMvR2xvYmFsVHlwZUxvb2t1cC5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vc2VydmljZXMvR2xvYmFsVHlwZUxvb2t1cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTI4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9zZXJ2aWNlcy9HbG9iYWxUeXBlTG9va3VwLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVHlwZTsKKworLyoqCisgKiBAc2luY2UgMi44CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgR2xvYmFsVHlwZUxvb2t1cCB7CisKKwkvKioKKwkgKiBAcGFyYW0gY2xhenoKKwkgKiAgICAgICAgICAgIHRoZSBjbGF6eiByZXByZXNlbnRpbmcgdGhlIHR5cGUgdG8gbG9vayB1cAorCSAqIEByZXR1cm4gdGhlIHR5cGUgd2l0aCB0aGUgc2FtZSBxdWFsaWZpZWQgbmFtZSBhcyB0aGUgZ2l2ZW4KKwkgKiAgICAgICAgIDxjb2RlPkNsYXNzPC9jb2RlPiBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoYXQgdHlwZQorCSAqICAgICAgICAgY291bGRuJ3QgYmUgZm91bmQgb24gdGhlIGNvbXBpbGF0aW9uIHVuaXRzIGNsYXNzcGF0aC4KKwkgKi8KKwlUeXBlIGZpbmRUeXBlR2xvYmFsbHkoQ2xhc3M8Pz4gY2xhenopOworCisJLyoqCisJICogQHBhcmFtIHR5cGVOYW1lCisJICogICAgICAgICAgICB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUgdG8gbG9vayB1cC4gTmVzdGVkIGNsYXNzIGRlbGltaXRlciBpcyBleHBlY3RlZCB0byBiZSB0aGUgJy4nIChkb3QpLgorCSAqIEByZXR1cm4gdGhlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gcXVhbGlmaWVkIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHN1Y2ggYSB0eXBlCisJICogICAgICAgICBjb3VsZG4ndCBiZSBmb3VuZCBvbiB0aGUgY29tcGlsYXRpb24gdW5pdHMgY2xhc3NwYXRoLgorCSAqLworCVR5cGUgZmluZFR5cGVHbG9iYWxseShTdHJpbmcgdHlwZU5hbWUpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vc2VydmljZXMvUHJvYmxlbS5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vc2VydmljZXMvUHJvYmxlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YmFlMjEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9zZXJ2aWNlcy9Qcm9ibGVtLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBjb21waWxlciBwcm9ibGVtIG9yIHdhcm5pbmcuCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBQcm9ibGVtIHsKKwkKKwkvKioKKwkgKiBUaGUgc2V2ZXJpdHkgb2YgYSBwcm9ibGVtIAorCSAqLworCWVudW0gU2V2ZXJpdHkgeworCQlFUlJPUiwgV0FSTklORywgSU5GTywgSUdOT1JFCisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHByb2JsZW0ga2luZCBpZGVudGlmaWVyLgorCSAqLworCVN0cmluZyBnZXRJZCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHVzZXIgbWVzc2FnZSBvZiB0aGUgcHJvYmxlbQorCSAqLworCVN0cmluZyBnZXRNZXNzYWdlKCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgcHJvYmxlbSdzIHNldmVyaXR5CisJICovCisJU2V2ZXJpdHkgZ2V0U2V2ZXJpdHkoKTsKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL3NlcnZpY2VzL1Byb2JsZW1TdXBwb3J0LmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9zZXJ2aWNlcy9Qcm9ibGVtU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZTMzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9zZXJ2aWNlcy9Qcm9ibGVtU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLnNlcnZpY2VzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXMuUHJvYmxlbS5TZXZlcml0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogU3VwcG9ydCBmb3IgbG9va2luZyB1cCBhbmQgY3JlYXRpbmcgbmV3IHtAbGluayBQcm9ibGVtfSBtYXJrZXJzIG9uIHtAbGluayBFbGVtZW50fXMKKyAqIAorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIFByb2JsZW1TdXBwb3J0IHsKKwkvKioKKwkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBsb29rIHVwIHByb2JsZW1zCisJICogQHJldHVybiB0aGUgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgRWxlbWVudH0KKwkgKi8KKwlMaXN0PD8gZXh0ZW5kcyBQcm9ibGVtPiBnZXRQcm9ibGVtcyhFbGVtZW50IGVsZW1lbnQpOworCQorCS8qKgorCSAqIEFkZHMgYSBwcm9ibGVtIG1hcmtlciB3aXRoIHNldmVyaXR5IHtAbGluayBTZXZlcml0eX0jRVJST1IgdG8gdGhlIGdpdmVuIGVsZW1lbnQKKwkgKiAKKwkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byB3aGljaCBhc3NvY2lhdGUgdGhlIG5ldyBwcm9ibGVtIG1hcmtlcgorCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIGZvciB0aGUgcHJvYmxlbSBtYXJrZXIKKwkgKi8KKwl2b2lkIGFkZEVycm9yKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG1lc3NhZ2UpOworCQorCS8qKgorCSAqIEFkZHMgYSBwcm9ibGVtIG1hcmtlciB3aXRoIHNldmVyaXR5IHtAbGluayBTZXZlcml0eX0jV0FSTklORyB0byB0aGUgZ2l2ZW4gZWxlbWVudAorCSAqIAorCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIHdoaWNoIGFzc29jaWF0ZSB0aGUgbmV3IHByb2JsZW0gbWFya2VyCisJICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgZm9yIHRoZSBwcm9ibGVtIG1hcmtlcgorCSAqLworCXZvaWQgYWRkV2FybmluZyhFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBtZXNzYWdlKTsKKworCS8qKgorCSAqIEBwYXJhbSB2YWxpZGF0aW9uQ2FsbGJhY2sKKwkgKiAgICAgICAgICAgIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSB2YWxpZGF0aW9uIHBoYXNlLCB3aGVuCisJICogICAgICAgICAgICBhbGwgdHJhbnNmb3JtYXRpb25zIGhhdmUgYmVlbiBkb25lIGFuZCB0eXBlcyBhcmUgaW5mZXJyZWQuCisJICogQHNpbmNlIDIuNworCSAqLworCXZvaWQgdmFsaWRhdGVMYXRlcihQcm9jZWR1cmVzLlByb2NlZHVyZTAgdmFsaWRhdGlvbkNhbGxiYWNrKTsKK30KKwpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vc2VydmljZXMvU291cmNlVHlwZUxvb2t1cC5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vc2VydmljZXMvU291cmNlVHlwZUxvb2t1cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0Y2EzODkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9zZXJ2aWNlcy9Tb3VyY2VUeXBlTG9va3VwLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5FbnVtZXJhdGlvblR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uSW50ZXJmYWNlRGVjbGFyYXRpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIEZhY2lsaXRpZXMgdG8gbG9va3VwIFh0ZW5kIHR5cGUgZGVjbGFyYXRpb25zIGRlY2xhcmVkIHdpdGhpbiB0aGUgY3VycmVudGx5CisgKiBwcm9jZXNzZWQge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0uCisgKiAKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgU291cmNlVHlwZUxvb2t1cCB7CisKKwkvKioKKwkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZQorCSAqICAgICAgICAgICAgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlIHRvIGxvb2sgdXAuIE5lc3RlZCBjbGFzcyBkZWxpbWl0ZXIgaXMgZXhwZWN0ZWQgdG8gYmUgdGhlICcuJyAoZG90KS4KKwkgKiBAcmV0dXJuIHRoZSA8Y29kZT5DbGFzc0RlY2xhcmF0aW9uPC9jb2RlPiB3aXRoIGdpdmVuIHF1YWxpZmllZAorCSAqICAgICAgICAgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBjbGFzcyBkZWNsYXJhdGlvbiBpcworCSAqICAgICAgICAgY29udGFpbmVkIGluIHRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIDxjb2RlPkNvbXBpbGF0aW9uVW5pdDwvY29kZT4KKwkgKi8KKwlDbGFzc0RlY2xhcmF0aW9uIGZpbmRTb3VyY2VDbGFzcyhTdHJpbmcgcXVhbGlmaWVkTmFtZSk7CisKKwkvKioKKwkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZQorCSAqICAgICAgICAgICAgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlIHRvIGxvb2sgdXAuIE5lc3RlZCBjbGFzcyBkZWxpbWl0ZXIgaXMgZXhwZWN0ZWQgdG8gYmUgdGhlICcuJyAoZG90KS4KKwkgKiBAcmV0dXJuIHRoZSA8Y29kZT5JbnRlcmZhY2VEZWNsYXJhdGlvbjwvY29kZT4gd2l0aCBnaXZlbiBxdWFsaWZpZWQKKwkgKiAgICAgICAgIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggaW50ZXJmYWNlIGRlY2xhcmF0aW9uIGlzCisJICogICAgICAgICBjb250YWluZWQgaW4gdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQgPGNvZGU+Q29tcGlsYXRpb25Vbml0PC9jb2RlPgorCSAqLworCUludGVyZmFjZURlY2xhcmF0aW9uIGZpbmRTb3VyY2VJbnRlcmZhY2UoU3RyaW5nIHF1YWxpZmllZE5hbWUpOworCisJLyoqCisJICogQHBhcmFtIHF1YWxpZmllZE5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdHlwZSB0byBsb29rIHVwLiBOZXN0ZWQgY2xhc3MgZGVsaW1pdGVyIGlzIGV4cGVjdGVkIHRvIGJlIHRoZSAnLicgKGRvdCkuCisJICogQHJldHVybiB0aGUgPGNvZGU+RW51bWVyYXRpb25UeXBlRGVjbGFyYXRpb248L2NvZGU+IHdpdGggZ2l2ZW4KKwkgKiAgICAgICAgIHF1YWxpZmllZCBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGNsYXNzIGRlY2xhcmF0aW9uCisJICogICAgICAgICBpcyBjb250YWluZWQgaW4gdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQKKwkgKiAgICAgICAgIDxjb2RlPkNvbXBpbGF0aW9uVW5pdDwvY29kZT4KKwkgKi8KKwlFbnVtZXJhdGlvblR5cGVEZWNsYXJhdGlvbiBmaW5kU291cmNlRW51bWVyYXRpb25UeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lKTsKKworCS8qKgorCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lCisJICogICAgICAgICAgICB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUgdG8gbG9vayB1cC4gTmVzdGVkIGNsYXNzIGRlbGltaXRlciBpcyBleHBlY3RlZCB0byBiZSB0aGUgJy4nIChkb3QpLgorCSAqIEByZXR1cm4gdGhlIDxjb2RlPkFubm90YXRpb25UeXBlRGVjbGFyYXRpb248L2NvZGU+IHdpdGggZ2l2ZW4KKwkgKiAgICAgICAgIHF1YWxpZmllZCBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGNsYXNzIGRlY2xhcmF0aW9uCisJICogICAgICAgICBpcyBjb250YWluZWQgaW4gdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQKKwkgKiAgICAgICAgIDxjb2RlPkNvbXBpbGF0aW9uVW5pdDwvY29kZT4KKwkgKi8KKwlBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGZpbmRTb3VyY2VBbm5vdGF0aW9uVHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSk7Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9zZXJ2aWNlcy9UcmFjYWJpbGl0eS5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vc2VydmljZXMvVHJhY2FiaWxpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODViZDRhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vc2VydmljZXMvVHJhY2FiaWxpdHkuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEzIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5zZXJ2aWNlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkVsZW1lbnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIAorICogU3VwcG9ydCBmb3IgbmF2aWdhdGluZyBiZXR3ZWVuIHRoZSBwcmltYXJ5IEFTVCBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBYdGVuZCBjb2RlCisgKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSBlbGVtZW50cyBkZXJpdmVkIGZyb20gdGhhdC4KKyAqIAorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiBAc2VlIEFzc29jaWF0b3IKKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgVHJhY2FiaWxpdHkgeworCS8qKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogQHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBlbGVtZW50IGlzIGEgc291cmNlIChpLmUgWHRlbmQpIGVsZW1lbnQuCisJICogQHNpbmNlIDIuNworCSAqLworCWJvb2xlYW4gaXNTb3VyY2UoRWxlbWVudCBlbGVtZW50KTsKKwkKKwkvKioKKwkgKiBAcGFyYW0gZWxlbWVudAorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBhIEphdmEgZWxlbWVudCBkZXJpdmVkIGZyb20gdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0KKwkgKiBAc2luY2UgMi43CisJICovCisJYm9vbGVhbiBpc0dlbmVyYXRlZChFbGVtZW50IGVsZW1lbnQpOworCQorCS8qKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICogQHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBlbGVtZW50IGlzIGEgSmF2YSBlbGVtZW50IDxiPm5vdDwvYj4gZGVyaXZlZCBmcm9tIHRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIHtAbGluayBDb21waWxhdGlvblVuaXR9CisJICogQHNpbmNlIDIuNworCSAqLworCWJvb2xlYW4gaXNFeHRlcm5hbChFbGVtZW50IGVsZW1lbnQpOworCQorCS8qKgorCSAqIEBwYXJhbSBzb3VyY2UKKwkgKiBAcmV0dXJuIHRoZSBwcmltYXJ5IGdlbmVyYXRlZCBlbGVtZW50IChKYXZhKSBkZXJpdmVkIGZyb20gdGhlIGdpdmVuIHNvdXJjZSBlbGVtZW50IChYdGVuZCkuCisJICogQHNpbmNlIDIuNworCSAqLworCUVsZW1lbnQgZ2V0UHJpbWFyeUdlbmVyYXRlZEphdmFFbGVtZW50KEVsZW1lbnQgc291cmNlKTsKKwkvKioKKwkgKiBAc2luY2UgMi43CisJICogQHBhcmFtIHRhcmdldAorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGVsZW1lbnQgd2FzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgWHRlbmQgc291cmNlIEFTVC4KKwkgKi8KKwlib29sZWFuIGlzVGhlUHJpbWFyeUdlbmVyYXRlZEphdmFFbGVtZW50KEVsZW1lbnQgdGFyZ2V0KTsKKwkKKwkvKioKKwkgKiBAcGFyYW0gdGFyZ2V0CisJICogQHJldHVybiB0aGUgc291cmNlIGVsZW1lbnQgKFh0ZW5kKSB0aGUgZ2l2ZW4gdGFyZ2V0IChKYXZhKSBlbGVtZW50IGlzIGRlcml2ZWQgZnJvbQorCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlFbGVtZW50IGdldFByaW1hcnlTb3VyY2VFbGVtZW50KEVsZW1lbnQgdGFyZ2V0KTsKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL3NlcnZpY2VzL1R5cGVMb29rdXAuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL3NlcnZpY2VzL1R5cGVMb29rdXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDlkNjNiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vc2VydmljZXMvVHlwZUxvb2t1cC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLnNlcnZpY2VzOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uTXV0YWJsZUFubm90YXRpb25UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5NdXRhYmxlRW51bWVyYXRpb25UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVJbnRlcmZhY2VEZWNsYXJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogRmFjaWxpdGllcyB0byBsb29rdXAgSmF2YSB0eXBlIGRlY2xhcmF0aW9ucyBnZW5lcmF0ZWQgd2l0aGluIHRoZSBjdXJyZW50bHkKKyAqIHByb2Nlc3NlZCB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSBhcyB3ZWxsIGFzIG9uIHRoZSBjbGFzc3BhdGggb2YgdGhhdCA8Y29kZT5Db21waWxhdGlvblVuaXQ8L2NvZGU+LgorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworQEJldGEKK3B1YmxpYyBpbnRlcmZhY2UgVHlwZUxvb2t1cCBleHRlbmRzIEdsb2JhbFR5cGVMb29rdXAgeworCisJLyoqCisJICogQHBhcmFtIHF1YWxpZmllZE5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdHlwZSB0byBsb29rIHVwLiBOZXN0ZWQgY2xhc3MgZGVsaW1pdGVyIGlzIGV4cGVjdGVkIHRvIGJlIHRoZSAnLicgKGRvdCkuCisJICogQHJldHVybiB0aGUgPGNvZGU+TXV0YWJsZUNsYXNzRGVjbGFyYXRpb248L2NvZGU+IHdpdGggZ2l2ZW4gcXVhbGlmaWVkCisJICogICAgICAgICBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGNsYXNzIGRlY2xhcmF0aW9uIGlzCisJICogICAgICAgICBjb250YWluZWQgaW4gdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQgPGNvZGU+Q29tcGlsYXRpb25Vbml0PC9jb2RlPgorCSAqLworCU11dGFibGVDbGFzc0RlY2xhcmF0aW9uIGZpbmRDbGFzcyhTdHJpbmcgcXVhbGlmaWVkTmFtZSk7CisKKwkvKioKKwkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZQorCSAqICAgICAgICAgICAgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlIHRvIGxvb2sgdXAuIE5lc3RlZCBjbGFzcyBkZWxpbWl0ZXIgaXMgZXhwZWN0ZWQgdG8gYmUgdGhlICcuJyAoZG90KS4KKwkgKiBAcmV0dXJuIHRoZSA8Y29kZT5NdXRhYmxlSW50ZXJmYWNlRGVjbGFyYXRpb248L2NvZGU+IHdpdGggZ2l2ZW4gcXVhbGlmaWVkCisJICogICAgICAgICBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGludGVyZmFjZSBkZWNsYXJhdGlvbiBpcworCSAqICAgICAgICAgY29udGFpbmVkIGluIHRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIDxjb2RlPkNvbXBpbGF0aW9uVW5pdDwvY29kZT4KKwkgKi8KKwlNdXRhYmxlSW50ZXJmYWNlRGVjbGFyYXRpb24gZmluZEludGVyZmFjZShTdHJpbmcgcXVhbGlmaWVkTmFtZSk7CisKKwkvKioKKwkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZQorCSAqICAgICAgICAgICAgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlIHRvIGxvb2sgdXAuIE5lc3RlZCBjbGFzcyBkZWxpbWl0ZXIgaXMgZXhwZWN0ZWQgdG8gYmUgdGhlICcuJyAoZG90KS4KKwkgKiBAcmV0dXJuIHRoZSA8Y29kZT5NdXRhYmxlRW51bWVyYXRpb25UeXBlRGVjbGFyYXRpb248L2NvZGU+IHdpdGggZ2l2ZW4KKwkgKiAgICAgICAgIHF1YWxpZmllZCBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGNsYXNzIGRlY2xhcmF0aW9uCisJICogICAgICAgICBpcyBjb250YWluZWQgaW4gdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQKKwkgKiAgICAgICAgIDxjb2RlPkNvbXBpbGF0aW9uVW5pdDwvY29kZT4KKwkgKi8KKwlNdXRhYmxlRW51bWVyYXRpb25UeXBlRGVjbGFyYXRpb24gZmluZEVudW1lcmF0aW9uVHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSk7CisKKwkvKioKKwkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZQorCSAqICAgICAgICAgICAgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlIHRvIGxvb2sgdXAuIE5lc3RlZCBjbGFzcyBkZWxpbWl0ZXIgaXMgZXhwZWN0ZWQgdG8gYmUgdGhlICcuJyAoZG90KS4KKwkgKiBAcmV0dXJuIHRoZSA8Y29kZT5NdXRhYmxlQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjwvY29kZT4gd2l0aCBnaXZlbgorCSAqICAgICAgICAgcXVhbGlmaWVkIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggY2xhc3MgZGVjbGFyYXRpb24KKwkgKiAgICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgY3VycmVudGx5IHByb2Nlc3NlZAorCSAqICAgICAgICAgPGNvZGU+Q29tcGlsYXRpb25Vbml0PC9jb2RlPgorCSAqLworCU11dGFibGVBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGZpbmRBbm5vdGF0aW9uVHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSk7Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9zZXJ2aWNlcy9UeXBlUmVmZXJlbmNlUHJvdmlkZXIuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL3NlcnZpY2VzL1R5cGVSZWZlcmVuY2VQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMmFhNjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9tYWNyby9zZXJ2aWNlcy9UeXBlUmVmZXJlbmNlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uc2VydmljZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLlR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLlR5cGVSZWZlcmVuY2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIFByb3ZpZGVzIGFuZCBjcmVhdGVzIHtAbGluayBUeXBlUmVmZXJlbmNlfSBpbnN0YW5jZXMuCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitAQmV0YQorcHVibGljIGludGVyZmFjZSBUeXBlUmVmZXJlbmNlUHJvdmlkZXIgeworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgdHlwZSByZWZlcmVuY2UgdXNpbmcgdGhlIGdpdmVuIGNvbXBvbmVudCB0eXBlLgorCSAqIElmIHRoZSBjb21wb25lbnQgdHlwZSBpcyBpdHNlbGYgYW4gYXJyYXkgdGhpcyBtZXRob2QgYWRkcyBhIGRpbWVuc2lvbi4KKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50VHlwZSB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhlIGFycmF5IHR5cGUgcmVmZXJlbmNlCisJICogQHJldHVybiBhbiBhcnJheSB0eXBlIHJlZmVyZW5jZQorCSAqLworCVR5cGVSZWZlcmVuY2UgbmV3QXJyYXlUeXBlUmVmZXJlbmNlKFR5cGVSZWZlcmVuY2UgY29tcG9uZW50VHlwZSk7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB0eXBlIHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIG5hbWUgYW5kIHRoZSBnaXZlbiB0eXBlIGFyZ3VtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHR5cGUgdG8gcG9pbnQgdG8KKwkgKiBAcGFyYW0gdHlwZUFyZ3VtZW50cyB0aGUgdHlwZSBhcmd1bWVudHMKKwkgKiBAcmV0dXJuIGEge0BsaW5rIFR5cGVSZWZlcmVuY2V9IHBvaW50aW5nIHRvIHRoZSB0eXBlIHdpdGggZ2l2ZW4gbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCB0eXBlIGNvdWxkIGJlIGZvdW5kLgorCSAqLworCVR5cGVSZWZlcmVuY2UgbmV3VHlwZVJlZmVyZW5jZShTdHJpbmcgdHlwZU5hbWUsIFR5cGVSZWZlcmVuY2UuLi4gdHlwZUFyZ3VtZW50cyk7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB0eXBlIHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIHR5cGVEZWNsYXJhdGlvbiBhbmQgdGhlIHR5cGUgYXJndW1lbnRzLgorCSAqIAorCSAqIEBwYXJhbSB0eXBlRGVjbGFyYXRpb24gdGhlIHR5cGUgdG8gcG9pbnQgdG8KKwkgKiBAcGFyYW0gdHlwZUFyZ3VtZW50cyB0aGUgdHlwZSBhcmd1bWVudHMKKwkgKiBAcmV0dXJuIGEge0BsaW5rIFR5cGVSZWZlcmVuY2V9IHBvaW50aW5nIHRvIHRoZSBnaXZlbiB0eXBlLgorCSAqLworCVR5cGVSZWZlcmVuY2UgbmV3VHlwZVJlZmVyZW5jZShUeXBlIHR5cGVEZWNsYXJhdGlvbiwgVHlwZVJlZmVyZW5jZS4uLiB0eXBlQXJndW1lbnRzKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IHNlbGYgdHlwZSByZWZlcmVuY2UgZm9yIHRoZSBnaXZlbiB0eXBlRGVjbGFyYXRpb24sIGUuZy4gaWYgeW91IGhhdmUgYSBjbGFzcyBsaWtlCisJICogCisJICogPHByZT4KKwkgKiAgY2xhc3MgRm9vJmx0O1QmZ3Q7IHt9CisJICogPC9wcmU+CisJICogCisJICogQW5kIHlvdSB3YW50IHRvIGFkZCBhIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIGluc3RhbmNlIGl0c2VsZiwgeW91IHdvdWxkIHVzZSB0aGUgc2VsZiB0eXBlIGFzIHRoZSBtZXRob2QncyByZXR1cm4gdHlwZS4KKwkgKiAKKwkgKiA8cHJlPgorCSAqIGNsYXNzIEZvbyZsdDtUJmd0OyB7CisJICogIGRlZiBGb28mbHQ7VCZndDsgbXlTZWxmKCkgeworCSAqICAgdGhpcworCSAqICB9CisJICogfQorCSAqIDwvcHJlPgorCSAqIAorCSAqIEluIGNvbnRyYXN0LCB7QGxpbmsgI25ld1R5cGVSZWZlcmVuY2UoVHlwZSwgVHlwZVJlZmVyZW5jZS4uLil9IHdpdGhvdXQgYW55IGFyZ3VtZW50cyB3b3VsZCByZXR1cm4gdGhlIHJhdyB0eXBlIG9ubHkgYW5kIHdvdWxkIHJlc3VsdCBpbiBjb2RlIHdpdGggd2FybmluZ3M6CisJICogPHByZT4KKwkgKiBjbGFzcyBGb28mbHQ7VCZndDsgeworCSAqICBkZWYgRm9vIG15U2VsZigpIHsKKwkgKiAgIHRoaXMKKwkgKiAgfQorCSAqIH0KKwkgKiA8L3ByZT4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZURlY2xhcmF0aW9uIHRoZSByYXcgdHlwZSBmb3IgdGhlIG5ld2x5IHByb2R1Y2VkIHJlZmVyZW5jZQorCSAqIEByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGdpdmVuIHR5cGUgZGVjbGFyYXRpb24KKwkgKiBAc2luY2UgMi43CisJICovCisJVHlwZVJlZmVyZW5jZSBuZXdTZWxmVHlwZVJlZmVyZW5jZShUeXBlIHR5cGVEZWNsYXJhdGlvbik7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB0eXBlIHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIDxjb2RlPkNsYXNzPC9jb2RlPiBhbmQgdGhlIHR5cGUgYXJndW1lbnRzLgorCSAqIAorCSAqIEBwYXJhbSBjbGF6eiB0aGUgY2xhenogdG8gcG9pbnQgdG8KKwkgKiBAcGFyYW0gdHlwZUFyZ3VtZW50cyB0aGUgdHlwZSBhcmd1bWVudHMKKwkgKiBAcmV0dXJuIGEge0BsaW5rIFR5cGVSZWZlcmVuY2V9IHBvaW50aW5nIHRvIHRoZSBnaXZlbiB0eXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB0eXBlIGlzIG5vdCBvbiB0aGUgY2xhc3MgcGF0aCBvZiB0aGUgY29tcGlsZWQgcHJvamVjdC4KKwkgKi8KKwlUeXBlUmVmZXJlbmNlIG5ld1R5cGVSZWZlcmVuY2UoQ2xhc3M8Pz4gY2xhenosIFR5cGVSZWZlcmVuY2UuLi4gdHlwZUFyZ3VtZW50cyk7CisJCisJLyoqCisJICogQHJldHVybiBhIHdpbGRjYXJkIHR5cGUgcmVmZXJlbmNlcyB3aXRoIHVwcGVyQm91bmQge0BsaW5rIE9iamVjdH0KKwkgKi8KKwlUeXBlUmVmZXJlbmNlIG5ld1dpbGRjYXJkVHlwZVJlZmVyZW5jZSgpOworCQorCSAvKioKKwkgICogQHBhcmFtIHVwcGVyQm91bmQgdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSB3aWxkY2FyZCB0eXBlCisJICAqIEByZXR1cm4gYSB3aWxkY2FyZCB0eXBlIHJlZmVyZW5jZXMgd2l0aCB0aGUgZ2l2ZW4gdXBwZXJCb3VuZC4KKwkgICovCisJVHlwZVJlZmVyZW5jZSBuZXdXaWxkY2FyZFR5cGVSZWZlcmVuY2UoVHlwZVJlZmVyZW5jZSB1cHBlckJvdW5kKTsKKwkKKwkgLyoqCisJICAqIEBwYXJhbSBsb3dlckJvdW5kIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgd2lsZGNhcmQgdHlwZQorCSAgKiBAcmV0dXJuIGEgd2lsZGNhcmQgdHlwZSByZWZlcmVuY2VzIHdpdGggdGhlIGdpdmVuIGxvd2VyQm91bmQuCisJICAqLworCVR5cGVSZWZlcmVuY2UgbmV3V2lsZGNhcmRUeXBlUmVmZXJlbmNlV2l0aExvd2VyQm91bmQoVHlwZVJlZmVyZW5jZSBsb3dlckJvdW5kKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIGEgdHlwZSByZWZlcmVuY2UgcG9pbnRpbmcgdG8ge0BsaW5rIE9iamVjdH0KKwkgKi8KKwlUeXBlUmVmZXJlbmNlIGdldE9iamVjdCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gYSB0eXBlIHJlZmVyZW5jZSBwb2ludGluZyB0byB7QGxpbmsgU3RyaW5nfQorCSAqLworCVR5cGVSZWZlcmVuY2UgZ2V0U3RyaW5nKCk7CisJCisJLyoqCisJICogQHBhcmFtIHBhcmFtIHRoZSB0eXBlIGFyZ3VtZW50IGZvciB0aGUgdHlwZSByZWZlcmVuY2UKKwkgKiBAcmV0dXJuIGEgdHlwZSByZWZlcmVuY2UgZm9yIHtAbGluayBMaXN0fSB3aXRoIHRoZSBnaXZlbiB0eXBlIGFyZ3VtZW50LgorCSAqLworCVR5cGVSZWZlcmVuY2UgZ2V0TGlzdChUeXBlUmVmZXJlbmNlIHBhcmFtKTsKKwkKKwkvKioKKwkgKiBAcGFyYW0gcGFyYW0gdGhlIHR5cGUgYXJndW1lbnQgZm9yIHRoZSB0eXBlIHJlZmVyZW5jZQorCSAqIEByZXR1cm4gYSB0eXBlIHJlZmVyZW5jZSBmb3Ige0BsaW5rIFNldH0gd2l0aCB0aGUgZ2l2ZW4gdHlwZSBhcmd1bWVudC4KKwkgKi8KKwlUeXBlUmVmZXJlbmNlIGdldFNldChUeXBlUmVmZXJlbmNlIHBhcmFtKTsKKwkKKwkvKioKKwkgKiBUaGUgYW55IHR5cGUgaXMgdGhlIHR5cGUgb2YgdGhlIG51bGwgcG9pbnRlciBhbmQgaGFzIG5vIGNvbmNyZXRlCisJICogcmVwcmVzZW50YXRpb24gaW4gSmF2YS4gSXQgaXMgYXNzaWduYWJsZSB0byBldmVyeSByZWZlcmVuY2UgdHlwZS4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgdHlwZSByZWZlcmVuY2UgcmVwcmVzZW50aW5nIHRoZSAiYW55IHR5cGUiLgorCSAqLworCVR5cGVSZWZlcmVuY2UgZ2V0QW55VHlwZSgpOworCQorCS8qKgorCSAqIEByZXR1cm4gYSB0eXBlIHJlZmVyZW5jZSByZXByZXNlbnRpbmcgJ3ZvaWQnCisJICovCisJVHlwZVJlZmVyZW5jZSBnZXRQcmltaXRpdmVWb2lkKCk7CisJCisJLyoqCisJICogQHJldHVybiBhIHR5cGUgcmVmZXJlbmNlIHJlcHJlc2VudGluZyAnYm9vbGVhbicKKwkgKi8KKwlUeXBlUmVmZXJlbmNlIGdldFByaW1pdGl2ZUJvb2xlYW4oKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIGEgdHlwZSByZWZlcmVuY2UgcmVwcmVzZW50aW5nICdzaG9ydCcKKwkgKi8KKwlUeXBlUmVmZXJlbmNlIGdldFByaW1pdGl2ZVNob3J0KCk7CisJCisJLyoqCisJICogQHJldHVybiBhIHR5cGUgcmVmZXJlbmNlIHJlcHJlc2VudGluZyAnaW50JworCSAqLworCVR5cGVSZWZlcmVuY2UgZ2V0UHJpbWl0aXZlSW50KCk7CisJCisJLyoqCisJICogQHJldHVybiBhIHR5cGUgcmVmZXJlbmNlIHJlcHJlc2VudGluZyAnbG9uZycKKwkgKi8KKwlUeXBlUmVmZXJlbmNlIGdldFByaW1pdGl2ZUxvbmcoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIGEgdHlwZSByZWZlcmVuY2UgcmVwcmVzZW50aW5nICdmbG9hdCcKKwkgKi8KKwlUeXBlUmVmZXJlbmNlIGdldFByaW1pdGl2ZUZsb2F0KCk7CisJCisJLyoqCisJICogQHJldHVybiBhIHR5cGUgcmVmZXJlbmNlIHJlcHJlc2VudGluZyAnZG91YmxlJworCSAqLworCVR5cGVSZWZlcmVuY2UgZ2V0UHJpbWl0aXZlRG91YmxlKCk7CisJCisJLyoqCisJICogQHJldHVybiBhIHR5cGUgcmVmZXJlbmNlIHJlcHJlc2VudGluZyAnY2hhcicKKwkgKi8KKwlUeXBlUmVmZXJlbmNlIGdldFByaW1pdGl2ZUNoYXIoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIGEgdHlwZSByZWZlcmVuY2UgcmVwcmVzZW50aW5nICdieXRlJworCSAqLworCVR5cGVSZWZlcmVuY2UgZ2V0UHJpbWl0aXZlQnl0ZSgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL3NlcnZpY2VzL1Vwc3RyZWFtVHlwZUxvb2t1cC5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZC9saWIvbWFjcm8vc2VydmljZXMvVXBzdHJlYW1UeXBlTG9va3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyZmViOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQvbGliL21hY3JvL3NlcnZpY2VzL1Vwc3RyZWFtVHlwZUxvb2t1cC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLnNlcnZpY2VzOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uVHlwZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKKy8qKgorICogRmFjaWxpdGllcyB0byBsb29rdXAgb2YgSmF2YSB0eXBlIGRlY2xhcmF0aW9ucyBpbiB1cHN0cmVhbSAKKyAqIGRlcGVuZGVuY2llcyBvZiB0aGUgY3VycmVudCB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fS4gCisgKiBUaGlzIG1lYW5zIHRoYXQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBwcm9qZWN0IHdpbGwgbm90IGJlIGZvdW5kLgorICogCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiBAc2luY2UgMi43CisgKi8KK0BCZXRhCitwdWJsaWMgaW50ZXJmYWNlIFVwc3RyZWFtVHlwZUxvb2t1cCB7CisJLyoqCisJICogQHBhcmFtIGNsYXp6CisJICogICAgICAgICAgICB0aGUgY2xhenogcmVwcmVzZW50aW5nIHRoZSB0eXBlIHRvIGxvb2sgdXAKKwkgKiBAcmV0dXJuIHRoZSB0eXBlIHdpdGggdGhlIHNhbWUgcXVhbGlmaWVkIG5hbWUgYXMgdGhlIGdpdmVuCisJICogICAgICAgICA8Y29kZT5DbGFzczwvY29kZT4gb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGF0IHR5cGUKKwkgKiAgICAgICAgIGNvdWxkbid0IGJlIGZvdW5kIG9uIHRoZSBjb21waWxhdGlvbiB1bml0J3MgdXBzdHJlYW0gZGVwZW5kZW5jaWVzLgorCSAqLworCVR5cGUgZmluZFVwc3RyZWFtVHlwZShDbGFzczw/PiBjbGF6eik7CisKKwkvKioKKwkgKiBAcGFyYW0gdHlwZU5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdHlwZSB0byBsb29rIHVwLiBOZXN0ZWQgY2xhc3MgZGVsaW1pdGVyIGlzIGV4cGVjdGVkIHRvIGJlIHRoZSAnLicgKGRvdCkuCisJICogQHJldHVybiB0aGUgdHlwZSB3aXRoIHRoZSBnaXZlbiBxdWFsaWZpZWQgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgc3VjaCBhIHR5cGUKKwkgKiAgICAgICAgIGNvdWxkbid0IGJlIGZvdW5kIG9uIHRoZSBjb21waWxhdGlvbiB1bml0J3MgdXBzdHJlYW0gZGVwZW5kZW5jaWVzLgorCSAqLworCVR5cGUgZmluZFVwc3RyZWFtVHlwZShTdHJpbmcgdHlwZU5hbWUpOworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGVuZDIvbGliL0RlZmF1bHRMaW5lRGVsaW1pdGVyLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kMi9saWIvRGVmYXVsdExpbmVEZWxpbWl0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmE5NDgwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZDIvbGliL0RlZmF1bHRMaW5lRGVsaW1pdGVyLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZDIubGliOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKKy8qCisgKiBXaWxsIGJlIHJlcGxhY2VkIHdpdGggXG4gb24gR1dUIAorICovCitAR3d0Q29tcGF0aWJsZShlbXVsYXRlZCA9IHRydWUpCitjbGFzcyBEZWZhdWx0TGluZURlbGltaXRlciB7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0KCkgeworCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRlbmQyL2xpYi9MaWIuZ3d0LnhtbCBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQyL2xpYi9MaWIuZ3d0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTYxMzk1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZDIvbGliL0xpYi5nd3QueG1sCkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBtb2R1bGUgUFVCTElDICItLy9Hb29nbGUgSW5jLi8vRFREIEdvb2dsZSBXZWIgVG9vbGtpdCAyLjQuMC8vRU4iICJodHRwOi8vZ29vZ2xlLXdlYi10b29sa2l0Lmdvb2dsZWNvZGUuY29tL3N2bi90YWdzLzIuNC4wL2Rpc3Ryby1zb3VyY2UvY29yZS9zcmMvZ3d0LW1vZHVsZS5kdGQiPgorPG1vZHVsZT4KKwk8c291cmNlIHBhdGg9IiIvPgorCTxzdXBlci1zb3VyY2UgcGF0aD0ic3VwZXIiLz4KKwk8aW5oZXJpdHMgbmFtZT0iY29tLmdvb2dsZS5nd3QudXNlci5Vc2VyIiAvPgorCTxpbmhlcml0cyBuYW1lPSJjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkNvbGxlY3QiIC8+Cis8L21vZHVsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kMi9saWIvU3RyaW5nQ29uY2F0ZW5hdGlvbi5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZDIvbGliL1N0cmluZ0NvbmNhdGVuYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzJiNWZkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZDIvbGliL1N0cmluZ0NvbmNhdGVuYXRpb24uamF2YQpAQCAtMCwwICsxLDc0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZDIubGliOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQuVGFyZ2V0U3RyaW5nQ29uY2F0ZW5hdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CisKKy8qKgorICogPHA+CisgKiBBIHtAbGluayBTdHJpbmdDb25jYXRlbmF0aW9ufSBhbGxvd3MgZm9yIGVmZmljaWVudCwgaW5kZW50YXRpb24gYXdhcmUgY29uY2F0ZW5hdGlvbiBvZiBjaGFyYWN0ZXIgc2VxdWVuY2VzLgorICogPC9wPgorICogPHA+CisgKiBJbiBhZGRpdGlvbiB0byB0aGUgbWV0aG9kcyB0aGF0IGFyZSBzcGVjaWZpZWQgYnkgdGhlIGltcGxlbWVudGVkIGludGVyZmFjZSB7QGxpbmsgQ2hhclNlcXVlbmNlfSwgdGhlcmUgYXJlIHNvbWUgb3RoZXIKKyAqIHB1YmxpYyBvcGVyYXRpb25zIHRoYXQgYWxsb3cgdG8gbW9kaWZ5IHRoZSBjb250ZW50cyBvZiB0aGlzIHNlcXVlbmNlLiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFyYml0cmFyeSBvYmplY3RzCisgKiBjYW4gYmUgYXBwZW5kZWQgdG8gYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFN0cmluZ0NvbmNhdGVuYXRpb259LiBUaGVyZSBhcmUgb3ZlcmxvYWRlZCB2YXJpYW50cyBvZgorICoge0BsaW5rICNhcHBlbmQoT2JqZWN0LCBTdHJpbmcpfSB0aGF0IGFsbG93IHRvIHBhc3MgYW4gaW5kZW50YXRpb24gdGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byBlYWNoIGxpbmUgb2YgdGhlIGFwcGVuZGVkCisgKiBjb250ZW50LiBFYWNoIGxpbmUgYnJlYWsgdGhhdCBpcyBwYXJ0IG9mIHRoZSBuZXcgY29udGVudCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBsaW5lIGRlbGltaXRlciB0aGF0IHdhcyBjb25maWd1cmVkCisgKiBmb3IgdGhpcyB7QGxpbmsgU3RyaW5nQ29uY2F0ZW5hdGlvbn0uCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSB7QGxpbmsgI2FwcGVuZChPYmplY3QpIGFwcGVuZH0tb3BlcmF0aW9uIGlnbm9yZXMgPGNvZGU+bnVsbDwvY29kZT4gYXJndW1lbnRzLiBUaGlzIGlzIGRpZmZlcmVudCB0byB3aGF0CisgKiB7QGxpbmsgU3RyaW5nQnVmZmVyfSBvciB7QGxpbmsgU3RyaW5nQnVpbGRlcn0gZG8gYW5kIHRoYXQncyB0aGUgcmVhc29uIHdoeSB0aGUge0BsaW5rIEFwcGVuZGFibGV9IGludGVyZmFjZSBpcyBub3QKKyAqIGZ1bGZpbGxlZCBieSBhIHtAbGluayBTdHJpbmdDb25jYXRlbmF0aW9ufS4KKyAqIDxwPgorICogPHA+CisgKiBUaGUgb2JqZWN0IHVzZXMgYW4gaW50ZXJuYWwge0BsaW5rIExpc3R9IG9mIHtAbGluayBTdHJpbmcgU3RyaW5nc30gdGhhdCBpcyBjb25jYXRlbmF0ZWQgb24gZGVtYW5kIHRvIGEgY29tcGxldGUKKyAqIHNlcXVlbmNlLiBVc2Uge0BsaW5rICN0b1N0cmluZygpfSB0byBnZXQgdGhlIGpvaW5lZCB2ZXJzaW9uIG9mIGEge0BsaW5rIFN0cmluZ0NvbmNhdGVuYXRpb259LgorICogPC9wPgorICogPHA+CisgKiB7QGxpbmsgI2VxdWFscyhPYmplY3QpfSBhbmQge0BsaW5rICNoYXNoQ29kZSgpfSBhcmUgbm90IHNwZWNpYWxpemVkIGZvciBhIHtAbGluayBTdHJpbmdDb25jYXRlbmF0aW9ufSwgdGhhdCBpcywgdGhlCisgKiBzZW1hbnRpY3MgYXJlIGJhc2VkIG9uIGlkZW50aXR5IHNpbWlsYXIgdG8gd2hhdCB7QGxpbmsgU3RyaW5nQnVmZmVyfSBhbmQge0BsaW5rIFN0cmluZ0J1aWxkZXJ9IGRvLgorICogPC9wPgorICogCisgKiBAYXV0aG9yIFNlYmFzdGlhbiBaYXJuZWtvdyAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqIEBzaW5jZSAyLjMKKyAqLworQEd3dENvbXBhdGlibGUKK3B1YmxpYyBjbGFzcyBTdHJpbmdDb25jYXRlbmF0aW9uIGltcGxlbWVudHMgQ2hhclNlcXVlbmNlIHsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IGxpbmUgZGVsaW1pdGVyIHRoYXQgaXMgdXNlZCBieSBpbnN0YW5jZXMgb2Yge0BsaW5rIFN0cmluZ0NvbmNhdGVuYXRpb259LiBJdCB1c2VzCisJICogPGNvZGU+U3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpPC9jb2RlPi4KKwkgKiBAc2luY2UgMi4zCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MSU5FX0RFTElNSVRFUiA9IERlZmF1bHRMaW5lRGVsaW1pdGVyLmdldCgpOworCisJLyoqCisJICogTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGFkZCB0byB7QGxpbmsgI3NlZ21lbnRzfSBhcnJheSB3aGVuIHdlIG5lZWQgdG8gZ3JvdyBpdC4gVGhpcyBzaG91bGQgYmUgYSBwb3dlci1vZi10d28KKwkgKiBzbyB3ZSBjYW4gcGVyZm9ybSBlZmZpY2llbnQgbW9kdWxvIG9wZXJhdGlvbi4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VHTUVOVFNfU0laRV9JTkNSRU1FTlQgPSAxNjsKKworCS8qKgorCSAqIEluaXRpYWwgYWxsb2NhdGlvbiBzaXplIG9mIHRoZSB7QGxpbmsgI3NlZ21lbnRzfSBhcnJheS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VHTUVOVFNfSU5JVElBTF9TSVpFID0gMyAqIFNFR01FTlRTX1NJWkVfSU5DUkVNRU5UOworCisJLyoqCisJICogVGhlIGNvbXBsZXRlIGNvbnRlbnQgb2YgdGhpcyBzZXF1ZW5jZS4gSXQgbWF5IGNvbnRhaW4gaW5zaWduaWZpY2FudCB0cmFpbGluZyBwYXJ0cyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgZmluYWwKKwkgKiBzdHJpbmcgcmVwcmVzZW50YXRpb24gdGhhdCBjYW4gYmUgb2J0YWluZWQgYnkge0BsaW5rICN0b1N0cmluZygpfS4gSW5zaWduaWZpY2FudCBwYXJ0cyB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIGJ5CisJICoge0BsaW5rICNsZW5ndGgoKX0sIHtAbGluayAjY2hhckF0KGludCl9IG9yIHtAbGluayAjc3ViU2VxdWVuY2UoaW50LCBpbnQpfS4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IHNlZ21lbnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KFNFR01FTlRTX0lOSVRJQUxfU0laRSk7CisKKwkvKioKKwkgKiBJbnRlcm5hbCBoaW50IGZvciB0aGUgc2l6ZSBvZiBzZWdtZW50cy4gV2UgY2FjaGUgdGhpcyB2YWx1ZSBzbyB3ZSBkbyBub3QgaGF2ZSB0byBwZXJmb3JtIGNvc3RseSBjYWxjdWxhdGlvbnMuIAorCSAqLworCXByaXZhdGUgaW50IGxhc3RTZWdtZW50c1NpemUgPSBTRUdNRU5UU19JTklUSUFMX1NJWkU7CisKKwkvKioKKwkgKiBBIGNhY2hlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICovCisJcHJpdmF0ZSBTdHJpbmcgY2FjaGVkVG9TdHJpbmc7CisKKwkvKioKKwkgKiBUaGUgY29uZmlndXJlZCBkZWxpbWl0ZXIuIEl0IHdpbGwgYmUgdXNlZCB0byByZXBsYWNlIHBvc3NpYmx5IGV4aXN0aW5nIGRlbGltaXRlcnMgb2YgdG8tYmUtYXBwZW5kZWQgY29udGVudC4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaW5lRGVsaW1pdGVyOworCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IGNvbmNhdGVuYXRpb24gdGhhdCB1c2VzIHRoZSBzeXN0ZW0gbGluZSBkZWxpbWl0ZXIuCisJICogCisJICogQHNlZSBTeXN0ZW0jZ2V0UHJvcGVydGllcygpCisJICogQHNlZSBTeXN0ZW0jZ2V0UHJvcGVydHkoU3RyaW5nKQorCSAqLworCXB1YmxpYyBTdHJpbmdDb25jYXRlbmF0aW9uKCkgeworCQl0aGlzKERFRkFVTFRfTElORV9ERUxJTUlURVIpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBjb25jYXRlbmF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXIuCisJICogCisJICogQHBhcmFtIGxpbmVEZWxpbWl0ZXIKKwkgKiAgICAgICAgICAgIHRoZSB1c2VkIGRlbGltaXRlci4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBsaW5lRGVsaW1pdGVyIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIHRoZSBlbXB0eSBTdHJpbmcuCisJICogQHNpbmNlIDIuMworCSAqLworCXB1YmxpYyBTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZyBsaW5lRGVsaW1pdGVyKSB7CisJCWlmIChsaW5lRGVsaW1pdGVyID09IG51bGwgfHwgbGluZURlbGltaXRlci5sZW5ndGgoKSA9PSAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGluZURlbGltaXRlciBtdXN0IG5vdCBiZSBudWxsIG9yIGVtcHR5Iik7CisJCXRoaXMubGluZURlbGltaXRlciA9IGxpbmVEZWxpbWl0ZXI7CisJfQorCisJcHJpdmF0ZSB2b2lkIGdyb3dTZWdtZW50cyhpbnQgaW5jcmVtZW50KSB7CisJCWludCB0YXJnZXRTaXplID0gc2VnbWVudHMuc2l6ZSgpICsgaW5jcmVtZW50OworCQlpZiAodGFyZ2V0U2l6ZSA8PSBsYXN0U2VnbWVudHNTaXplKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlpbnQgbW9kID0gdGFyZ2V0U2l6ZSAlIFNFR01FTlRTX1NJWkVfSU5DUkVNRU5UOworCQlpZiAobW9kICE9IDApIHsKKwkJCXRhcmdldFNpemUgKz0gU0VHTUVOVFNfU0laRV9JTkNSRU1FTlQgLSBtb2Q7CisJCX0KKworCQlzZWdtZW50cy5lbnN1cmVDYXBhY2l0eSh0YXJnZXRTaXplKTsKKwkJbGFzdFNlZ21lbnRzU2l6ZSA9IHRhcmdldFNpemU7CisJfQorCisJLyoqCisJICogQXBwZW5kIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIG9iamVjdCB0byB0aGlzIHNlcXVlbmNlLiBEb2VzIG5vdGhpbmcgaWYgdGhlIG9iamVjdCBpcworCSAqIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiAgICAgICAgICAgIHRoZSB0by1iZS1hcHBlbmRlZCBvYmplY3QuCisJICovCisJcHVibGljIHZvaWQgYXBwZW5kKE9iamVjdCBvYmplY3QpIHsKKwkJYXBwZW5kKG9iamVjdCwgc2VnbWVudHMuc2l6ZSgpKTsKKwl9CisKKwkvKioKKwkgKiBBcHBlbmQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNlcXVlbmNlLiBEb2VzIG5vdGhpbmcgaWYgdGhlIHN0cmluZyBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdHIKKwkgKiAgICAgICAgICAgIHRoZSB0by1iZS1hcHBlbmRlZCBzdHJpbmcuCisJICogQHNpbmNlIDIuMTEKKwkgKi8KKwlwdWJsaWMgdm9pZCBhcHBlbmQoU3RyaW5nIHN0cikgeworCQlpZiAoc3RyICE9IG51bGwpCisJCQlhcHBlbmQoc3RyLCBzZWdtZW50cy5zaXplKCkpOworCX0KKworCS8qKgorCSAqIEFwcGVuZCB0aGUgY29udGVudHMgb2YgYSBnaXZlbiBTdHJpbmdDb25jYXRlbmF0aW9uIHRvIHRoaXMgc2VxdWVuY2UuIERvZXMgbm90aGluZworCSAqIGlmIHRoZSBjb25jYXRlbmF0aW9uIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIGNvbmNhdAorCSAqICAgICAgICAgICAgdGhlIHRvLWJlLWFwcGVuZGVkIFN0cmluZ0NvbmNhdGVuYXRpb24uCisJICogQHNpbmNlIDIuMTEKKwkgKi8KKwlwdWJsaWMgdm9pZCBhcHBlbmQoU3RyaW5nQ29uY2F0ZW5hdGlvbiBjb25jYXQpIHsKKwkJaWYgKGNvbmNhdCAhPSBudWxsKQorCQkJYXBwZW5kU2VnbWVudHMoc2VnbWVudHMuc2l6ZSgpLCBjb25jYXQuZ2V0U2lnbmlmaWNhbnRDb250ZW50KCksIGNvbmNhdC5saW5lRGVsaW1pdGVyKTsKKwl9CisKKwkvKioKKwkgKiBBcHBlbmQgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCB0byB0aGlzIHNlcXVlbmNlLiBEb2VzIG5vdGhpbmcKKwkgKiBpZiB0aGUgYXJndW1lbnQgaXMgPGNvZGU+bnVsbDwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gY2xpZW50CisJICogICAgICAgICAgICB0aGUgdG8tYmUtYXBwZW5kZWQgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC4KKwkgKiBAc2luY2UgMi4xMQorCSAqLworCXB1YmxpYyB2b2lkIGFwcGVuZChTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IGNsaWVudCkgeworCQlpZiAoY2xpZW50ICE9IG51bGwpCisJCQljbGllbnQuYXBwZW5kVG8obmV3IFNpbXBsZVRhcmdldCh0aGlzLCBzZWdtZW50cy5zaXplKCkpKTsKKwl9CisKKwkvKgorCSAqIEFkZCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBvYmplY3QgdG8gdGhpcyBzZXF1ZW5jZSBhdCB0aGUgZ2l2ZW4gaW5kZXguIERvZXMgbm90aGluZyBpZiB0aGUgb2JqZWN0CisJICogaXMgPGNvZGU+bnVsbDwvY29kZT4uCisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqICAgICAgICAgICAgdGhlIHRvLWJlLWFwcGVuZGVkIG9iamVjdC4KKwkgKiBAcGFyYW0gaW5kZXgKKwkgKiAgICAgICAgICAgIHRoZSBpbmRleCBpbiB0aGUgbGlzdCBvZiBzZWdtZW50cy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhcHBlbmQoT2JqZWN0IG9iamVjdCwgaW50IGluZGV4KSB7CisJCWlmIChvYmplY3QgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJYXBwZW5kKChTdHJpbmcpIG9iamVjdCwgaW5kZXgpOworCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZ0NvbmNhdGVuYXRpb24pIHsKKwkJCVN0cmluZ0NvbmNhdGVuYXRpb24gb3RoZXIgPSAoU3RyaW5nQ29uY2F0ZW5hdGlvbikgb2JqZWN0OworCQkJYXBwZW5kU2VnbWVudHMoaW5kZXgsIG90aGVyLmdldFNpZ25pZmljYW50Q29udGVudCgpLCBvdGhlci5saW5lRGVsaW1pdGVyKTsKKwkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50KSB7CisJCQlTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IG90aGVyID0gKFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQpIG9iamVjdDsKKwkJCW90aGVyLmFwcGVuZFRvKG5ldyBTaW1wbGVUYXJnZXQodGhpcywgaW5kZXgpKTsKKwkJfSBlbHNlIHsKKwkJCWZpbmFsIFN0cmluZyB0ZXh0ID0gZ2V0U3RyaW5nUmVwcmVzZW50YXRpb24ob2JqZWN0KTsKKwkJCWlmICh0ZXh0ICE9IG51bGwpIHsKKwkJCQlhcHBlbmQodGV4dCwgaW5kZXgpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGFwcGVuZChTdHJpbmcgdGV4dCwgaW50IGluZGV4KSB7CisJCWZpbmFsIGludCBpbml0aWFsID0gaW5pdGlhbFNlZ21lbnRTaXplKHRleHQpOworCQlpZiAoaW5pdGlhbCA9PSB0ZXh0Lmxlbmd0aCgpKSB7CisJCQlhcHBlbmRTZWdtZW50KGluZGV4LCB0ZXh0KTsKKwkJfSBlbHNlIHsKKwkJCWFwcGVuZFNlZ21lbnRzKGluZGV4LCBjb250aW51ZVNwbGl0dGluZyh0ZXh0LCBpbml0aWFsKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBZGQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoaXMgc2VxdWVuY2UuIFRoZSBnaXZlbiBpbmRlbnRhdGlvbiB3aWxsIGJlIHByZXBlbmRlZCB0bworCSAqIGVhY2ggbGluZSBleGNlcHQgdGhlIGZpcnN0IG9uZSBpZiB0aGUgb2JqZWN0IGhhcyBhIG11bHRpLWxpbmUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiAgICAgICAgICAgIHRoZSBhcHBlbmRlZCBvYmplY3QuCisJICogQHBhcmFtIGluZGVudGF0aW9uCisJICogICAgICAgICAgICB0aGUgaW5kZW50YXRpb24gc3RyaW5nIHRoYXQgc2hvdWxkIGJlIHByZXBlbmRlZC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhcHBlbmQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGluZGVudGF0aW9uKSB7CisJCWFwcGVuZChvYmplY3QsIGluZGVudGF0aW9uLCBzZWdtZW50cy5zaXplKCkpOworCX0KKworCS8qKgorCSAqIEFkZCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHRoaXMgc2VxdWVuY2UuIFRoZSBnaXZlbiBpbmRlbnRhdGlvbiB3aWxsIGJlIHByZXBlbmRlZCB0bworCSAqIGVhY2ggbGluZSBleGNlcHQgdGhlIGZpcnN0IG9uZSBpZiB0aGUgb2JqZWN0IGhhcyBhIG11bHRpLWxpbmUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqCisJICogQHBhcmFtIHN0cgorCSAqICAgICAgICAgICAgdGhlIGFwcGVuZGVkIHN0cmluZy4KKwkgKiBAcGFyYW0gaW5kZW50YXRpb24KKwkgKiAgICAgICAgICAgIHRoZSBpbmRlbnRhdGlvbiBzdHJpbmcgdGhhdCBzaG91bGQgYmUgcHJlcGVuZGVkLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBzaW5jZSAyLjExCisJICovCisJcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZyBzdHIsIFN0cmluZyBpbmRlbnRhdGlvbikgeworCQlpZiAoaW5kZW50YXRpb24uaXNFbXB0eSgpKSB7CisJCQlhcHBlbmQoc3RyKTsKKwkJfSBlbHNlIGlmIChzdHIgIT0gbnVsbCkKKwkJCWFwcGVuZChpbmRlbnRhdGlvbiwgc3RyLCBzZWdtZW50cy5zaXplKCkpOworCX0KKworCS8qKgorCSAqIEFwcGVuZCB0aGUgY29udGVudHMgb2YgYSBnaXZlbiBTdHJpbmdDb25jYXRlbmF0aW9uIHRvIHRoaXMgc2VxdWVuY2UuIERvZXMgbm90aGluZworCSAqIGlmIHRoZSBjb25jYXRlbmF0aW9uIGlzIDxjb2RlPm51bGw8L2NvZGU+LiBUaGUgZ2l2ZW4gaW5kZW50YXRpb24gd2lsbCBiZSBwcmVwZW5kZWQgdG8gZWFjaCBsaW5lIGV4Y2VwdAorCSAqIHRoZSBmaXJzdCBvbmUuCisJICoKKwkgKiBAcGFyYW0gY29uY2F0CisJICogICAgICAgICAgICB0aGUgdG8tYmUtYXBwZW5kZWQgU3RyaW5nQ29uY2F0ZW5hdGlvbi4KKwkgKiBAcGFyYW0gaW5kZW50YXRpb24KKwkgKiAgICAgICAgICAgIHRoZSBpbmRlbnRhdGlvbiBzdHJpbmcgdGhhdCBzaG91bGQgYmUgcHJlcGVuZGVkLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBzaW5jZSAyLjExCisJICovCisJcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZ0NvbmNhdGVuYXRpb24gY29uY2F0LCBTdHJpbmcgaW5kZW50YXRpb24pIHsKKwkJaWYgKGluZGVudGF0aW9uLmlzRW1wdHkoKSkgeworCQkJYXBwZW5kKGNvbmNhdCk7CisJCX0gZWxzZSBpZiAoY29uY2F0ICE9IG51bGwpCisJCQlhcHBlbmRTZWdtZW50cyhpbmRlbnRhdGlvbiwgc2VnbWVudHMuc2l6ZSgpLCBjb25jYXQuZ2V0U2lnbmlmaWNhbnRDb250ZW50KCksIGNvbmNhdC5saW5lRGVsaW1pdGVyKTsKKwl9CisKKwkvKioKKwkgKiBBcHBlbmQgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCB0byB0aGlzIHNlcXVlbmNlLiBEb2VzIG5vdGhpbmcKKwkgKiBpZiB0aGF0IGFyZ3VtZW50IGlzIDxjb2RlPm51bGw8L2NvZGU+LiBUaGUgZ2l2ZW4gaW5kZW50YXRpb24gd2lsbCBiZSBwcmVwZW5kZWQgdG8gZWFjaCBsaW5lIGV4Y2VwdAorCSAqIHRoZSBmaXJzdCBvbmUuCisJICoKKwkgKiBAcGFyYW0gY2xpZW50CisJICogICAgICAgICAgICB0aGUgdG8tYmUtYXBwZW5kZWQgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC4KKwkgKiBAcGFyYW0gaW5kZW50YXRpb24KKwkgKiAgICAgICAgICAgIHRoZSBpbmRlbnRhdGlvbiBzdHJpbmcgdGhhdCBzaG91bGQgYmUgcHJlcGVuZGVkLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBzaW5jZSAyLjExCisJICovCisJcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQgY2xpZW50LCBTdHJpbmcgaW5kZW50YXRpb24pIHsKKwkJaWYgKGluZGVudGF0aW9uLmlzRW1wdHkoKSkgeworCQkJYXBwZW5kKGNsaWVudCk7CisJCX0gZWxzZSBpZiAoY2xpZW50ICE9IG51bGwpCisJCQljbGllbnQuYXBwZW5kVG8obmV3IEluZGVudGVkVGFyZ2V0KHRoaXMsIGluZGVudGF0aW9uLCBzZWdtZW50cy5zaXplKCkpKTsKKwl9CisKKwkvKioKKwkgKiBBZGQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoaXMgc2VxdWVuY2UgYXQgdGhlIGdpdmVuIGluZGV4LiBUaGUgZ2l2ZW4gaW5kZW50YXRpb24gd2lsbAorCSAqIGJlIHByZXBlbmRlZCB0byBlYWNoIGxpbmUgZXhjZXB0IHRoZSBmaXJzdCBvbmUgaWYgdGhlIG9iamVjdCBoYXMgYSBtdWx0aS1saW5lIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogICAgICAgICAgICB0aGUgdG8tYmUtYXBwZW5kZWQgb2JqZWN0LgorCSAqIEBwYXJhbSBpbmRlbnRhdGlvbgorCSAqICAgICAgICAgICAgdGhlIGluZGVudGF0aW9uIHN0cmluZyB0aGF0IHNob3VsZCBiZSBwcmVwZW5kZWQuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICB0aGUgaW5kZXggaW4gdGhlIGxpc3Qgb2Ygc2VnbWVudHMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgYXBwZW5kKE9iamVjdCBvYmplY3QsIFN0cmluZyBpbmRlbnRhdGlvbiwgaW50IGluZGV4KSB7CisJCWlmIChpbmRlbnRhdGlvbi5sZW5ndGgoKSA9PSAwKSB7CisJCQlhcHBlbmQob2JqZWN0LCBpbmRleCk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKG9iamVjdCA9PSBudWxsKQorCQkJcmV0dXJuOworCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQlhcHBlbmQoaW5kZW50YXRpb24sIChTdHJpbmcpb2JqZWN0LCBpbmRleCk7CisJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nQ29uY2F0ZW5hdGlvbikgeworCQkJU3RyaW5nQ29uY2F0ZW5hdGlvbiBvdGhlciA9IChTdHJpbmdDb25jYXRlbmF0aW9uKSBvYmplY3Q7CisJCQlMaXN0PFN0cmluZz4gb3RoZXJTZWdtZW50cyA9IG90aGVyLmdldFNpZ25pZmljYW50Q29udGVudCgpOworCQkJYXBwZW5kU2VnbWVudHMoaW5kZW50YXRpb24sIGluZGV4LCBvdGhlclNlZ21lbnRzLCBvdGhlci5saW5lRGVsaW1pdGVyKTsKKwkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50KSB7CisJCQlTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50IG90aGVyID0gKFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQpIG9iamVjdDsKKwkJCW90aGVyLmFwcGVuZFRvKG5ldyBJbmRlbnRlZFRhcmdldCh0aGlzLCBpbmRlbnRhdGlvbiwgaW5kZXgpKTsKKwkJfSBlbHNlIHsKKwkJCWZpbmFsIFN0cmluZyB0ZXh0ID0gZ2V0U3RyaW5nUmVwcmVzZW50YXRpb24ob2JqZWN0KTsKKwkJCWlmICh0ZXh0ICE9IG51bGwpIHsKKwkJCQlhcHBlbmQoaW5kZW50YXRpb24sIHRleHQsIGluZGV4KTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBhcHBlbmQoU3RyaW5nIGluZGVudGF0aW9uLCBTdHJpbmcgdGV4dCwgaW50IGluZGV4KSB7CisJCWZpbmFsIGludCBpbml0aWFsID0gaW5pdGlhbFNlZ21lbnRTaXplKHRleHQpOworCQlpZiAoaW5pdGlhbCA9PSB0ZXh0Lmxlbmd0aCgpKSB7CisJCQlhcHBlbmRTZWdtZW50KGluZGV4LCB0ZXh0KTsKKwkJfSBlbHNlIHsKKwkJCWFwcGVuZFNlZ21lbnRzKGluZGVudGF0aW9uLCBpbmRleCwgY29udGludWVTcGxpdHRpbmcodGV4dCwgaW5pdGlhbCksIGxpbmVEZWxpbWl0ZXIpOworCQl9CisJfQorCisJLyoqCisJICogQ29tcHV0ZXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gb2JqZWN0LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorCSAqIHdpbGwganVzdCBpbnZva2Uge0BsaW5rIE9iamVjdCN0b1N0cmluZygpfSBidXQgY2xpZW50cyBtYXkgb3ZlcnJpZGUgYW5kIHNwZWNpYWxpemUKKwkgKiB0aGUgbG9naWMuCisJICogCisJICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHRoYXQgc2hhbGwgYmUgYXBwZW5kZWQuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAc2luY2UgMi41CisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdSZXByZXNlbnRhdGlvbihPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBBZGQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoaXMgc2VxdWVuY2UgaW1tZWRpYXRlbHkuIFRoYXQgaXMsIGFsbCB0aGUgdHJhaWxpbmcKKwkgKiB3aGl0ZXNwYWNlIG9mIHRoaXMgc2VxdWVuY2Ugd2lsbCBiZSBpZ25vcmVkIGFuZCB0aGUgc3RyaW5nIGlzIGFwcGVuZGVkIGRpcmVjdGx5IGFmdGVyIHRoZSBsYXN0IHNlZ21lbnQgdGhhdAorCSAqIGNvbnRhaW5zIHNvbWV0aGluZyBiZXNpZGVzIHdoaXRlc3BhY2UuIFRoZSBnaXZlbiBpbmRlbnRhdGlvbiB3aWxsIGJlIHByZXBlbmRlZCB0byBlYWNoIGxpbmUgZXhjZXB0IHRoZSBmaXJzdCBvbmUKKwkgKiBpZiB0aGUgb2JqZWN0IGhhcyBhIG11bHRpLWxpbmUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiAgICAgICAgICAgIHRoZSB0by1iZS1hcHBlbmRlZCBvYmplY3QuCisJICogQHBhcmFtIGluZGVudGF0aW9uCisJICogICAgICAgICAgICB0aGUgaW5kZW50YXRpb24gc3RyaW5nIHRoYXQgc2hvdWxkIGJlIHByZXBlbmRlZC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhcHBlbmRJbW1lZGlhdGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGluZGVudGF0aW9uKSB7CisJCWZvciAoaW50IGkgPSBzZWdtZW50cy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworCQkJU3RyaW5nIHNlZ21lbnQgPSBzZWdtZW50cy5nZXQoaSk7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IHNlZ21lbnQubGVuZ3RoKCk7IGorKykgeworCQkJCWlmICghV2hpdGVzcGFjZU1hdGNoZXIuaXNXaGl0ZXNwYWNlKHNlZ21lbnQuY2hhckF0KGopKSkgeworCQkJCQlhcHBlbmQob2JqZWN0LCBpbmRlbnRhdGlvbiwgaSArIDEpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisJCWFwcGVuZChvYmplY3QsIGluZGVudGF0aW9uLCAwKTsKKwl9CisKKwkvKioKKwkgKiBBZGQgdGhlIGxpc3Qgb2Ygc2VnbWVudHMgdG8gdGhpcyBzZXF1ZW5jZSBhdCB0aGUgZ2l2ZW4gaW5kZXguIFRoZSBnaXZlbiBpbmRlbnRhdGlvbiB3aWxsIGJlIHByZXBlbmRlZCB0byBlYWNoCisJICogbGluZSBleGNlcHQgdGhlIGZpcnN0IG9uZSBpZiB0aGUgb2JqZWN0IGhhcyBhIG11bHRpLWxpbmUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBpbmRlbnRhdGlvbgorCSAqICAgICAgICAgICAgdGhlIGluZGVudGF0aW9uIHN0cmluZyB0aGF0IHNob3VsZCBiZSBwcmVwZW5kZWQuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICB0aGUgaW5kZXggaW4gdGhpcyBpbnN0YW5jZSdzIGxpc3Qgb2Ygc2VnbWVudHMuCisJICogQHBhcmFtIG90aGVyU2VnbWVudHMKKwkgKiAgICAgICAgICAgIHRoZSB0by1iZS1hcHBlbmRlZCBzZWdtZW50cy4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gb3RoZXJEZWxpbWl0ZXIKKwkgKiAgICAgICAgICAgIHRoZSBsaW5lIGRlbGltaXRlciB0aGF0IHdhcyB1c2VkIGluIHRoZSBvdGhlclNlZ21lbnRzIGxpc3QuCisJICovCisJcHJvdGVjdGVkIHZvaWQgYXBwZW5kU2VnbWVudHMoU3RyaW5nIGluZGVudGF0aW9uLCBpbnQgaW5kZXgsIExpc3Q8U3RyaW5nPiBvdGhlclNlZ21lbnRzLCBTdHJpbmcgb3RoZXJEZWxpbWl0ZXIpIHsKKwkJaWYgKG90aGVyU2VnbWVudHMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBUaGlzIG1heSBub3QgYmUgYWNjdXJhdGUsIGJ1dCBpdCdzIGJldHRlciB0aGFuIG5vdGhpbmcKKwkJZ3Jvd1NlZ21lbnRzKG90aGVyU2VnbWVudHMuc2l6ZSgpKTsKKwkJZm9yIChTdHJpbmcgb3RoZXJTZWdtZW50IDogb3RoZXJTZWdtZW50cykgeworCQkJaWYgKG90aGVyRGVsaW1pdGVyLmVxdWFscyhvdGhlclNlZ21lbnQpKSB7CisJCQkJc2VnbWVudHMuYWRkKGluZGV4KyssIGxpbmVEZWxpbWl0ZXIpOworCQkJCXNlZ21lbnRzLmFkZChpbmRleCsrLCBpbmRlbnRhdGlvbik7CisJCQl9IGVsc2UgeworCQkJCXNlZ21lbnRzLmFkZChpbmRleCsrLCBvdGhlclNlZ21lbnQpOworCQkJfQorCQl9CisJCWNhY2hlZFRvU3RyaW5nID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBBZGQgdGhlIGxpc3Qgb2Ygc2VnbWVudHMgdG8gdGhpcyBzZXF1ZW5jZSBhdCB0aGUgZ2l2ZW4gaW5kZXguIFRoZSBnaXZlbiBpbmRlbnRhdGlvbiB3aWxsIGJlIHByZXBlbmRlZCB0byBlYWNoCisJICogbGluZSBleGNlcHQgdGhlIGZpcnN0IG9uZSBpZiB0aGUgb2JqZWN0IGhhcyBhIG11bHRpLWxpbmUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBpbmRleAorCSAqICAgICAgICAgICAgdGhlIGluZGV4IGluIHRoaXMgaW5zdGFuY2UncyBsaXN0IG9mIHNlZ21lbnRzLgorCSAqIEBwYXJhbSBvdGhlclNlZ21lbnRzCisJICogICAgICAgICAgICB0aGUgdG8tYmUtYXBwZW5kZWQgc2VnbWVudHMuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIG90aGVyRGVsaW1pdGVyCisJICogICAgICAgICAgICB0aGUgbGluZSBkZWxpbWl0ZXIgdGhhdCB3YXMgdXNlZCBpbiB0aGUgb3RoZXJTZWdtZW50cyBsaXN0LgorCSAqIEBzaW5jZSAyLjUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTZWdtZW50cyhpbnQgaW5kZXgsIExpc3Q8U3RyaW5nPiBvdGhlclNlZ21lbnRzLCBTdHJpbmcgb3RoZXJEZWxpbWl0ZXIpIHsKKwkJaWYgKG90aGVyRGVsaW1pdGVyLmVxdWFscyhsaW5lRGVsaW1pdGVyKSkgeworCQkJYXBwZW5kU2VnbWVudHMoaW5kZXgsIG90aGVyU2VnbWVudHMpOworCQl9IGVsc2UgeworCQkJaWYgKG90aGVyU2VnbWVudHMuaXNFbXB0eSgpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJZ3Jvd1NlZ21lbnRzKG90aGVyU2VnbWVudHMuc2l6ZSgpKTsKKwkJCWZvciAoU3RyaW5nIG90aGVyU2VnbWVudCA6IG90aGVyU2VnbWVudHMpIHsKKwkJCQlpZiAob3RoZXJEZWxpbWl0ZXIuZXF1YWxzKG90aGVyU2VnbWVudCkpIHsKKwkJCQkJc2VnbWVudHMuYWRkKGluZGV4KyssIGxpbmVEZWxpbWl0ZXIpOworCQkJCX0gZWxzZSB7CisJCQkJCXNlZ21lbnRzLmFkZChpbmRleCsrLCBvdGhlclNlZ21lbnQpOworCQkJCX0KKwkJCX0KKwkJCWNhY2hlZFRvU3RyaW5nID0gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIEFkZCB0aGUgbGlzdCBvZiBzZWdtZW50cyB0byB0aGlzIHNlcXVlbmNlIGF0IHRoZSBnaXZlbiBpbmRleC4gVGhlIGdpdmVuIGluZGVudGF0aW9uIHdpbGwgYmUgcHJlcGVuZGVkIHRvIGVhY2gKKwkgKiBsaW5lIGV4Y2VwdCB0aGUgZmlyc3Qgb25lIGlmIHRoZSBvYmplY3QgaGFzIGEgbXVsdGktbGluZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogCisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICB0aGUgaW5kZXggaW4gdGhpcyBpbnN0YW5jZSdzIGxpc3Qgb2Ygc2VnbWVudHMuCisJICogQHBhcmFtIG90aGVyU2VnbWVudHMKKwkgKiAgICAgICAgICAgIHRoZSB0by1iZS1hcHBlbmRlZCBzZWdtZW50cy4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAc2luY2UgMi41CisJICovCisJcHJvdGVjdGVkIHZvaWQgYXBwZW5kU2VnbWVudHMoaW50IGluZGV4LCBMaXN0PFN0cmluZz4gb3RoZXJTZWdtZW50cykgeworCQlncm93U2VnbWVudHMob3RoZXJTZWdtZW50cy5zaXplKCkpOworCQlpZiAoc2VnbWVudHMuYWRkQWxsKGluZGV4LCBvdGhlclNlZ21lbnRzKSkgeworCQkJY2FjaGVkVG9TdHJpbmcgPSBudWxsOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGFwcGVuZFNlZ21lbnQoaW50IGluZGV4LCBTdHJpbmcgc2VnbWVudCkgeworCQlncm93U2VnbWVudHMoMSk7CisJCXNlZ21lbnRzLmFkZChpbmRleCwgc2VnbWVudCk7CisJCWNhY2hlZFRvU3RyaW5nID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBBZGQgYSBuZXdsaW5lIHRvIHRoaXMgc2VxdWVuY2UgYWNjb3JkaW5nIHRvIHRoZSBjb25maWd1cmVkIGxpbmVEZWxpbWl0ZXIuCisJICovCisJcHVibGljIHZvaWQgbmV3TGluZSgpIHsKKwkJZ3Jvd1NlZ21lbnRzKDEpOworCQlzZWdtZW50cy5hZGQobGluZURlbGltaXRlcik7CisJCWNhY2hlZFRvU3RyaW5nID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBBZGQgYSBuZXdsaW5lIHRvIHRoaXMgc2VxdWVuY2UgYWNjb3JkaW5nIHRvIHRoZSBjb25maWd1cmVkIGxpbmVEZWxpbWl0ZXIgaWYgdGhlIGxhc3QgbGluZSBjb250YWlucworCSAqIHNvbWV0aGluZyBiZXNpZGVzIHdoaXRlc3BhY2UuCisJICovCisJcHVibGljIHZvaWQgbmV3TGluZUlmTm90RW1wdHkoKSB7CisJCWZvciAoaW50IGkgPSBzZWdtZW50cy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworCQkJU3RyaW5nIHNlZ21lbnQgPSBzZWdtZW50cy5nZXQoaSk7CisJCQlpZiAobGluZURlbGltaXRlci5lcXVhbHMoc2VnbWVudCkpIHsKKwkJCQlzZWdtZW50cy5zdWJMaXN0KGkgKyAxLCBzZWdtZW50cy5zaXplKCkpLmNsZWFyKCk7CisJCQkJY2FjaGVkVG9TdHJpbmcgPSBudWxsOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWZvciAoaW50IGogPSAwOyBqIDwgc2VnbWVudC5sZW5ndGgoKTsgaisrKSB7CisJCQkJaWYgKCFXaGl0ZXNwYWNlTWF0Y2hlci5pc1doaXRlc3BhY2Uoc2VnbWVudC5jaGFyQXQoaikpKSB7CisJCQkJCW5ld0xpbmUoKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQlzZWdtZW50cy5jbGVhcigpOworCQljYWNoZWRUb1N0cmluZyA9IG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGNhY2hlZFRvU3RyaW5nICE9IG51bGwpIHsKKwkJCXJldHVybiBjYWNoZWRUb1N0cmluZzsKKwkJfQorCQlMaXN0PFN0cmluZz4gc2lnbmlmaWNhbnRDb250ZW50ID0gZ2V0U2lnbmlmaWNhbnRDb250ZW50KCk7CisJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHNpZ25pZmljYW50Q29udGVudC5zaXplKCkgKiA0KTsKKwkJZm9yIChTdHJpbmcgc2VnbWVudCA6IHNpZ25pZmljYW50Q29udGVudCkKKwkJCWJ1aWxkZXIuYXBwZW5kKHNlZ21lbnQpOworCQljYWNoZWRUb1N0cmluZyA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGNhY2hlZFRvU3RyaW5nOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgYWN0dWFsIGNvbnRlbnQgb2YgdGhpcyBzZXF1ZW5jZSwgaW5jbHVkaW5nIGFsbCB0cmFpbGluZyB3aGl0ZXNwYWNlLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHVuc2FmZSwKKwkgKiB0aGF0IGlzIG1vZGlmaWNhdGlvbiB0byB0aGlzIHtAbGluayBTdHJpbmdDb25jYXRlbmF0aW9ufSB3aWxsIGNhdXNlIGNoYW5nZXMgaW4gYSBwcmV2aW91c2x5IG9idGFpbmVkCisJICogcmVzdWx0IGFuZCB2aWNlIHZlcnNhLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFjdHVhbCBjb250ZW50IG9mIHRoaXMgaW5zdGFuY2UuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBzaW5jZSAyLjgKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxTdHJpbmc+IGdldENvbnRlbnQoKSB7CisJCXJldHVybiBzZWdtZW50czsKKwl9CisKKwkvKioKKwkgKiBDb21wdXRlIHRoZSBzaWduaWZpY2FudCBjb250ZW50IG9mIHRoaXMgc2VxdWVuY2UuIFRoYXQgaXMsIHRyYWlsaW5nIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIGxhc3QgbGluZS1icmVhayB3aWxsIGJlCisJICogaWdub3JlZCBpZiB0aGUgbGFzdCBsaW5lIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZS4gVGhlIHJldHVybiB2YWx1ZSBpcyB1bnNhZmUsIHRoYXQgaXMgbW9kaWZpY2F0aW9uIHRvIHRoaXMKKwkgKiB7QGxpbmsgU3RyaW5nQ29uY2F0ZW5hdGlvbn0gd2lsbCBjYXVzZSBjaGFuZ2VzIGluIGEgcHJldmlvdXNseSBvYnRhaW5lZCByZXN1bHQgYW5kIHZpY2UgdmVyc2EuCisJICogCisJICogQHJldHVybiB0aGUgc2lnbmlmaWNhbnQgY29udGVudCBvZiB0aGlzIGluc3RhbmNlLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGdldFNpZ25pZmljYW50Q29udGVudCgpIHsKKwkJZm9yIChpbnQgaSA9IHNlZ21lbnRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQlTdHJpbmcgc2VnbWVudCA9IHNlZ21lbnRzLmdldChpKTsKKwkJCWlmIChsaW5lRGVsaW1pdGVyLmVxdWFscyhzZWdtZW50KSkgeworCQkJCXJldHVybiBzZWdtZW50cy5zdWJMaXN0KDAsIGkgKyAxKTsKKwkJCX0KKwkJCWZvciAoaW50IGogPSAwOyBqIDwgc2VnbWVudC5sZW5ndGgoKTsgaisrKSB7CisJCQkJaWYgKCFXaGl0ZXNwYWNlTWF0Y2hlci5pc1doaXRlc3BhY2Uoc2VnbWVudC5jaGFyQXQoaikpKSB7CisJCQkJCXJldHVybiBzZWdtZW50czsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHNlZ21lbnRzOworCX0KKworCS8qKgorCSAqIEFsbG93cyBzdWJ0eXBlcyB0byBhY2Nlc3MgdGhlIGNvbmZpZ3VyZWQgbGluZSBkZWxpbWl0ZXIuCisKKwkgKiBAcmV0dXJuIHRoZSBsaW5lIGRlbGltaXRlcgorCSAqIEBzaW5jZSAyLjUKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoKSB7CisJCXJldHVybiBsaW5lRGVsaW1pdGVyOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKiAKKwkgKiA8cD4KKwkgKiBPbmx5IHRoZSBzaWduaWZpY2FudCBjb250ZW50IG9mIHRoaXMgc2VxdWVuY2UgaXMgY29uc2lkZXJlZC4KKwkgKiA8L3A+CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBsZW5ndGgoKSB7CisJCXJldHVybiB0b1N0cmluZygpLmxlbmd0aCgpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKiAKKwkgKiA8cD4KKwkgKiBPbmx5IHRoZSBzaWduaWZpY2FudCBjb250ZW50IG9mIHRoaXMgc2VxdWVuY2UgaXMgY29uc2lkZXJlZC4KKwkgKiA8L3A+CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgeworCQlyZXR1cm4gdG9TdHJpbmcoKS5jaGFyQXQoaW5kZXgpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKiAKKwkgKiA8cD4KKwkgKiBPbmx5IHRoZSBzaWduaWZpY2FudCBjb250ZW50IG9mIHRoaXMgc2VxdWVuY2UgaXMgY29uc2lkZXJlZC4KKwkgKiA8L3A+CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJcmV0dXJuIHRvU3RyaW5nKCkuc3ViU2VxdWVuY2Uoc3RhcnQsIGVuZCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgbGlzdCBvZiBzZWdtZW50cyB3aGVyZSBlYWNoIHNlZ21lbnQgaXMgZWl0aGVyIHRoZSBjb250ZW50IG9mIGEgbGluZSBpbiB0aGUgZ2l2ZW4gdGV4dCBvciBhIGxpbmUtYnJlYWsKKwkgKiBhY2NvcmRpbmcgdG8gdGhlIGNvbmZpZ3VyZWQgZGVsaW1pdGVyLiBFeGlzdGluZyBsaW5lLWJyZWFrcyBpbiB0aGUgdGV4dCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoaXMncworCSAqIGluc3RhbmNlcyBkZWxpbWl0ZXIuCisJICogCisJICogQHBhcmFtIHRleHQKKwkgKiAgICAgICAgICAgIHRoZSB0by1iZS1zcGxpdHRlZCB0ZXh0LiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhIGxpc3Qgb2Ygc2VnbWVudHMuIElzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gc3BsaXRMaW5lc0FuZE5ld0xpbmVzKFN0cmluZyB0ZXh0KSB7CisJCWlmICh0ZXh0ID09IG51bGwpCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJCWludCBpZHggPSBpbml0aWFsU2VnbWVudFNpemUodGV4dCk7CisJCWlmIChpZHggPT0gdGV4dC5sZW5ndGgoKSkgeworCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodGV4dCk7CisJCX0KKworCQlyZXR1cm4gY29udGludWVTcGxpdHRpbmcodGV4dCwgaWR4KTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBpbnQgaW5pdGlhbFNlZ21lbnRTaXplKFN0cmluZyB0ZXh0KSB7CisJCWZpbmFsIGludCBsZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOworCQkJaW50IGlkeCA9IDA7CisJCQl3aGlsZSAoaWR4IDwgbGVuZ3RoKSB7CisJCQkJY2hhciBjdXJyZW50Q2hhciA9IHRleHQuY2hhckF0KGlkeCk7CisJCQkJaWYgKGN1cnJlbnRDaGFyID09ICdccicgfHwgY3VycmVudENoYXIgPT0gJ1xuJykgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWR4Kys7CisJCQl9CisKKwkJcmV0dXJuIGlkeDsKKwl9CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBjb250aW51ZVNwbGl0dGluZyhTdHJpbmcgdGV4dCwgaW50IGlkeCkgeworCQlmaW5hbCBpbnQgbGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKKwkJaW50IG5leHRMaW5lT2Zmc2V0ID0gMDsKKworCQlmaW5hbCBMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDUpOworCQl3aGlsZSAoaWR4IDwgbGVuZ3RoKSB7CisJCQljaGFyIGN1cnJlbnRDaGFyID0gdGV4dC5jaGFyQXQoaWR4KTsKKwkJCS8vIGNoZWNrIGZvciBcciBvciBcclxuCisJCQlpZiAoY3VycmVudENoYXIgPT0gJ1xyJykgeworCQkJCWludCBkZWxpbWl0ZXJMZW5ndGggPSAxOworCQkJCWlmIChpZHggKyAxIDwgbGVuZ3RoICYmIHRleHQuY2hhckF0KGlkeCArIDEpID09ICdcbicpIHsKKwkJCQkJZGVsaW1pdGVyTGVuZ3RoKys7CisJCQkJCWlkeCsrOworCQkJCX0KKwkJCQlpbnQgbGluZUxlbmd0aCA9IGlkeCAtIGRlbGltaXRlckxlbmd0aCAtIG5leHRMaW5lT2Zmc2V0ICsgMTsKKwkJCQlyZXN1bHQuYWRkKHRleHQuc3Vic3RyaW5nKG5leHRMaW5lT2Zmc2V0LCBuZXh0TGluZU9mZnNldCArIGxpbmVMZW5ndGgpKTsKKwkJCQlyZXN1bHQuYWRkKGxpbmVEZWxpbWl0ZXIpOworCQkJCW5leHRMaW5lT2Zmc2V0ID0gaWR4ICsgMTsKKwkJCX0gZWxzZSBpZiAoY3VycmVudENoYXIgPT0gJ1xuJykgeworCQkJCWludCBsaW5lTGVuZ3RoID0gaWR4IC0gbmV4dExpbmVPZmZzZXQ7CisJCQkJcmVzdWx0LmFkZCh0ZXh0LnN1YnN0cmluZyhuZXh0TGluZU9mZnNldCwgbmV4dExpbmVPZmZzZXQgKyBsaW5lTGVuZ3RoKSk7CisJCQkJcmVzdWx0LmFkZChsaW5lRGVsaW1pdGVyKTsKKwkJCQluZXh0TGluZU9mZnNldCA9IGlkeCArIDE7CisJCQl9CisJCQlpZHgrKzsKKwkJfQorCQlpZiAobmV4dExpbmVPZmZzZXQgIT0gbGVuZ3RoKSB7CisJCQlpbnQgbGluZUxlbmd0aCA9IGxlbmd0aCAtIG5leHRMaW5lT2Zmc2V0OworCQkJcmVzdWx0LmFkZCh0ZXh0LnN1YnN0cmluZyhuZXh0TGluZU9mZnNldCwgbmV4dExpbmVPZmZzZXQgKyBsaW5lTGVuZ3RoKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBEZWNvcmF0ZXMgYW4gZXhpc3Rpbmcge0BsaW5rIFN0cmluZ0NvbmNhdGVuYXRpb259IGFzIGEge0BsaW5rIFRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb259LgorCSAqIEl0IG1haW50YWlucyB0aGUgaW5kZXggYXQgd2hpY2ggbmV3IGVsZW1lbnRzIHNob3VsZCBpbnNlcnRlZCBpbnRvIHRoZSBleGlzdGluZyBjb25jYXRlbmF0aW9uLgorCSAqIAorCSAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCisJICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2ltcGxlVGFyZ2V0IGltcGxlbWVudHMgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC5UYXJnZXRTdHJpbmdDb25jYXRlbmF0aW9uIHsKKworCQlwcml2YXRlIGZpbmFsIFN0cmluZ0NvbmNhdGVuYXRpb24gdGFyZ2V0OworCQlwcml2YXRlIGZpbmFsIGludCBvZmZzZXRGaXh1cDsKKworCQlwcml2YXRlIFNpbXBsZVRhcmdldChTdHJpbmdDb25jYXRlbmF0aW9uIHRhcmdldCwgaW50IGluZGV4KSB7CisJCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKKwkJCXRoaXMub2Zmc2V0Rml4dXAgPSB0YXJnZXQuc2VnbWVudHMuc2l6ZSgpIC0gaW5kZXg7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBsZW5ndGgoKSB7CisJCQlyZXR1cm4gdGFyZ2V0Lmxlbmd0aCgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBjaGFyIGNoYXJBdChpbnQgaW5kZXgpIHsKKwkJCXJldHVybiB0YXJnZXQuY2hhckF0KGluZGV4KTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgeworCQkJcmV0dXJuIHRhcmdldC5zdWJTZXF1ZW5jZShzdGFydCwgZW5kKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBuZXdMaW5lSWZOb3RFbXB0eSgpIHsKKwkJCXRhcmdldC5uZXdMaW5lSWZOb3RFbXB0eSgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIG5ld0xpbmUoKSB7CisJCQl0YXJnZXQubmV3TGluZSgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGFwcGVuZEltbWVkaWF0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgaW5kZW50YXRpb24pIHsKKwkJCXRhcmdldC5hcHBlbmRJbW1lZGlhdGUob2JqZWN0LCBpbmRlbnRhdGlvbik7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgYXBwZW5kKE9iamVjdCBvYmplY3QsIFN0cmluZyBpbmRlbnRhdGlvbikgeworCQkJaWYgKG9mZnNldEZpeHVwID09IDApCisJCQkJdGFyZ2V0LmFwcGVuZChvYmplY3QsIGluZGVudGF0aW9uKTsKKwkJCWVsc2UKKwkJCQl0YXJnZXQuYXBwZW5kKG9iamVjdCwgaW5kZW50YXRpb24sIHRhcmdldC5zZWdtZW50cy5zaXplKCkgLSBvZmZzZXRGaXh1cCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgYXBwZW5kKE9iamVjdCBvYmplY3QpIHsKKwkJCXRhcmdldC5hcHBlbmQob2JqZWN0LCB0YXJnZXQuc2VnbWVudHMuc2l6ZSgpIC0gb2Zmc2V0Rml4dXApOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBEZWNvcmF0ZXMgYW4gZXhpc3Rpbmcge0BsaW5rIFN0cmluZ0NvbmNhdGVuYXRpb259IGFzIGEge0BsaW5rIFRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb259LgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24ga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gYXQgdGhlIHBvc2l0aW9uIHdoZXJlCisJICogdGhlIGNsaWVudHMgc2hvdWxkIHdyaXRlIGludG8gdGhlIGRlY29yYXRlZCB7QGxpbmsgU3RyaW5nQ29uY2F0ZW5hdGlvbn0uCisJICogCisJICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KKwkgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbmRlbnRlZFRhcmdldCBleHRlbmRzIFNpbXBsZVRhcmdldCB7CisKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaW5kZW50YXRpb247CisKKwkJcHJpdmF0ZSBJbmRlbnRlZFRhcmdldChTdHJpbmdDb25jYXRlbmF0aW9uIHRhcmdldCwgU3RyaW5nIGluZGVudGF0aW9uLCBpbnQgaW5kZXgpIHsKKwkJCXN1cGVyKHRhcmdldCwgaW5kZXgpOworCQkJdGhpcy5pbmRlbnRhdGlvbiA9IGluZGVudGF0aW9uOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIG5ld0xpbmVJZk5vdEVtcHR5KCkgeworCQkJc3VwZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKwkJCXN1cGVyLmFwcGVuZChpbmRlbnRhdGlvbik7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgbmV3TGluZSgpIHsKKwkJCXN1cGVyLm5ld0xpbmUoKTsKKwkJCXN1cGVyLmFwcGVuZChpbmRlbnRhdGlvbik7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgYXBwZW5kSW1tZWRpYXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBpbmRlbnRhdGlvbikgeworCQkJc3VwZXIuYXBwZW5kSW1tZWRpYXRlKG9iamVjdCwgdGhpcy5pbmRlbnRhdGlvbiArIGluZGVudGF0aW9uKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBhcHBlbmQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGluZGVudGF0aW9uKSB7CisJCQlzdXBlci5hcHBlbmQob2JqZWN0LCB0aGlzLmluZGVudGF0aW9uICsgaW5kZW50YXRpb24pOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGFwcGVuZChPYmplY3Qgb2JqZWN0KSB7CisJCQlzdXBlci5hcHBlbmQob2JqZWN0LCBpbmRlbnRhdGlvbik7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kMi9saWIvU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudC5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZDIvbGliL1N0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjI0YzJhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGVuZDIvbGliL1N0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMyBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZDIubGliOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKKworLyoqCisgKiBBIGNhbGxiYWNrIG9iamVjdCB0aGF0IGFsbG93cyB0byByZXVzZSBhbiBleGlzdGluZyB7QGxpbmsgU3RyaW5nQ29uY2F0ZW5hdGlvbn0KKyAqIHRvIGFwcGVuZCBjb250ZW50IHRvIGl0LiBUaGlzIHB1dHMgY2xpZW50cyBpbnRvIHRoZSBwb3NpdGlvbiB0aGF0IHRoZXkgY2FuCisgKiBmdWxseSBjb250cm9sIHRoZSB1c2VkIGluc3RhbmNlLCBlLmcuIHRoZXkgY2FuIHVzZSBhIGN1c3RvbSBsaW5lIGRlbGltaXRlcgorICogb3Igb3ZlcnJpZGUge0BsaW5rIFN0cmluZ0NvbmNhdGVuYXRpb24jZ2V0U3RyaW5nUmVwcmVzZW50YXRpb24oT2JqZWN0KX0uCisgKiAKKyAqIEBhdXRob3IgU2ViYXN0aWFuIFphcm5la293IC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICogQHNpbmNlIDIuNQorICovCisvKgorICogVGhpcyBpcyBkZWxpYmVyYXRlbHkgbW9kZWxlZCBhcyBhbiBhYnN0cmFjdCBjbGFzcyB3aXRob3V0IGFic3RyYWN0IG1ldGhvZHMKKyAqIHRvIGFsbG93IGZvciBiZXR0ZXIgaW50ZXJhY3Rpb24gd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBhY2NlcHQgZnVuY3Rpb25hbAorICogdHlwZXMuCisgKi8KK0BHd3RDb21wYXRpYmxlCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCB7CisJCisJLyoqCisJICogSW1wbGVtZW50b3JzIGhhdmUgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGZlZWQgdGhlIGdpdmVuCisJICogdGFyZ2V0IGluc3RhbmNlLgorCSAqIAorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIHtAbGluayBUYXJnZXRTdHJpbmdDb25jYXRlbmF0aW9ufSB0by1hcHBlbmQtdG8uIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGFwcGVuZFRvKFRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb24gdGFyZ2V0KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2xpZW50cyBoYXZlIHRvIG92ZXJyaWRlIHRoaXMuIik7CisJfQorCQorCS8qKgorCSAqIERlbGVnYXRlcyB0byB7QGxpbmsgI2FwcGVuZFRvKFRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb24pfSB0byBtYWtlIGl0IHB1YmxpY2x5IGFjY2Vzc2libGUuCisJICogCisJICogQHBhcmFtIGNsaWVudAorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50fSBvbiB3aGljaCB7QGxpbmsgI2FwcGVuZFRvKFRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb24pfSBpcworCSAqICAgICAgICAgICAgaW52b2tlZC4KKwkgKiBAcGFyYW0gdGFyZ2V0CisJICogICAgICAgICAgICB0aGUge0BsaW5rIFRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb259IHRvLWFwcGVuZC10by4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHNpbmNlIDIuMTAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQ29uY2F0ZW5hdGlvbkNsaWVudCBjbGllbnQsIFRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb24gdGFyZ2V0KSB7CisJCWNsaWVudC5hcHBlbmRUbyh0YXJnZXQpOworCX0KKworCS8qKgorCSAqIEEge0BsaW5rIFRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb259IG1vZGVscyB0aGUgcHVibGljIGludGVyZmFjZSBvZiBhCisJICoge0BsaW5rIFN0cmluZ0NvbmNhdGVuYXRpb259IHNvIGltcGxlbWVudGF0aW9ucyBvZiB0aGUge0BsaW5rIFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnR9CisJICogY2FuIGFwcGVuZCB0aGVpciBjb250ZW50IHByb3Blcmx5LgorCSAqIAorCSAqIEBzaW5jZSAyLjUKKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIFRhcmdldFN0cmluZ0NvbmNhdGVuYXRpb24gZXh0ZW5kcyBDaGFyU2VxdWVuY2UgeworCisJCS8qKgorCQkgKiBBZGQgYSBuZXdsaW5lIHRvIHRoaXMgc2VxdWVuY2UgYWNjb3JkaW5nIHRvIHRoZSBjb25maWd1cmVkIGxpbmVEZWxpbWl0ZXIgaWYgdGhlIGxhc3QgbGluZSBjb250YWlucworCQkgKiBzb21ldGhpbmcgYmVzaWRlcyB3aGl0ZXNwYWNlLgorCQkgKi8KKwkJdm9pZCBuZXdMaW5lSWZOb3RFbXB0eSgpOworCisJCS8qKgorCQkgKiBBZGQgYSBuZXdsaW5lIHRvIHRoaXMgc2VxdWVuY2UgYWNjb3JkaW5nIHRvIHRoZSBjb25maWd1cmVkIGxpbmVEZWxpbWl0ZXIuCisJCSAqLworCQl2b2lkIG5ld0xpbmUoKTsKKworCQkvKioKKwkJICogQWRkIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIG9iamVjdCB0byB0aGlzIHNlcXVlbmNlIGltbWVkaWF0ZWx5LiBUaGF0IGlzLCBhbGwgdGhlIHRyYWlsaW5nCisJCSAqIHdoaXRlc3BhY2Ugb2YgdGhpcyBzZXF1ZW5jZSB3aWxsIGJlIGlnbm9yZWQgYW5kIHRoZSBzdHJpbmcgaXMgYXBwZW5kZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGxhc3Qgc2VnbWVudCB0aGF0CisJCSAqIGNvbnRhaW5zIHNvbWV0aGluZyBiZXNpZGVzIHdoaXRlc3BhY2UuIFRoZSBnaXZlbiBpbmRlbnRhdGlvbiB3aWxsIGJlIHByZXBlbmRlZCB0byBlYWNoIGxpbmUgZXhjZXB0IHRoZSBmaXJzdCBvbmUKKwkJICogaWYgdGhlIG9iamVjdCBoYXMgYSBtdWx0aS1saW5lIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkJICogCisJCSAqIEBwYXJhbSBvYmplY3QKKwkJICogICAgICAgICAgICB0aGUgdG8tYmUtYXBwZW5kZWQgb2JqZWN0LgorCQkgKiBAcGFyYW0gaW5kZW50YXRpb24KKwkJICogICAgICAgICAgICB0aGUgaW5kZW50YXRpb24gc3RyaW5nIHRoYXQgc2hvdWxkIGJlIHByZXBlbmRlZC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICovCisJCXZvaWQgYXBwZW5kSW1tZWRpYXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBpbmRlbnRhdGlvbik7CisKKwkJLyoqCisJCSAqIEFkZCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBvYmplY3QgdG8gdGhpcyBzZXF1ZW5jZS4gVGhlIGdpdmVuIGluZGVudGF0aW9uIHdpbGwgYmUgcHJlcGVuZGVkIHRvCisJCSAqIGVhY2ggbGluZSBleGNlcHQgdGhlIGZpcnN0IG9uZSBpZiB0aGUgb2JqZWN0IGhhcyBhIG11bHRpLWxpbmUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCQkgKiAKKwkJICogQHBhcmFtIG9iamVjdAorCQkgKiAgICAgICAgICAgIHRoZSBhcHBlbmRlZCBvYmplY3QuCisJCSAqIEBwYXJhbSBpbmRlbnRhdGlvbgorCQkgKiAgICAgICAgICAgIHRoZSBpbmRlbnRhdGlvbiBzdHJpbmcgdGhhdCBzaG91bGQgYmUgcHJlcGVuZGVkLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJdm9pZCBhcHBlbmQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGluZGVudGF0aW9uKTsKKworCQkvKioKKwkJICogQXBwZW5kIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIG9iamVjdCB0byB0aGlzIHNlcXVlbmNlLiBEb2VzIG5vdGhpbmcgaWYgdGhlIG9iamVjdCBpcworCQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICogCisJCSAqIEBwYXJhbSBvYmplY3QKKwkJICogICAgICAgICAgICB0aGUgdG8tYmUtYXBwZW5kZWQgb2JqZWN0LgorCQkgKi8KKwkJdm9pZCBhcHBlbmQoT2JqZWN0IG9iamVjdCk7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kMi9saWIvV2hpdGVzcGFjZU1hdGNoZXIuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRlbmQyL2xpYi9XaGl0ZXNwYWNlTWF0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjQxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZW5kMi9saWIvV2hpdGVzcGFjZU1hdGNoZXIuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE0IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kMi5saWI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlOworCisvKgorICogT24gR1dUIHdlIHVzZSBDaGFyYWN0ZXIuaXNTcGFjZSBpbnN0ZWFkCisgKi8KK0BHd3RDb21wYXRpYmxlKGVtdWxhdGVkID0gdHJ1ZSkKK2NsYXNzIFdoaXRlc3BhY2VNYXRjaGVyIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKGNoYXIgYykgeworCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9BcnJheUV4dGVuc2lvbnMuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0FycmF5RXh0ZW5zaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZjIwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9BcnJheUV4dGVuc2lvbnMuamF2YQpAQCAtMCwwICsxLDEzMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMjAgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dEluY29tcGF0aWJsZTsKKy8qKgorICogQW4gZXh0ZW5zaW9uIGxpYnJhcnkgZm9yIGFycmF5cywgdG8gYmUgdXNlZCB3aXRoIFh0ZW5kLiBJdCBhbGxvd3MgdG8gdXNlIGFuIGFycmF5IHdpdGhvdXQgY29udmVydGluZyBpdCB0byBhIGxpc3QKKyAqIGZpcnN0LgorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKiBAYXV0aG9yIFN0ZXBoYW5lIEdhbGxhbmQgLSBBZGQgb3BlcmF0aW9ucyBvbiAyLWRpbWVuc2lvbiBhcnJheXMuCisgKiBAc2luY2UgMi40CisgKi8KK0BHd3RDb21wYXRpYmxlCitwdWJsaWMgY2xhc3MgQXJyYXlFeHRlbnNpb25zIHsKKworCS8qKgorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICB0aGUgaW5kZXggdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgYXQKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzZXQgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHJldHVybiB0aGUgbmV3IHZhbHVlCisJICogQHNpbmNlIDIuNAorCSAqLworCUBJbmxpbmUoIiQxWyQyXSA9ICQzIikKKwlwdWJsaWMgc3RhdGljIDxULCBFIGV4dGVuZHMgVD4gVCBzZXQoVFtdIGFycmF5LCBpbnQgaW5kZXgsIEUgdmFsdWUpIHsKKwkJYXJyYXlbaW5kZXhdID0gdmFsdWU7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEBwYXJhbSBpbmRleAorCSAqICAgICAgICAgICAgdGhlIGluZGV4CisJICogQHJldHVybiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMVskMl0iKQorCXB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0KFRbXSBhcnJheSwgaW50IGluZGV4KSB7CisJCXJldHVybiBhcnJheVtpbmRleF07CisJfQorCisJLyoqCisJICogQ2xvbmVzIHRoZSBhcnJheS4gQHNlZSB7QGxpbmsgT2JqZWN0I2Nsb25lfQorCSAqIAorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHJldHVybiB0aGUgY2xvbmVkIGFycmF5CisJICogQHNpbmNlIDIuNQorCSAqLworCUBQdXJlCisJQElubGluZSgiJDEuY2xvbmUoKSIpCisJQEd3dEluY29tcGF0aWJsZSgiY2xvbmUiKQorCXB1YmxpYyBzdGF0aWMgPFQ+IFRbXSBjbG9uZShUW10gYXJyYXkpIHsKKwkJcmV0dXJuIGFycmF5LmNsb25lKCk7CisJfQorCisJLy8gQkVHSU4gZ2VuZXJhdGVkIGNvZGUKKwkKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gYXJyYXkKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmxlbmd0aCIpCisJcHVibGljIHN0YXRpYyBpbnQgbGVuZ3RoKE9iamVjdFtdIGFycmF5KSB7CisJCXJldHVybiBhcnJheS5sZW5ndGg7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBhcnJheS4KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEByZXR1cm4gdGhlIGhhc2ggY29kZQorCSAqIEBzaW5jZSAyLjUKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmhhc2hDb2RlKCkiKQorCXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKE9iamVjdFtdIGFycmF5KSB7CisJCXJldHVybiBhcnJheS5oYXNoQ29kZSgpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFycmF5IGFuZCB0aGUgZ2l2ZW4gb3RoZXIgb2JqZWN0IGFyZSBpZGVudGljYWwuCisJICoKKwkgKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KX0KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEBwYXJhbSBvdGhlcgorCSAqICAgICAgICAgICAgdGhlIG90aGVyIGVsZW1lbnQgdG8gY29tcGFyZSB0bworCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdHdvIGdpdmVuIGFyZ3VtZW50IGFyZSBpZGVudGljYWwgCisJICogQHNpbmNlIDIuNQorCSAqLworCUBQdXJlCisJQElubGluZSgiJDEuZXF1YWxzKCQyKSIpCisJcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IG90aGVyKSB7CisJCXJldHVybiBhcnJheS5lcXVhbHMob3RoZXIpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFycmF5IGNvbnRhaW5zIHRoZSBnaXZlbiBlbGVtZW50LgorCSAqIAorCSAqIE1vcmUgZm9ybWFsbHksIHJldHVybnMgPHR0PnRydWU8L3R0PiBpZiBhbmQgb25seSBpZiB0aGlzIGFycmF5IGNvbnRhaW5zCisJICogYXQgbGVhc3Qgb25lIGVsZW1lbnQgPHR0PmU8L3R0PiBzdWNoIHRoYXQKKwkgKiA8dHQ+KG89PW51bGwmbmJzcDs/Jm5ic3A7ZT09bnVsbCZuYnNwOzombmJzcDtvLmVxdWFscyhlKSk8L3R0Pi4KKwkgKgorCSAqIEBwYXJhbSBhcnJheSAKKwkgKiAJCQl0aGUgYXJyYXkgdG8gdGVzdAorCSAqIEBwYXJhbSBvIAorCSAqIAkJCWVsZW1lbnQgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBhcnJheSBpcyB0byBiZSB0ZXN0ZWQKKwkgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBhcnJheSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IG8pIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgeworCQkJaWYgKE9iamVjdHMuZXF1YWxzKGFycmF5W2ldLCBvKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgKKwkgKiAgICAgICAgICAgIHRoZSBpbmRleAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqLworCUBQdXJlCisJQElubGluZSgiJDFbJDJdIikKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0KGJvb2xlYW5bXSBhcnJheSwgaW50IGluZGV4KSB7CisJCXJldHVybiBhcnJheVtpbmRleF07CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICB0aGUgaW5kZXggdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgYXQKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzZXQgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHJldHVybiB0aGUgbmV3IHZhbHVlCisJICovCisJQElubGluZSgiJDFbJDJdID0gJDMiKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXQoYm9vbGVhbltdIGFycmF5LCBpbnQgaW5kZXgsIGJvb2xlYW4gdmFsdWUpIHsKKwkJYXJyYXlbaW5kZXhdID0gdmFsdWU7CisJCXJldHVybiB2YWx1ZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIGFycmF5CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMS5sZW5ndGgiKQorCXB1YmxpYyBzdGF0aWMgaW50IGxlbmd0aChib29sZWFuW10gYXJyYXkpIHsKKwkJcmV0dXJuIGFycmF5Lmxlbmd0aDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGFycmF5LgorCSAqIAorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHJldHVybiB0aGUgaGFzaCBjb2RlCisJICogQHNpbmNlIDIuNQorCSAqLworCUBQdXJlCisJQElubGluZSgiJDEuaGFzaENvZGUoKSIpCisJcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoYm9vbGVhbltdIGFycmF5KSB7CisJCXJldHVybiBhcnJheS5oYXNoQ29kZSgpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFycmF5IGFuZCB0aGUgZ2l2ZW4gb3RoZXIgb2JqZWN0IGFyZSBpZGVudGljYWwuCisJICoKKwkgKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KX0KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEBwYXJhbSBvdGhlcgorCSAqICAgICAgICAgICAgdGhlIG90aGVyIGVsZW1lbnQgdG8gY29tcGFyZSB0bworCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdHdvIGdpdmVuIGFyZ3VtZW50IGFyZSBpZGVudGljYWwgCisJICogQHNpbmNlIDIuNQorCSAqLworCUBQdXJlCisJQElubGluZSgiJDEuZXF1YWxzKCQyKSIpCisJcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhib29sZWFuW10gYXJyYXksIE9iamVjdCBvdGhlcikgeworCQlyZXR1cm4gYXJyYXkuZXF1YWxzKG90aGVyKTsKKwl9CisJCisJLyoqCisJICogQ2xvbmVzIHRoZSBhcnJheS4gQHNlZSB7QGxpbmsgT2JqZWN0I2Nsb25lfQorCSAqIAorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHJldHVybiB0aGUgY2xvbmVkIGFycmF5CisJICogQHNpbmNlIDIuNQorCSAqLworCUBQdXJlCisJQElubGluZSgiJDEuY2xvbmUoKSIpCisJQEd3dEluY29tcGF0aWJsZSgiY2xvbmUiKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbltdIGNsb25lKGJvb2xlYW5bXSBhcnJheSkgeworCQlyZXR1cm4gYXJyYXkuY2xvbmUoKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBhcnJheSBjb250YWlucyB0aGUgZ2l2ZW4gdmFsdWUuIE1vcmUgZm9ybWFsbHksCisJICogcmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIGFuZCBvbmx5IGlmIHRoaXMgYXJyYXkgY29udGFpbnMgYXQgbGVhc3Qgb25lCisJICogZWxlbWVudCA8dHQ+ZTwvdHQ+IHN1Y2ggdGhhdCA8dHQ+dmFsdWU9PWU8L3R0Pi4KKwkgKgorCSAqIEBwYXJhbSBhcnJheSAKKwkgKiAJCQl0aGUgYXJyYXkgdG8gdGVzdAorCSAqIEBwYXJhbSB2YWx1ZSAKKwkgKiAJCQl2YWx1ZSB3aG9zZSBwcmVzZW5jZSBpbiB0aGlzIGFycmF5IGlzIHRvIGJlIHRlc3RlZAorCSAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGlzIGFycmF5IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudAorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKGJvb2xlYW5bXSBhcnJheSwgYm9vbGVhbiB2YWx1ZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICB0aGUgaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxWyQyXSIpCisJcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0KGRvdWJsZVtdIGFycmF5LCBpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIGFycmF5W2luZGV4XTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgKKwkgKiAgICAgICAgICAgIHRoZSBpbmRleCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCBhdAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHNldCBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSBuZXcgdmFsdWUKKwkgKi8KKwlASW5saW5lKCIkMVskMl0gPSAkMyIpCisJcHVibGljIHN0YXRpYyBkb3VibGUgc2V0KGRvdWJsZVtdIGFycmF5LCBpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgeworCQlhcnJheVtpbmRleF0gPSB2YWx1ZTsKKwkJcmV0dXJuIHZhbHVlOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gYXJyYXkKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmxlbmd0aCIpCisJcHVibGljIHN0YXRpYyBpbnQgbGVuZ3RoKGRvdWJsZVtdIGFycmF5KSB7CisJCXJldHVybiBhcnJheS5sZW5ndGg7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBhcnJheS4KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEByZXR1cm4gdGhlIGhhc2ggY29kZQorCSAqIEBzaW5jZSAyLjUKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmhhc2hDb2RlKCkiKQorCXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGRvdWJsZVtdIGFycmF5KSB7CisJCXJldHVybiBhcnJheS5oYXNoQ29kZSgpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFycmF5IGFuZCB0aGUgZ2l2ZW4gb3RoZXIgb2JqZWN0IGFyZSBpZGVudGljYWwuCisJICoKKwkgKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KX0KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEBwYXJhbSBvdGhlcgorCSAqICAgICAgICAgICAgdGhlIG90aGVyIGVsZW1lbnQgdG8gY29tcGFyZSB0bworCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdHdvIGdpdmVuIGFyZ3VtZW50IGFyZSBpZGVudGljYWwgCisJICogQHNpbmNlIDIuNQorCSAqLworCUBQdXJlCisJQElubGluZSgiJDEuZXF1YWxzKCQyKSIpCisJcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhkb3VibGVbXSBhcnJheSwgT2JqZWN0IG90aGVyKSB7CisJCXJldHVybiBhcnJheS5lcXVhbHMob3RoZXIpOworCX0KKwkKKwkvKioKKwkgKiBDbG9uZXMgdGhlIGFycmF5LiBAc2VlIHtAbGluayBPYmplY3QjY2xvbmV9CisJICogCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcmV0dXJuIHRoZSBjbG9uZWQgYXJyYXkKKwkgKiBAc2luY2UgMi41CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMS5jbG9uZSgpIikKKwlAR3d0SW5jb21wYXRpYmxlKCJjbG9uZSIpCisJcHVibGljIHN0YXRpYyBkb3VibGVbXSBjbG9uZShkb3VibGVbXSBhcnJheSkgeworCQlyZXR1cm4gYXJyYXkuY2xvbmUoKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBhcnJheSBjb250YWlucyB0aGUgZ2l2ZW4gdmFsdWUuCisJICogCisJICogTW9yZSBmb3JtYWxseSwgcmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIGFuZCBvbmx5IGlmIHRoaXMgYXJyYXkgY29udGFpbnMKKwkgKiBhdCBsZWFzdCBvbmUgZWxlbWVudCA8dHQ+ZTwvdHQ+IHN1Y2ggdGhhdAorCSAqIDx0dD5qYXZhLmxhbmcuRG91YmxlLmNvbXBhcmUobywmbmJzcDtlKSZuYnNwOz09Jm5ic3A7MCk8L3R0Pi4KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkgCisJICogCQkJdGhlIGFycmF5IHRvIHRlc3QKKwkgKiBAcGFyYW0gdmFsdWUgCisJICogCQkJdmFsdWUgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBhcnJheSBpcyB0byBiZSB0ZXN0ZWQKKwkgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBhcnJheSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhkb3VibGVbXSBhcnJheSwgZG91YmxlIHZhbHVlKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChEb3VibGUuY29tcGFyZShhcnJheVtpXSwgdmFsdWUpID09IDApIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICB0aGUgaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxWyQyXSIpCisJcHVibGljIHN0YXRpYyBmbG9hdCBnZXQoZmxvYXRbXSBhcnJheSwgaW50IGluZGV4KSB7CisJCXJldHVybiBhcnJheVtpbmRleF07CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICB0aGUgaW5kZXggdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgYXQKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzZXQgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHJldHVybiB0aGUgbmV3IHZhbHVlCisJICovCisJQElubGluZSgiJDFbJDJdID0gJDMiKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgc2V0KGZsb2F0W10gYXJyYXksIGludCBpbmRleCwgZmxvYXQgdmFsdWUpIHsKKwkJYXJyYXlbaW5kZXhdID0gdmFsdWU7CisJCXJldHVybiB2YWx1ZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIGFycmF5CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMS5sZW5ndGgiKQorCXB1YmxpYyBzdGF0aWMgaW50IGxlbmd0aChmbG9hdFtdIGFycmF5KSB7CisJCXJldHVybiBhcnJheS5sZW5ndGg7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBhcnJheS4KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEByZXR1cm4gdGhlIGhhc2ggY29kZQorCSAqIEBzaW5jZSAyLjUKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmhhc2hDb2RlKCkiKQorCXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGZsb2F0W10gYXJyYXkpIHsKKwkJcmV0dXJuIGFycmF5Lmhhc2hDb2RlKCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgYXJyYXkgYW5kIHRoZSBnaXZlbiBvdGhlciBvYmplY3QgYXJlIGlkZW50aWNhbC4KKwkgKgorCSAqIERlbGVnYXRlcyB0byB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfQorCSAqIAorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHBhcmFtIG90aGVyCisJICogICAgICAgICAgICB0aGUgb3RoZXIgZWxlbWVudCB0byBjb21wYXJlIHRvCisJICogQHJldHVybiB3aGV0aGVyIHRoZSB0d28gZ2l2ZW4gYXJndW1lbnQgYXJlIGlkZW50aWNhbCAKKwkgKiBAc2luY2UgMi41CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMS5lcXVhbHMoJDIpIikKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKGZsb2F0W10gYXJyYXksIE9iamVjdCBvdGhlcikgeworCQlyZXR1cm4gYXJyYXkuZXF1YWxzKG90aGVyKTsKKwl9CisJCisJLyoqCisJICogQ2xvbmVzIHRoZSBhcnJheS4gQHNlZSB7QGxpbmsgT2JqZWN0I2Nsb25lfQorCSAqIAorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHJldHVybiB0aGUgY2xvbmVkIGFycmF5CisJICogQHNpbmNlIDIuNQorCSAqLworCUBQdXJlCisJQElubGluZSgiJDEuY2xvbmUoKSIpCisJQEd3dEluY29tcGF0aWJsZSgiY2xvbmUiKQorCXB1YmxpYyBzdGF0aWMgZmxvYXRbXSBjbG9uZShmbG9hdFtdIGFycmF5KSB7CisJCXJldHVybiBhcnJheS5jbG9uZSgpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFycmF5IGNvbnRhaW5zIHRoZSBnaXZlbiB2YWx1ZS4KKwkgKiAKKwkgKiBNb3JlIGZvcm1hbGx5LCByZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgYW5kIG9ubHkgaWYgdGhpcyBhcnJheSBjb250YWlucworCSAqIGF0IGxlYXN0IG9uZSBlbGVtZW50IDx0dD5lPC90dD4gc3VjaCB0aGF0CisJICogPHR0PmphdmEubGFuZy5GbG9hdC5jb21wYXJlKG8sJm5ic3A7ZSkmbmJzcDs9PSZuYnNwOzApPC90dD4uCisJICoKKwkgKiBAcGFyYW0gYXJyYXkgCisJICogCQkJdGhlIGFycmF5IHRvIHRlc3QKKwkgKiBAcGFyYW0gdmFsdWUgCisJICogCQkJdmFsdWUgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBhcnJheSBpcyB0byBiZSB0ZXN0ZWQKKwkgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBhcnJheSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhmbG9hdFtdIGFycmF5LCBmbG9hdCB2YWx1ZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoRmxvYXQuY29tcGFyZShhcnJheVtpXSwgdmFsdWUpID09IDApIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICB0aGUgaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxWyQyXSIpCisJcHVibGljIHN0YXRpYyBsb25nIGdldChsb25nW10gYXJyYXksIGludCBpbmRleCkgeworCQlyZXR1cm4gYXJyYXlbaW5kZXhdOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEBwYXJhbSBpbmRleAorCSAqICAgICAgICAgICAgdGhlIGluZGV4IHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IGF0CisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2V0IGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEByZXR1cm4gdGhlIG5ldyB2YWx1ZQorCSAqLworCUBJbmxpbmUoIiQxWyQyXSA9ICQzIikKKwlwdWJsaWMgc3RhdGljIGxvbmcgc2V0KGxvbmdbXSBhcnJheSwgaW50IGluZGV4LCBsb25nIHZhbHVlKSB7CisJCWFycmF5W2luZGV4XSA9IHZhbHVlOworCQlyZXR1cm4gdmFsdWU7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBhcnJheQorCSAqLworCUBQdXJlCisJQElubGluZSgiJDEubGVuZ3RoIikKKwlwdWJsaWMgc3RhdGljIGludCBsZW5ndGgobG9uZ1tdIGFycmF5KSB7CisJCXJldHVybiBhcnJheS5sZW5ndGg7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBhcnJheS4KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEByZXR1cm4gdGhlIGhhc2ggY29kZQorCSAqIEBzaW5jZSAyLjUKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmhhc2hDb2RlKCkiKQorCXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGxvbmdbXSBhcnJheSkgeworCQlyZXR1cm4gYXJyYXkuaGFzaENvZGUoKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBhcnJheSBhbmQgdGhlIGdpdmVuIG90aGVyIG9iamVjdCBhcmUgaWRlbnRpY2FsLgorCSAqCisJICogRGVsZWdhdGVzIHRvIHtAbGluayBPYmplY3QjZXF1YWxzKE9iamVjdCl9CisJICogCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gb3RoZXIKKwkgKiAgICAgICAgICAgIHRoZSBvdGhlciBlbGVtZW50IHRvIGNvbXBhcmUgdG8KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHR3byBnaXZlbiBhcmd1bWVudCBhcmUgaWRlbnRpY2FsIAorCSAqIEBzaW5jZSAyLjUKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmVxdWFscygkMikiKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMobG9uZ1tdIGFycmF5LCBPYmplY3Qgb3RoZXIpIHsKKwkJcmV0dXJuIGFycmF5LmVxdWFscyhvdGhlcik7CisJfQorCQorCS8qKgorCSAqIENsb25lcyB0aGUgYXJyYXkuIEBzZWUge0BsaW5rIE9iamVjdCNjbG9uZX0KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEByZXR1cm4gdGhlIGNsb25lZCBhcnJheQorCSAqIEBzaW5jZSAyLjUKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmNsb25lKCkiKQorCUBHd3RJbmNvbXBhdGlibGUoImNsb25lIikKKwlwdWJsaWMgc3RhdGljIGxvbmdbXSBjbG9uZShsb25nW10gYXJyYXkpIHsKKwkJcmV0dXJuIGFycmF5LmNsb25lKCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgYXJyYXkgY29udGFpbnMgdGhlIGdpdmVuIHZhbHVlLgorCSAqIAorCSAqIE1vcmUgZm9ybWFsbHksIHJldHVybnMgPHR0PnRydWU8L3R0PiBpZiBhbmQgb25seSBpZiB0aGlzIGFycmF5IGNvbnRhaW5zCisJICogYXQgbGVhc3Qgb25lIGVsZW1lbnQgPHR0PmU8L3R0PiBzdWNoIHRoYXQKKwkgKiA8dHQ+KHZhbHVlJm5ic3A7PT0mbmJzcDtlKTwvdHQ+LgorCSAqCisJICogQHBhcmFtIGFycmF5IAorCSAqIAkJCXRoZSBhcnJheSB0byB0ZXN0CisJICogQHBhcmFtIHZhbHVlIAorCSAqIAkJCWVsZW1lbnQgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBhcnJheSBpcyB0byBiZSB0ZXN0ZWQKKwkgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBhcnJheSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhsb25nW10gYXJyYXksIGxvbmcgdmFsdWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgeworCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEBwYXJhbSBpbmRleAorCSAqICAgICAgICAgICAgdGhlIGluZGV4CisJICogQHJldHVybiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMVskMl0iKQorCXB1YmxpYyBzdGF0aWMgaW50IGdldChpbnRbXSBhcnJheSwgaW50IGluZGV4KSB7CisJCXJldHVybiBhcnJheVtpbmRleF07CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICB0aGUgaW5kZXggdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgYXQKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzZXQgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHJldHVybiB0aGUgbmV3IHZhbHVlCisJICovCisJQElubGluZSgiJDFbJDJdID0gJDMiKQorCXB1YmxpYyBzdGF0aWMgaW50IHNldChpbnRbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKKwkJYXJyYXlbaW5kZXhdID0gdmFsdWU7CisJCXJldHVybiB2YWx1ZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIGFycmF5CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMS5sZW5ndGgiKQorCXB1YmxpYyBzdGF0aWMgaW50IGxlbmd0aChpbnRbXSBhcnJheSkgeworCQlyZXR1cm4gYXJyYXkubGVuZ3RoOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gYXJyYXkuCisJICogCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUKKwkgKiBAc2luY2UgMi41CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMS5oYXNoQ29kZSgpIikKKwlwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShpbnRbXSBhcnJheSkgeworCQlyZXR1cm4gYXJyYXkuaGFzaENvZGUoKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBhcnJheSBhbmQgdGhlIGdpdmVuIG90aGVyIG9iamVjdCBhcmUgaWRlbnRpY2FsLgorCSAqCisJICogRGVsZWdhdGVzIHRvIHtAbGluayBPYmplY3QjZXF1YWxzKE9iamVjdCl9CisJICogCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gb3RoZXIKKwkgKiAgICAgICAgICAgIHRoZSBvdGhlciBlbGVtZW50IHRvIGNvbXBhcmUgdG8KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHR3byBnaXZlbiBhcmd1bWVudCBhcmUgaWRlbnRpY2FsIAorCSAqIEBzaW5jZSAyLjUKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmVxdWFscygkMikiKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoaW50W10gYXJyYXksIE9iamVjdCBvdGhlcikgeworCQlyZXR1cm4gYXJyYXkuZXF1YWxzKG90aGVyKTsKKwl9CisJCisJLyoqCisJICogQ2xvbmVzIHRoZSBhcnJheS4gQHNlZSB7QGxpbmsgT2JqZWN0I2Nsb25lfQorCSAqIAorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHJldHVybiB0aGUgY2xvbmVkIGFycmF5CisJICogQHNpbmNlIDIuNQorCSAqLworCUBQdXJlCisJQElubGluZSgiJDEuY2xvbmUoKSIpCisJQEd3dEluY29tcGF0aWJsZSgiY2xvbmUiKQorCXB1YmxpYyBzdGF0aWMgaW50W10gY2xvbmUoaW50W10gYXJyYXkpIHsKKwkJcmV0dXJuIGFycmF5LmNsb25lKCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgYXJyYXkgY29udGFpbnMgdGhlIGdpdmVuIHZhbHVlLgorCSAqIAorCSAqIE1vcmUgZm9ybWFsbHksIHJldHVybnMgPHR0PnRydWU8L3R0PiBpZiBhbmQgb25seSBpZiB0aGlzIGFycmF5IGNvbnRhaW5zCisJICogYXQgbGVhc3Qgb25lIGVsZW1lbnQgPHR0PmU8L3R0PiBzdWNoIHRoYXQKKwkgKiA8dHQ+KHZhbHVlJm5ic3A7PT0mbmJzcDtlKTwvdHQ+LgorCSAqCisJICogQHBhcmFtIGFycmF5IAorCSAqIAkJCXRoZSBhcnJheSB0byB0ZXN0CisJICogQHBhcmFtIHZhbHVlIAorCSAqIAkJCXZhbHVlIHdob3NlIHByZXNlbmNlIGluIHRoaXMgYXJyYXkgaXMgdG8gYmUgdGVzdGVkCisJICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgYXJyYXkgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50CisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoaW50W10gYXJyYXksIGludCB2YWx1ZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICB0aGUgaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxWyQyXSIpCisJcHVibGljIHN0YXRpYyBjaGFyIGdldChjaGFyW10gYXJyYXksIGludCBpbmRleCkgeworCQlyZXR1cm4gYXJyYXlbaW5kZXhdOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEBwYXJhbSBpbmRleAorCSAqICAgICAgICAgICAgdGhlIGluZGV4IHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IGF0CisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2V0IGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEByZXR1cm4gdGhlIG5ldyB2YWx1ZQorCSAqLworCUBJbmxpbmUoIiQxWyQyXSA9ICQzIikKKwlwdWJsaWMgc3RhdGljIGNoYXIgc2V0KGNoYXJbXSBhcnJheSwgaW50IGluZGV4LCBjaGFyIHZhbHVlKSB7CisJCWFycmF5W2luZGV4XSA9IHZhbHVlOworCQlyZXR1cm4gdmFsdWU7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBhcnJheQorCSAqLworCUBQdXJlCisJQElubGluZSgiJDEubGVuZ3RoIikKKwlwdWJsaWMgc3RhdGljIGludCBsZW5ndGgoY2hhcltdIGFycmF5KSB7CisJCXJldHVybiBhcnJheS5sZW5ndGg7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBhcnJheS4KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEByZXR1cm4gdGhlIGhhc2ggY29kZQorCSAqIEBzaW5jZSAyLjUKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmhhc2hDb2RlKCkiKQorCXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGNoYXJbXSBhcnJheSkgeworCQlyZXR1cm4gYXJyYXkuaGFzaENvZGUoKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBhcnJheSBhbmQgdGhlIGdpdmVuIG90aGVyIG9iamVjdCBhcmUgaWRlbnRpY2FsLgorCSAqCisJICogRGVsZWdhdGVzIHRvIHtAbGluayBPYmplY3QjZXF1YWxzKE9iamVjdCl9CisJICogCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gb3RoZXIKKwkgKiAgICAgICAgICAgIHRoZSBvdGhlciBlbGVtZW50IHRvIGNvbXBhcmUgdG8KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHR3byBnaXZlbiBhcmd1bWVudCBhcmUgaWRlbnRpY2FsIAorCSAqIEBzaW5jZSAyLjUKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmVxdWFscygkMikiKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoY2hhcltdIGFycmF5LCBPYmplY3Qgb3RoZXIpIHsKKwkJcmV0dXJuIGFycmF5LmVxdWFscyhvdGhlcik7CisJfQorCQorCS8qKgorCSAqIENsb25lcyB0aGUgYXJyYXkuIEBzZWUge0BsaW5rIE9iamVjdCNjbG9uZX0KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEByZXR1cm4gdGhlIGNsb25lZCBhcnJheQorCSAqIEBzaW5jZSAyLjUKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmNsb25lKCkiKQorCUBHd3RJbmNvbXBhdGlibGUoImNsb25lIikKKwlwdWJsaWMgc3RhdGljIGNoYXJbXSBjbG9uZShjaGFyW10gYXJyYXkpIHsKKwkJcmV0dXJuIGFycmF5LmNsb25lKCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgYXJyYXkgY29udGFpbnMgdGhlIGdpdmVuIHZhbHVlLgorCSAqIAorCSAqIE1vcmUgZm9ybWFsbHksIHJldHVybnMgPHR0PnRydWU8L3R0PiBpZiBhbmQgb25seSBpZiB0aGlzIGFycmF5IGNvbnRhaW5zCisJICogYXQgbGVhc3Qgb25lIGVsZW1lbnQgPHR0PmU8L3R0PiBzdWNoIHRoYXQKKwkgKiA8dHQ+KHZhbHVlJm5ic3A7PT0mbmJzcDtlKTwvdHQ+LgorCSAqCisJICogQHBhcmFtIGFycmF5IAorCSAqIAkJCXRoZSBhcnJheSB0byB0ZXN0CisJICogQHBhcmFtIHZhbHVlIAorCSAqIAkJCXZhbHVlIHdob3NlIHByZXNlbmNlIGluIHRoaXMgYXJyYXkgaXMgdG8gYmUgdGVzdGVkCisJICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgYXJyYXkgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50CisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgKKwkgKiAgICAgICAgICAgIHRoZSBpbmRleAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqLworCUBQdXJlCisJQElubGluZSgiJDFbJDJdIikKKwlwdWJsaWMgc3RhdGljIHNob3J0IGdldChzaG9ydFtdIGFycmF5LCBpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIGFycmF5W2luZGV4XTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgKKwkgKiAgICAgICAgICAgIHRoZSBpbmRleCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCBhdAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHNldCBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSBuZXcgdmFsdWUKKwkgKi8KKwlASW5saW5lKCIkMVskMl0gPSAkMyIpCisJcHVibGljIHN0YXRpYyBzaG9ydCBzZXQoc2hvcnRbXSBhcnJheSwgaW50IGluZGV4LCBzaG9ydCB2YWx1ZSkgeworCQlhcnJheVtpbmRleF0gPSB2YWx1ZTsKKwkJcmV0dXJuIHZhbHVlOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gYXJyYXkKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmxlbmd0aCIpCisJcHVibGljIHN0YXRpYyBpbnQgbGVuZ3RoKHNob3J0W10gYXJyYXkpIHsKKwkJcmV0dXJuIGFycmF5Lmxlbmd0aDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGFycmF5LgorCSAqIAorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHJldHVybiB0aGUgaGFzaCBjb2RlCisJICogQHNpbmNlIDIuNQorCSAqLworCUBQdXJlCisJQElubGluZSgiJDEuaGFzaENvZGUoKSIpCisJcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoc2hvcnRbXSBhcnJheSkgeworCQlyZXR1cm4gYXJyYXkuaGFzaENvZGUoKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBhcnJheSBhbmQgdGhlIGdpdmVuIG90aGVyIG9iamVjdCBhcmUgaWRlbnRpY2FsLgorCSAqCisJICogRGVsZWdhdGVzIHRvIHtAbGluayBPYmplY3QjZXF1YWxzKE9iamVjdCl9CisJICogCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gb3RoZXIKKwkgKiAgICAgICAgICAgIHRoZSBvdGhlciBlbGVtZW50IHRvIGNvbXBhcmUgdG8KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHR3byBnaXZlbiBhcmd1bWVudCBhcmUgaWRlbnRpY2FsIAorCSAqIEBzaW5jZSAyLjUKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmVxdWFscygkMikiKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoc2hvcnRbXSBhcnJheSwgT2JqZWN0IG90aGVyKSB7CisJCXJldHVybiBhcnJheS5lcXVhbHMob3RoZXIpOworCX0KKwkKKwkvKioKKwkgKiBDbG9uZXMgdGhlIGFycmF5LiBAc2VlIHtAbGluayBPYmplY3QjY2xvbmV9CisJICogCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcmV0dXJuIHRoZSBjbG9uZWQgYXJyYXkKKwkgKiBAc2luY2UgMi41CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMS5jbG9uZSgpIikKKwlAR3d0SW5jb21wYXRpYmxlKCJjbG9uZSIpCisJcHVibGljIHN0YXRpYyBzaG9ydFtdIGNsb25lKHNob3J0W10gYXJyYXkpIHsKKwkJcmV0dXJuIGFycmF5LmNsb25lKCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgYXJyYXkgY29udGFpbnMgdGhlIGdpdmVuIHZhbHVlLgorCSAqIAorCSAqIE1vcmUgZm9ybWFsbHksIHJldHVybnMgPHR0PnRydWU8L3R0PiBpZiBhbmQgb25seSBpZiB0aGlzIGFycmF5IGNvbnRhaW5zCisJICogYXQgbGVhc3Qgb25lIGVsZW1lbnQgPHR0PmU8L3R0PiBzdWNoIHRoYXQKKwkgKiA8dHQ+KHZhbHVlJm5ic3A7PT0mbmJzcDtlKTwvdHQ+LgorCSAqCisJICogQHBhcmFtIGFycmF5IAorCSAqIAkJCXRoZSBhcnJheSB0byB0ZXN0CisJICogQHBhcmFtIHZhbHVlIAorCSAqIAkJCXZhbHVlIHdob3NlIHByZXNlbmNlIGluIHRoaXMgYXJyYXkgaXMgdG8gYmUgdGVzdGVkCisJICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgYXJyYXkgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50CisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoc2hvcnRbXSBhcnJheSwgc2hvcnQgdmFsdWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgeworCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEBwYXJhbSBpbmRleAorCSAqICAgICAgICAgICAgdGhlIGluZGV4CisJICogQHJldHVybiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMVskMl0iKQorCXB1YmxpYyBzdGF0aWMgYnl0ZSBnZXQoYnl0ZVtdIGFycmF5LCBpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIGFycmF5W2luZGV4XTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgKKwkgKiAgICAgICAgICAgIHRoZSBpbmRleCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCBhdAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHNldCBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSBuZXcgdmFsdWUKKwkgKi8KKwlASW5saW5lKCIkMVskMl0gPSAkMyIpCisJcHVibGljIHN0YXRpYyBieXRlIHNldChieXRlW10gYXJyYXksIGludCBpbmRleCwgYnl0ZSB2YWx1ZSkgeworCQlhcnJheVtpbmRleF0gPSB2YWx1ZTsKKwkJcmV0dXJuIHZhbHVlOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gYXJyYXkKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxLmxlbmd0aCIpCisJcHVibGljIHN0YXRpYyBpbnQgbGVuZ3RoKGJ5dGVbXSBhcnJheSkgeworCQlyZXR1cm4gYXJyYXkubGVuZ3RoOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gYXJyYXkuCisJICogCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUKKwkgKiBAc2luY2UgMi41CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMS5oYXNoQ29kZSgpIikKKwlwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShieXRlW10gYXJyYXkpIHsKKwkJcmV0dXJuIGFycmF5Lmhhc2hDb2RlKCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgYXJyYXkgYW5kIHRoZSBnaXZlbiBvdGhlciBvYmplY3QgYXJlIGlkZW50aWNhbC4KKwkgKgorCSAqIERlbGVnYXRlcyB0byB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfQorCSAqIAorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHBhcmFtIG90aGVyCisJICogICAgICAgICAgICB0aGUgb3RoZXIgZWxlbWVudCB0byBjb21wYXJlIHRvCisJICogQHJldHVybiB3aGV0aGVyIHRoZSB0d28gZ2l2ZW4gYXJndW1lbnQgYXJlIGlkZW50aWNhbCAKKwkgKiBAc2luY2UgMi41CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMS5lcXVhbHMoJDIpIikKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKGJ5dGVbXSBhcnJheSwgT2JqZWN0IG90aGVyKSB7CisJCXJldHVybiBhcnJheS5lcXVhbHMob3RoZXIpOworCX0KKwkKKwkvKioKKwkgKiBDbG9uZXMgdGhlIGFycmF5LiBAc2VlIHtAbGluayBPYmplY3QjY2xvbmV9CisJICogCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcmV0dXJuIHRoZSBjbG9uZWQgYXJyYXkKKwkgKiBAc2luY2UgMi41CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMS5jbG9uZSgpIikKKwlAR3d0SW5jb21wYXRpYmxlKCJjbG9uZSIpCisJcHVibGljIHN0YXRpYyBieXRlW10gY2xvbmUoYnl0ZVtdIGFycmF5KSB7CisJCXJldHVybiBhcnJheS5jbG9uZSgpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFycmF5IGNvbnRhaW5zIHRoZSBnaXZlbiB2YWx1ZS4KKwkgKiAKKwkgKiBNb3JlIGZvcm1hbGx5LCByZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgYW5kIG9ubHkgaWYgdGhpcyBhcnJheSBjb250YWlucworCSAqIGF0IGxlYXN0IG9uZSBlbGVtZW50IDx0dD5lPC90dD4gc3VjaCB0aGF0CisJICogPHR0Pih2YWx1ZSZuYnNwOz09Jm5ic3A7ZSk8L3R0Pi4KKwkgKgorCSAqIEBwYXJhbSBhcnJheSAKKwkgKiAJCQl0aGUgYXJyYXkgdG8gdGVzdAorCSAqIEBwYXJhbSB2YWx1ZSAKKwkgKiAJCQl2YWx1ZSB3aG9zZSBwcmVzZW5jZSBpbiB0aGlzIGFycmF5IGlzIHRvIGJlIHRlc3RlZAorCSAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGlzIGFycmF5IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudAorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKGJ5dGVbXSBhcnJheSwgYnl0ZSB2YWx1ZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorLy8gRU5EIGdlbmVyYXRlZCBjb2RlCisKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEBwYXJhbSBpbmRleDAKKwkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBpbmRleAorCSAqIEBwYXJhbSBpbmRleDEKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAc2luY2UgMi4xNgorCSAqLworCUBQdXJlCisJQElubGluZSgiJDFbJDJdWyQzXSIpCisJcHVibGljIHN0YXRpYyA8VD4gVCBnZXQoVFtdW10gYXJyYXksIGludCBpbmRleDAsIGludCBpbmRleDEpIHsKKwkJcmV0dXJuIGFycmF5W2luZGV4MF1baW5kZXgxXTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgwCisJICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXggdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgYXQKKwkgKiBAcGFyYW0gaW5kZXgxCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIGluZGV4IHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IGF0CisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2V0IGF0IHRoZSBnaXZlbiBpbmRleGVzCisJICogQHJldHVybiB0aGUgbmV3IHZhbHVlCisJICogQHNpbmNlIDIuMTYKKwkgKi8KKwlASW5saW5lKCIkMVskMl1bJDNdID0gJDQiKQorCXB1YmxpYyBzdGF0aWMgPFQsIEUgZXh0ZW5kcyBUPiBUIHNldChUW11bXSBhcnJheSwgaW50IGluZGV4MCwgaW50IGluZGV4MSwgRSB2YWx1ZSkgeworCQlhcnJheVtpbmRleDBdW2luZGV4MV0gPSB2YWx1ZTsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHBhcmFtIGluZGV4MAorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGluZGV4CisJICogQHBhcmFtIGluZGV4MQorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBpbmRleAorCSAqIEByZXR1cm4gdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleGVzCisJICogQHNpbmNlIDIuMTYKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIiQxWyQyXVskM10iKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXQoYm9vbGVhbltdW10gYXJyYXksIGludCBpbmRleDAsIGludCBpbmRleDEpIHsKKwkJcmV0dXJuIGFycmF5W2luZGV4MF1baW5kZXgxXTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgwCisJICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXggdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgYXQKKwkgKiBAcGFyYW0gaW5kZXgxCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIGluZGV4IHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IGF0CisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2V0IGF0IHRoZSBnaXZlbiBpbmRleGVzCisJICogQHJldHVybiB0aGUgbmV3IHZhbHVlCisJICogQHNpbmNlIDIuMTYKKwkgKi8KKwlASW5saW5lKCIkMVskMl1bJDNdID0gJDQiKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXQoYm9vbGVhbltdW10gYXJyYXksIGludCBpbmRleDAsIGludCBpbmRleDEsIGJvb2xlYW4gdmFsdWUpIHsKKwkJYXJyYXlbaW5kZXgwXVtpbmRleDFdID0gdmFsdWU7CisJCXJldHVybiB2YWx1ZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgwCisJICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXgKKwkgKiBAcGFyYW0gaW5kZXgxCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIGluZGV4CisJICogQHJldHVybiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4ZXMKKwkgKiBAc2luY2UgMi4xNgorCSAqLworCUBQdXJlCisJQElubGluZSgiJDFbJDJdWyQzXSIpCisJcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0KGRvdWJsZVtdW10gYXJyYXksIGludCBpbmRleDAsIGludCBpbmRleDEpIHsKKwkJcmV0dXJuIGFycmF5W2luZGV4MF1baW5kZXgxXTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgwCisJICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXggdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgYXQKKwkgKiBAcGFyYW0gaW5kZXgxCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIGluZGV4IHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IGF0CisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2V0IGF0IHRoZSBnaXZlbiBpbmRleGV4CisJICogQHJldHVybiB0aGUgbmV3IHZhbHVlCisJICogQHNpbmNlIDIuMTYKKwkgKi8KKwlASW5saW5lKCIkMVskMl1bJDNdID0gJDQiKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIHNldChkb3VibGVbXVtdIGFycmF5LCBpbnQgaW5kZXgwLCBpbnQgaW5kZXgxLCBkb3VibGUgdmFsdWUpIHsKKwkJYXJyYXlbaW5kZXgwXVtpbmRleDFdID0gdmFsdWU7CisJCXJldHVybiB2YWx1ZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgwCisJICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXgKKwkgKiBAcGFyYW0gaW5kZXgxCisJICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXhlcworCSAqIEBzaW5jZSAyLjE2CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMVskMl1bJDNdIikKKwlwdWJsaWMgc3RhdGljIGZsb2F0IGdldChmbG9hdFtdW10gYXJyYXksIGludCBpbmRleDAsIGludCBpbmRleDEpIHsKKwkJcmV0dXJuIGFycmF5W2luZGV4MF1baW5kZXgxXTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgwCisJICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXggdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgYXQKKwkgKiBAcGFyYW0gaW5kZXgxCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIGluZGV4IHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IGF0CisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2V0IGF0IHRoZSBnaXZlbiBpbmRleGVzCisJICogQHJldHVybiB0aGUgbmV3IHZhbHVlCisJICogQHNpbmNlIDIuMTYKKwkgKi8KKwlASW5saW5lKCIkMVskMl1bJDNdID0gJDQiKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgc2V0KGZsb2F0W11bXSBhcnJheSwgaW50IGluZGV4MCwgaW50IGluZGV4MSwgZmxvYXQgdmFsdWUpIHsKKwkJYXJyYXlbaW5kZXgwXVtpbmRleDFdID0gdmFsdWU7CisJCXJldHVybiB2YWx1ZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgwCisJICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXgKKwkgKiBAcGFyYW0gaW5kZXgxCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIGluZGV4CisJICogQHJldHVybiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4ZXMKKwkgKiBAc2luY2UgMi4xNgorCSAqLworCUBQdXJlCisJQElubGluZSgiJDFbJDJdWyQzXSIpCisJcHVibGljIHN0YXRpYyBsb25nIGdldChsb25nW11bXSBhcnJheSwgaW50IGluZGV4MCwgaW50IGluZGV4MSkgeworCQlyZXR1cm4gYXJyYXlbaW5kZXgwXVtpbmRleDFdOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEBwYXJhbSBpbmRleDAKKwkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBpbmRleCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCBhdAorCSAqIEBwYXJhbSBpbmRleDEKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgaW5kZXggdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgYXQKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzZXQgYXQgdGhlIGdpdmVuIGluZGV4ZXMKKwkgKiBAcmV0dXJuIHRoZSBuZXcgdmFsdWUKKwkgKiBAc2luY2UgMi4xNgorCSAqLworCUBJbmxpbmUoIiQxWyQyXVskM10gPSAkNCIpCisJcHVibGljIHN0YXRpYyBsb25nIHNldChsb25nW11bXSBhcnJheSwgaW50IGluZGV4MCwgaW50IGluZGV4MSwgbG9uZyB2YWx1ZSkgeworCQlhcnJheVtpbmRleDBdW2luZGV4MV0gPSB2YWx1ZTsKKwkJcmV0dXJuIHZhbHVlOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEBwYXJhbSBpbmRleDAKKwkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBpbmRleAorCSAqIEBwYXJhbSBpbmRleDEKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXhlcworCSAqIEBzaW5jZSAyLjE2CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMVskMl0iKQorCXB1YmxpYyBzdGF0aWMgaW50IGdldChpbnRbXVtdIGFycmF5LCBpbnQgaW5kZXgwLCBpbnQgaW5kZXgxKSB7CisJCXJldHVybiBhcnJheVtpbmRleDBdW2luZGV4MV07CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5CisJICogQHBhcmFtIGluZGV4MAorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGluZGV4IHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IGF0CisJICogQHBhcmFtIGluZGV4MQorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBpbmRleCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCBhdAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHNldCBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSBuZXcgdmFsdWUKKwkgKiBAc2luY2UgMi4xNgorCSAqLworCUBJbmxpbmUoIiQxWyQyXVskM10gPSAkNCIpCisJcHVibGljIHN0YXRpYyBpbnQgc2V0KGludFtdW10gYXJyYXksIGludCBpbmRleDAsIGludCBpbmRleDEsIGludCB2YWx1ZSkgeworCQlhcnJheVtpbmRleDBdW2luZGV4MV0gPSB2YWx1ZTsKKwkJcmV0dXJuIHZhbHVlOworCX0KKwkJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgwCisJICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXgKKwkgKiBAcGFyYW0gaW5kZXgxCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIGluZGV4CisJICogQHJldHVybiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4ZXMKKwkgKiBAc2luY2UgMi4xNgorCSAqLworCUBQdXJlCisJQElubGluZSgiJDFbJDJdWyQzXSIpCisJcHVibGljIHN0YXRpYyBjaGFyIGdldChjaGFyW11bXSBhcnJheSwgaW50IGluZGV4MCwgaW50IGluZGV4MSkgeworCQlyZXR1cm4gYXJyYXlbaW5kZXgwXVtpbmRleDFdOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEBwYXJhbSBpbmRleDAKKwkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBpbmRleCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCBhdAorCSAqIEBwYXJhbSBpbmRleDEKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgaW5kZXggdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgYXQKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzZXQgYXQgdGhlIGdpdmVuIGluZGV4ZXMKKwkgKiBAcmV0dXJuIHRoZSBuZXcgdmFsdWUKKwkgKiBAc2luY2UgMi4xNgorCSAqLworCUBJbmxpbmUoIiQxWyQyXVskM10gPSAkNCIpCisJcHVibGljIHN0YXRpYyBjaGFyIHNldChjaGFyW11bXSBhcnJheSwgaW50IGluZGV4MCwgaW50IGluZGV4MSwgY2hhciB2YWx1ZSkgeworCQlhcnJheVtpbmRleDBdW2luZGV4MV0gPSB2YWx1ZTsKKwkJcmV0dXJuIHZhbHVlOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEBwYXJhbSBpbmRleDAKKwkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBpbmRleAorCSAqIEBwYXJhbSBpbmRleDEKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXhlcworCSAqIEBzaW5jZSAyLjE2CisJICovCisJQFB1cmUKKwlASW5saW5lKCIkMVskMl1bJDNdIikKKwlwdWJsaWMgc3RhdGljIHNob3J0IGdldChzaG9ydFtdW10gYXJyYXksIGludCBpbmRleDAsIGludCBpbmRleDEpIHsKKwkJcmV0dXJuIGFycmF5W2luZGV4MF1baW5kZXgxXTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgwCisJICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXggdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgYXQKKwkgKiBAcGFyYW0gaW5kZXgxCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIGluZGV4IHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IGF0CisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2V0IGF0IHRoZSBnaXZlbiBpbmRleGVzCisJICogQHJldHVybiB0aGUgbmV3IHZhbHVlCisJICogQHNpbmNlIDIuMTYKKwkgKi8KKwlASW5saW5lKCIkMVskMl1bJDNdID0gJDQiKQorCXB1YmxpYyBzdGF0aWMgc2hvcnQgc2V0KHNob3J0W11bXSBhcnJheSwgaW50IGluZGV4MCwgaW50IGluZGV4MSwgc2hvcnQgdmFsdWUpIHsKKwkJYXJyYXlbaW5kZXgwXVtpbmRleDFdID0gdmFsdWU7CisJCXJldHVybiB2YWx1ZTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYXJyYXkKKwkgKiBAcGFyYW0gaW5kZXgwCisJICogICAgICAgICAgICB0aGUgZmlyc3QgaW5kZXgKKwkgKiBAcGFyYW0gaW5kZXgxCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIGluZGV4CisJICogQHJldHVybiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4ZXMKKwkgKiBAc2luY2UgMi4xNgorCSAqLworCUBQdXJlCisJQElubGluZSgiJDFbJDJdWyQzXSIpCisJcHVibGljIHN0YXRpYyBieXRlIGdldChieXRlW11bXSBhcnJheSwgaW50IGluZGV4MCwgaW50IGluZGV4MSkgeworCQlyZXR1cm4gYXJyYXlbaW5kZXgwXVtpbmRleDFdOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gYXJyYXkKKwkgKiAgICAgICAgICAgIHRoZSBhcnJheQorCSAqIEBwYXJhbSBpbmRleDAKKwkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBpbmRleCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCBhdAorCSAqIEBwYXJhbSBpbmRleDEKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgaW5kZXggdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgYXQKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzZXQgYXQgdGhlIGdpdmVuIGluZGV4ZXMKKwkgKiBAcmV0dXJuIHRoZSBuZXcgdmFsdWUKKwkgKiBAc2luY2UgMi4xNgorCSAqLworCUBJbmxpbmUoIiQxWyQyXVskM10gPSAkNCIpCisJcHVibGljIHN0YXRpYyBieXRlIHNldChieXRlW11bXSBhcnJheSwgaW50IGluZGV4MCwgaW50IGluZGV4MSwgYnl0ZSB2YWx1ZSkgeworCQlhcnJheVtpbmRleDBdW2luZGV4MV0gPSB2YWx1ZTsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvQXJyYXlMaXRlcmFscy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvQXJyYXlMaXRlcmFscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZDE0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9BcnJheUxpdGVyYWxzLmphdmEKQEAgLTAsMCArMSwyNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKKworLyoqCisgKiBGYWN0b3J5IG1ldGhvZHMgZm9yIGFycmF5cy4KKyAqIAorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlIC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICogQGF1dGhvciBTdGVwaGFuZSBHYWxsYW5kIC0gQWRkIG9wZXJhdGlvbnMgb24gMi1kaW1lbnNpb24gYXJyYXlzLgorICogQHNpbmNlIDIuNAorICovCitAR3d0Q29tcGF0aWJsZQorcHVibGljIGNsYXNzIEFycmF5TGl0ZXJhbHMgeworCisJLyoqCisJICogQHBhcmFtIHNpemUwCisJICogICAgICAgICAgICB0aGUgZmlyc3Qgc2l6ZSBmb3IgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQKKwkgKiBAcGFyYW0gc2l6ZTEKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgc2l6ZSBmb3IgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBnaXZlbiBzaXplcworCSAqIEBzaW5jZSAyLjE2CisJICovCisJQFB1cmUKKwlASW5saW5lKCJuZXcgJDRbJDFdWyQyXSIpCisJcHVibGljIHN0YXRpYyA8VD4gVFtdW10gbmV3QXJyYXlPZlNpemUoaW50IHNpemUwLCBpbnQgc2l6ZTEpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorCQkJCSJUaGlzIG1ldGhvZCByZWxpZXMgb24gdGhlIGlubGluZWQgY29tcGlsYXRpb24gKHNlZSBASW5saW5lIGFubm90YXRpb24pLCBhbmQgY2Fubm90IGJlIHVzZWQgZnJvbSBKYXZhIG9yIHdpdGggYW4gdW5jdXN0b21pemVkIGludGVycHJldGVyLiIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogQHBhcmFtIHNpemUKKwkgKiAgICAgICAgICAgIHRoZSBzaXplIGZvciB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZAorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGdpdmVuIHNpemUKKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKCJuZXcgJDNbJDFdIikKKwlwdWJsaWMgc3RhdGljIDxUPiBUW10gbmV3QXJyYXlPZlNpemUoaW50IHNpemUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorCQkJCSJUaGlzIG1ldGhvZCByZWxpZXMgb24gdGhlIGlubGluZWQgY29tcGlsYXRpb24gKHNlZSBASW5saW5lIGFubm90YXRpb24pLCBhbmQgY2Fubm90IGJlIHVzZWQgZnJvbSBKYXZhIG9yIHdpdGggYW4gdW5jdXN0b21pemVkIGludGVycHJldGVyLiIpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzaXplMAorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHNpemUgZm9yIHRoZSBhcnJheSB0byBiZSBjcmVhdGVkCisJICogQHBhcmFtIHNpemUxCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIHNpemUgZm9yIHRoZSBhcnJheSB0byBiZSBjcmVhdGVkCisJICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZ2l2ZW4gc2l6ZXMKKwkgKiBAc2luY2UgMi4xNgorCSAqLworCUBQdXJlCisJQElubGluZSgibmV3IGNoYXJbJDFdWyQyXSIpCisJcHVibGljIHN0YXRpYyBjaGFyW11bXSBuZXdDaGFyQXJyYXlPZlNpemUoaW50IHNpemUwLCBpbnQgc2l6ZTEpIHsKKwkJcmV0dXJuIG5ldyBjaGFyW3NpemUwXVtzaXplMV07CisJfQorCisJLyoqCisJICogQHBhcmFtIHNpemUKKwkgKiAgICAgICAgICAgIHRoZSBzaXplIGZvciB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZAorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGdpdmVuIHNpemUKKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKCJuZXcgY2hhclskMV0iKQorCXB1YmxpYyBzdGF0aWMgY2hhcltdIG5ld0NoYXJBcnJheU9mU2l6ZShpbnQgc2l6ZSkgeworCQlyZXR1cm4gbmV3IGNoYXJbc2l6ZV07CisJfQorCisJLyoqCisJICogQHBhcmFtIHNpemUwCisJICogICAgICAgICAgICB0aGUgZmlyc3Qgc2l6ZSBmb3IgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQKKwkgKiBAcGFyYW0gc2l6ZTEKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgc2l6ZSBmb3IgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBnaXZlbiBzaXplcworCSAqIEBzaW5jZSAyLjE2CisJICovCisJQFB1cmUKKwlASW5saW5lKCJuZXcgaW50WyQxXVskMl0iKQorCXB1YmxpYyBzdGF0aWMgaW50W11bXSBuZXdJbnRBcnJheU9mU2l6ZShpbnQgc2l6ZTAsIGludCBzaXplMSkgeworCQlyZXR1cm4gbmV3IGludFtzaXplMF1bc2l6ZTFdOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzaXplCisJICogICAgICAgICAgICB0aGUgc2l6ZSBmb3IgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBnaXZlbiBzaXplCisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSgibmV3IGludFskMV0iKQorCXB1YmxpYyBzdGF0aWMgaW50W10gbmV3SW50QXJyYXlPZlNpemUoaW50IHNpemUpIHsKKwkJcmV0dXJuIG5ldyBpbnRbc2l6ZV07CisJfQorCisJLyoqCisJICogQHBhcmFtIHNpemUwCisJICogICAgICAgICAgICB0aGUgZmlyc3Qgc2l6ZSBmb3IgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQKKwkgKiBAcGFyYW0gc2l6ZTEKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgc2l6ZSBmb3IgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBnaXZlbiBzaXplcworCSAqIEBzaW5jZSAyLjE2CisJICovCisJQFB1cmUKKwlASW5saW5lKCJuZXcgYm9vbGVhblskMV1bJDJdIikKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW5bXVtdIG5ld0Jvb2xlYW5BcnJheU9mU2l6ZShpbnQgc2l6ZTAsIGludCBzaXplMSkgeworCQlyZXR1cm4gbmV3IGJvb2xlYW5bc2l6ZTBdW3NpemUxXTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2l6ZQorCSAqICAgICAgICAgICAgdGhlIHNpemUgZm9yIHRoZSBhcnJheSB0byBiZSBjcmVhdGVkCisJICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZ2l2ZW4gc2l6ZQorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIm5ldyBib29sZWFuWyQxXSIpCisJcHVibGljIHN0YXRpYyBib29sZWFuW10gbmV3Qm9vbGVhbkFycmF5T2ZTaXplKGludCBzaXplKSB7CisJCXJldHVybiBuZXcgYm9vbGVhbltzaXplXTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2l6ZTAKKwkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBzaXplIGZvciB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZAorCSAqIEBwYXJhbSBzaXplMQorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBzaXplIGZvciB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZAorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGdpdmVuIHNpemVzCisJICogQHNpbmNlIDIuMTYKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIm5ldyBzaG9ydFskMV1bJDJdIikKKwlwdWJsaWMgc3RhdGljIHNob3J0W11bXSBuZXdTaG9ydEFycmF5T2ZTaXplKGludCBzaXplMCwgaW50IHNpemUxKSB7CisJCXJldHVybiBuZXcgc2hvcnRbc2l6ZTBdW3NpemUxXTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2l6ZQorCSAqICAgICAgICAgICAgdGhlIHNpemUgZm9yIHRoZSBhcnJheSB0byBiZSBjcmVhdGVkCisJICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZ2l2ZW4gc2l6ZQorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIm5ldyBzaG9ydFskMV0iKQorCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBuZXdTaG9ydEFycmF5T2ZTaXplKGludCBzaXplKSB7CisJCXJldHVybiBuZXcgc2hvcnRbc2l6ZV07CisJfQorCisJLyoqCisJICogQHBhcmFtIHNpemUwCisJICogICAgICAgICAgICB0aGUgZmlyc3Qgc2l6ZSBmb3IgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQKKwkgKiBAcGFyYW0gc2l6ZTEKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgc2l6ZSBmb3IgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBnaXZlbiBzaXplcworCSAqIEBzaW5jZSAyLjE2CisJICovCisJQFB1cmUKKwlASW5saW5lKCJuZXcgbG9uZ1skMV1bJDJdIikKKwlwdWJsaWMgc3RhdGljIGxvbmdbXVtdIG5ld0xvbmdBcnJheU9mU2l6ZShpbnQgc2l6ZTAsIGludCBzaXplMSkgeworCQlyZXR1cm4gbmV3IGxvbmdbc2l6ZTBdW3NpemUxXTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2l6ZQorCSAqICAgICAgICAgICAgdGhlIHNpemUgZm9yIHRoZSBhcnJheSB0byBiZSBjcmVhdGVkCisJICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZ2l2ZW4gc2l6ZQorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIm5ldyBsb25nWyQxXSIpCisJcHVibGljIHN0YXRpYyBsb25nW10gbmV3TG9uZ0FycmF5T2ZTaXplKGludCBzaXplKSB7CisJCXJldHVybiBuZXcgbG9uZ1tzaXplXTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2l6ZTAKKwkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBzaXplIGZvciB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZAorCSAqIEBwYXJhbSBzaXplMQorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBzaXplIGZvciB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZAorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGdpdmVuIHNpemVzCisJICogQHNpbmNlIDIuMTYKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIm5ldyBmbG9hdFskMV1bJDJdIikKKwlwdWJsaWMgc3RhdGljIGZsb2F0W11bXSBuZXdGbG9hdEFycmF5T2ZTaXplKGludCBzaXplMCwgaW50IHNpemUxKSB7CisJCXJldHVybiBuZXcgZmxvYXRbc2l6ZTBdW3NpemUxXTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2l6ZQorCSAqICAgICAgICAgICAgdGhlIHNpemUgZm9yIHRoZSBhcnJheSB0byBiZSBjcmVhdGVkCisJICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZ2l2ZW4gc2l6ZQorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIm5ldyBmbG9hdFskMV0iKQorCXB1YmxpYyBzdGF0aWMgZmxvYXRbXSBuZXdGbG9hdEFycmF5T2ZTaXplKGludCBzaXplKSB7CisJCXJldHVybiBuZXcgZmxvYXRbc2l6ZV07CisJfQorCisJLyoqCisJICogQHBhcmFtIHNpemUwCisJICogICAgICAgICAgICB0aGUgZmlyc3Qgc2l6ZSBmb3IgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQKKwkgKiBAcGFyYW0gc2l6ZTEKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgc2l6ZSBmb3IgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBnaXZlbiBzaXplcworCSAqIEBzaW5jZSAyLjE2CisJICovCisJQFB1cmUKKwlASW5saW5lKCJuZXcgZG91YmxlWyQxXVskMl0iKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlW11bXSBuZXdEb3VibGVBcnJheU9mU2l6ZShpbnQgc2l6ZTAsIGludCBzaXplMSkgeworCQlyZXR1cm4gbmV3IGRvdWJsZVtzaXplMF1bc2l6ZTFdOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzaXplCisJICogICAgICAgICAgICB0aGUgc2l6ZSBmb3IgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBnaXZlbiBzaXplCisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSgibmV3IGRvdWJsZVskMV0iKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlW10gbmV3RG91YmxlQXJyYXlPZlNpemUoaW50IHNpemUpIHsKKwkJcmV0dXJuIG5ldyBkb3VibGVbc2l6ZV07CisJfQorCisKKwkvKioKKwkgKiBAcGFyYW0gc2l6ZTAKKwkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBzaXplIGZvciB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZAorCSAqIEBwYXJhbSBzaXplMQorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBzaXplIGZvciB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZAorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGdpdmVuIHNpemVzCisJICogQHNpbmNlIDIuMTYKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUoIm5ldyBieXRlWyQxXVskMl0iKQorCXB1YmxpYyBzdGF0aWMgYnl0ZVtdW10gbmV3Qnl0ZUFycmF5T2ZTaXplKGludCBzaXplMCwgaW50IHNpemUxKSB7CisJCXJldHVybiBuZXcgYnl0ZVtzaXplMF1bc2l6ZTFdOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzaXplCisJICogICAgICAgICAgICB0aGUgc2l6ZSBmb3IgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBnaXZlbiBzaXplCisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSgibmV3IGJ5dGVbJDFdIikKKwlwdWJsaWMgc3RhdGljIGJ5dGVbXSBuZXdCeXRlQXJyYXlPZlNpemUoaW50IHNpemUpIHsKKwkJcmV0dXJuIG5ldyBieXRlW3NpemVdOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0JpZ0RlY2ltYWxFeHRlbnNpb25zLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9CaWdEZWNpbWFsRXh0ZW5zaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZjM5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9CaWdEZWNpbWFsRXh0ZW5zaW9ucy5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5NYXRoQ29udGV4dDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CisKKworLyoqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBsaWJyYXJ5IGZvciB7QGxpbmsgQmlnRGVjaW1hbCBiaWcgZGVjaW1hbCBudW1iZXJzfS4KKyAqIAorICogQGF1dGhvciBKYW4gS29laG5sZWluIC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICovCitAR3d0Q29tcGF0aWJsZSBwdWJsaWMgY2xhc3MgQmlnRGVjaW1hbEV4dGVuc2lvbnMgeworCisJLyoqCisJICogVGhlIHVuYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgQmlnRGVjaW1hbC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIDxjb2RlPi1hPC9jb2RlPgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYX0gaXMgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMS5uZWdhdGUoKSIpCisJcHVibGljIHN0YXRpYyBCaWdEZWNpbWFsIG9wZXJhdG9yX21pbnVzKEJpZ0RlY2ltYWwgYSkgeworCQlyZXR1cm4gYS5uZWdhdGUoKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiAKKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgYSBCaWdEZWNpbWFsLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBiCisJICogICAgICAgICAgICBhIEJpZ0RlY2ltYWwuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiA8Y29kZT5hLmFkZChiKTwvY29kZT4KKwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYge0Bjb2RlIGF9IG9yIHtAY29kZSBifSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQxLmFkZCgkMikiKQorCXB1YmxpYyBzdGF0aWMgQmlnRGVjaW1hbCBvcGVyYXRvcl9wbHVzKEJpZ0RlY2ltYWwgYSwgQmlnRGVjaW1hbCBiKSB7CisJCXJldHVybiBhLmFkZChiKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgYSBCaWdEZWNpbWFsLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBiCisJICogICAgICAgICAgICBhIEJpZ0RlY2ltYWwuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiA8Y29kZT5hLnN1YnRyYWN0KGIpPC9jb2RlPgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYX0gb3Ige0Bjb2RlIGJ9IGlzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDEuc3VidHJhY3QoJDIpIikKKwlwdWJsaWMgc3RhdGljIEJpZ0RlY2ltYWwgb3BlcmF0b3JfbWludXMoQmlnRGVjaW1hbCBhLCBCaWdEZWNpbWFsIGIpIHsKKwkJcmV0dXJuIGEuc3VidHJhY3QoYik7CisJfQorCisJLyoqCisJICogVGhlIDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgYSBCaWdEZWNpbWFsLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBleHBvbmVudAorCSAqICAgICAgICAgICAgdGhlIGV4cG9uZW50LgorCSAqIEByZXR1cm4gPGNvZGU+YS5wb3coYik8L2NvZGU+CisJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHtAY29kZSBhfSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQxLnBvdygkMikiKQorCXB1YmxpYyBzdGF0aWMgQmlnRGVjaW1hbCBvcGVyYXRvcl9wb3dlcihCaWdEZWNpbWFsIGEsIGludCBleHBvbmVudCkgeworCQlyZXR1cm4gYS5wb3coZXhwb25lbnQpOworCX0KKworCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+dGltZXM8L2NvZGU+IG9wZXJhdG9yLiAKKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgYSBCaWdEZWNpbWFsLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBiCisJICogICAgICAgICAgICBhIEJpZ0RlY2ltYWwuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiA8Y29kZT5hLm11bHRpcGx5KGIpPC9jb2RlPgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYX0gb3Ige0Bjb2RlIGJ9IGlzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDEubXVsdGlwbHkoJDIpIikKKwlwdWJsaWMgc3RhdGljIEJpZ0RlY2ltYWwgb3BlcmF0b3JfbXVsdGlwbHkoQmlnRGVjaW1hbCBhLCBCaWdEZWNpbWFsIGIpIHsKKwkJcmV0dXJuIGEubXVsdGlwbHkoYik7CisJfQorCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiAKKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgYSBCaWdEZWNpbWFsLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBiCisJICogICAgICAgICAgICBhIEJpZ0RlY2ltYWwuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiA8Y29kZT5hLmRpdmlkZShiLCBNYXRoQ29udGV4dC5ERUNJTUFMMTI4KTwvY29kZT4KKwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYge0Bjb2RlIGF9IG9yIHtAY29kZSBifSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQxLmRpdmlkZSgkMiwgJDMuREVDSU1BTDEyOCkiLCBpbXBvcnRlZD1NYXRoQ29udGV4dC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIEJpZ0RlY2ltYWwgb3BlcmF0b3JfZGl2aWRlKEJpZ0RlY2ltYWwgYSwgQmlnRGVjaW1hbCBiKSB7CisJCXJldHVybiBhLmRpdmlkZShiLCBNYXRoQ29udGV4dC5ERUNJTUFMMTI4KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9CaWdJbnRlZ2VyRXh0ZW5zaW9ucy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvQmlnSW50ZWdlckV4dGVuc2lvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDVlMWExCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvQmlnSW50ZWdlckV4dGVuc2lvbnMuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWI7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CisKKworLyoqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBsaWJyYXJ5IGZvciB7QGxpbmsgQmlnSW50ZWdlciBiaWcgaW50ZWdyYWwgbnVtYmVyc30uCisgKiAKKyAqIEBhdXRob3IgSmFuIEtvZWhubGVpbiAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqLworQEd3dENvbXBhdGlibGUgcHVibGljIGNsYXNzIEJpZ0ludGVnZXJFeHRlbnNpb25zIHsKKworCS8qKgorCSAqIFRoZSB1bmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgQmlnSW50ZWdlci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIDxjb2RlPi1hPC9jb2RlPgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYX0gaXMgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJQElubGluZSh2YWx1ZT0iJDEubmVnYXRlKCkiKQorCUBQdXJlCisJcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIG9wZXJhdG9yX21pbnVzKEJpZ0ludGVnZXIgYSkgeworCQlyZXR1cm4gYS5uZWdhdGUoKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhIEJpZ0ludGVnZXIuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGIKKwkgKiAgICAgICAgICAgIGEgQmlnSW50ZWdlci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIDxjb2RlPmEuYWRkKGIpPC9jb2RlPgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYX0gb3Ige0Bjb2RlIGJ9IGlzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBJbmxpbmUodmFsdWU9IiQxLmFkZCgkMikiKQorCUBQdXJlCisJcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIG9wZXJhdG9yX3BsdXMoQmlnSW50ZWdlciBhLCBCaWdJbnRlZ2VyIGIpIHsKKwkJcmV0dXJuIGEuYWRkKGIpOworCX0KKworCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhIEJpZ0ludGVnZXIuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGIKKwkgKiAgICAgICAgICAgIGEgQmlnSW50ZWdlci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIDxjb2RlPmEuc3VidHJhY3QoYik8L2NvZGU+CisJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHtAY29kZSBhfSBvciB7QGNvZGUgYn0gaXMgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJQElubGluZSh2YWx1ZT0iJDEuc3VidHJhY3QoJDIpIikKKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlciBvcGVyYXRvcl9taW51cyhCaWdJbnRlZ2VyIGEsIEJpZ0ludGVnZXIgYikgeworCQlyZXR1cm4gYS5zdWJ0cmFjdChiKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhIEJpZ0ludGVnZXIuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGV4cG9uZW50CisJICogICAgICAgICAgICB0aGUgZXhwb25lbnQuCisJICogQHJldHVybiA8Y29kZT5hLnBvdyhiKTwvY29kZT4KKwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYge0Bjb2RlIGF9IDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBJbmxpbmUodmFsdWU9IiQxLnBvdygkMikiKQorCUBQdXJlCisJcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIG9wZXJhdG9yX3Bvd2VyKEJpZ0ludGVnZXIgYSwgaW50IGV4cG9uZW50KSB7CisJCXJldHVybiBhLnBvdyhleHBvbmVudCk7CisJfQorCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT50aW1lczwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgQmlnSW50ZWdlci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgYSBCaWdJbnRlZ2VyLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gPGNvZGU+YS5tdWx0aXBseShiKTwvY29kZT4KKwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYge0Bjb2RlIGF9IG9yIHtAY29kZSBifSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMS5tdWx0aXBseSgkMikiKQorCUBQdXJlCisJcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIG9wZXJhdG9yX211bHRpcGx5KEJpZ0ludGVnZXIgYSwgQmlnSW50ZWdlciBiKSB7CisJCXJldHVybiBhLm11bHRpcGx5KGIpOworCX0KKworCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZGl2aWRlPC9jb2RlPiBvcGVyYXRvci4gCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgQmlnSW50ZWdlci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgYSBCaWdJbnRlZ2VyLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gPGNvZGU+YS5kaXZpZGUoYik8L2NvZGU+CisJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHtAY29kZSBhfSBvciB7QGNvZGUgYn0gaXMgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJQElubGluZSh2YWx1ZT0iJDEuZGl2aWRlKCQyKSIpCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIEJpZ0ludGVnZXIgb3BlcmF0b3JfZGl2aWRlKEJpZ0ludGVnZXIgYSwgQmlnSW50ZWdlciBiKSB7CisJCXJldHVybiBhLmRpdmlkZShiKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIAorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhIEJpZ0ludGVnZXIuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGIKKwkgKiAgICAgICAgICAgIGEgQmlnSW50ZWdlci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIDxjb2RlPmEubW9kKGIpPC9jb2RlPgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYX0gb3Ige0Bjb2RlIGJ9IGlzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBJbmxpbmUodmFsdWU9IiQxLm1vZCgkMikiKQorCUBQdXJlCisJcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIG9wZXJhdG9yX21vZHVsbyhCaWdJbnRlZ2VyIGEsIEJpZ0ludGVnZXIgYikgeworCQlyZXR1cm4gYS5tb2QoYik7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvQm9vbGVhbkV4dGVuc2lvbnMuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0Jvb2xlYW5FeHRlbnNpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxZjJlZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0Jvb2xlYW5FeHRlbnNpb25zLmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkJvb2xlYW5zOworCisKKy8qKgorICogVGhpcyBpcyBhbiBleHRlbnNpb24gbGlicmFyeSBmb3Ige0BsaW5rIEJvb2xlYW4gYm9vbGVhbnN9LgorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKi8KK0BHd3RDb21wYXRpYmxlIHB1YmxpYyBjbGFzcyBCb29sZWFuRXh0ZW5zaW9ucyB7CisKKwkvKioKKwkgKiBUaGUgbG9naWNhbCA8Y29kZT5hbmQ8L2NvZGU+IChjb25qdW5jdGlvbikuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIGphdmEgPGNvZGU+JmFtcDsmYW1wOzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgYm9vbGVhbiB2YWx1ZS4KKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgYW5vdGhlciBib29sZWFuIHZhbHVlLgorCSAqIEByZXR1cm4gPGNvZGU+YSAmYW1wOyZhbXA7IGI8L2NvZGU+CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJiYgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2FuZChib29sZWFuIGEsIGJvb2xlYW4gYikgeworCQlyZXR1cm4gYSAmJiBiOworCX0KKworCS8qKgorCSAqIEEgbG9naWNhbCA8Y29kZT5vcjwvY29kZT4gKGRpc2p1bmN0aW9uKS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgamF2YSA8Y29kZT58fDwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgYm9vbGVhbiB2YWx1ZS4KKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgYW5vdGhlciBib29sZWFuIHZhbHVlLgorCSAqIEByZXR1cm4gPGNvZGU+YSB8fCBiPC9jb2RlPgorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIHx8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9vcihib29sZWFuIGEsIGJvb2xlYW4gYikgeworCQlyZXR1cm4gYSB8fCBiOworCX0KKworCS8qKgorCSAqIFRoZSBsb2dpY2FsIDxjb2RlPm5vdDwvY29kZT4gKG5lZ2F0aW9uKS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgamF2YSA8Y29kZT4hPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgYSBib29sZWFuIHZhbHVlLgorCSAqIEByZXR1cm4gPGNvZGU+IWI8L2NvZGU+CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoISQxKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ub3QoYm9vbGVhbiBiKSB7CisJCXJldHVybiAhYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBqYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgYW4gYm9vbGVhbi4KKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgYW4gYm9vbGVhbi4KKwkgKiBAcmV0dXJuIDxjb2RlPmE9PWI8L2NvZGU+CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhib29sZWFuIGEsIGJvb2xlYW4gYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKworCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIGphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhbiBib29sZWFuLgorCSAqIEBwYXJhbSBiCisJICogICAgICAgICAgICBhbiBib29sZWFuLgorCSAqIEByZXR1cm4gPGNvZGU+YSE9YjwvY29kZT4KKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGJvb2xlYW4gYSwgYm9vbGVhbiBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCisJLyoqCisJICogQSBsb2dpY2FsIDxjb2RlPnhvcjwvY29kZT4uIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIGphdmEgPGNvZGU+XjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgYm9vbGVhbiB2YWx1ZS4KKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgYW5vdGhlciBib29sZWFuIHZhbHVlLgorCSAqIEByZXR1cm4gPGNvZGU+YSBeIGI8L2NvZGU+CisJICovCisJQFB1cmUKKwlASW5saW5lKCIoJDEgXiAkMikiKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB4b3IoYm9vbGVhbiBhLCBib29sZWFuIGIpIHsKKwkJcmV0dXJuIGEgXiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvciBmb3IgYm9vbGVhbiB2YWx1ZXMuCisJICoge0Bjb2RlIGZhbHNlfSBpcyBjb25zaWRlcmVkIGxlc3MgdGhhbiB7QGNvZGUgdHJ1ZX0uCisJICogCisJICogQHNlZSBCb29sZWFuI2NvbXBhcmVUbyhCb29sZWFuKQorCSAqIEBzZWUgQm9vbGVhbnMjY29tcGFyZShib29sZWFuLCBib29sZWFuKQorCSAqIEBwYXJhbSBhICBhIGJvb2xlYW4uCisJICogQHBhcmFtIGIgIGFub3RoZXIgYm9vbGVhbi4KKwkgKiBAcmV0dXJuICAgPGNvZGU+Qm9vbGVhbnMuY29tcGFyZShhLCBiKSZsdDswPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWUgPSAiKCQzLmNvbXBhcmUoJDEsICQyKSA8IDApIiwgaW1wb3J0ZWQgPSBCb29sZWFucy5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oYm9vbGVhbiBhLCBib29sZWFuIGIpIHsKKwkJcmV0dXJuIEJvb2xlYW5zLmNvbXBhcmUoYSwgYikgPCAwOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvciBmb3IgYm9vbGVhbiB2YWx1ZXMuCisJICoge0Bjb2RlIGZhbHNlfSBpcyBjb25zaWRlcmVkIGxlc3MgdGhhbiB7QGNvZGUgdHJ1ZX0uCisJICogCisJICogQHNlZSBCb29sZWFuI2NvbXBhcmVUbyhCb29sZWFuKQorCSAqIEBzZWUgQm9vbGVhbnMjY29tcGFyZShib29sZWFuLCBib29sZWFuKQorCSAqIEBwYXJhbSBhICBhIGJvb2xlYW4uCisJICogQHBhcmFtIGIgIGFub3RoZXIgYm9vbGVhbi4KKwkgKiBAcmV0dXJuICAgPGNvZGU+Qm9vbGVhbnMuY29tcGFyZShhLCBiKSZsdDs9MDwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlID0gIigkMy5jb21wYXJlKCQxLCAkMikgPD0gMCkiLCBpbXBvcnRlZCA9IEJvb2xlYW5zLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihib29sZWFuIGEsIGJvb2xlYW4gYikgeworCQlyZXR1cm4gQm9vbGVhbnMuY29tcGFyZShhLCBiKSA8PSAwOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvciBmb3IgYm9vbGVhbiB2YWx1ZXMuCisJICoge0Bjb2RlIGZhbHNlfSBpcyBjb25zaWRlcmVkIGxlc3MgdGhhbiB7QGNvZGUgdHJ1ZX0uCisJICogCisJICogQHNlZSBCb29sZWFuI2NvbXBhcmVUbyhCb29sZWFuKQorCSAqIEBzZWUgQm9vbGVhbnMjY29tcGFyZShib29sZWFuLCBib29sZWFuKQorCSAqIEBwYXJhbSBhICBhIGJvb2xlYW4uCisJICogQHBhcmFtIGIgIGFub3RoZXIgYm9vbGVhbi4KKwkgKiBAcmV0dXJuICAgPGNvZGU+Qm9vbGVhbnMuY29tcGFyZShhLCBiKSZndDswPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWUgPSAiKCQzLmNvbXBhcmUoJDEsICQyKSA+IDApIiwgaW1wb3J0ZWQgPSBCb29sZWFucy5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlclRoYW4oYm9vbGVhbiBhLCBib29sZWFuIGIpIHsKKwkJcmV0dXJuIEJvb2xlYW5zLmNvbXBhcmUoYSwgYikgPiAwOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvciBmb3IgYm9vbGVhbiB2YWx1ZXMuCisJICoge0Bjb2RlIGZhbHNlfSBpcyBjb25zaWRlcmVkIGxlc3MgdGhhbiB7QGNvZGUgdHJ1ZX0uCisJICogCisJICogQHNlZSBCb29sZWFuI2NvbXBhcmVUbyhCb29sZWFuKQorCSAqIEBzZWUgQm9vbGVhbnMjY29tcGFyZShib29sZWFuLCBib29sZWFuKQorCSAqIEBwYXJhbSBhICBhIGJvb2xlYW4uCisJICogQHBhcmFtIGIgIGFub3RoZXIgYm9vbGVhbi4KKwkgKiBAcmV0dXJuICAgPGNvZGU+Qm9vbGVhbnMuY29tcGFyZShhLCBiKSZndDs9MDwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlID0gIigkMy5jb21wYXJlKCQxLCAkMikgPj0gMCkiLCBpbXBvcnRlZCA9IEJvb2xlYW5zLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihib29sZWFuIGEsIGJvb2xlYW4gYikgeworCQlyZXR1cm4gQm9vbGVhbnMuY29tcGFyZShhLCBiKSA+PSAwOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0J5dGVFeHRlbnNpb25zLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9CeXRlRXh0ZW5zaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNmQ2NDcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9CeXRlRXh0ZW5zaW9ucy5qYXZhCkBAIC0wLDAgKzEsMTQ2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMiBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlOworCisKKy8qKgorICogVGhpcyBpcyBhbiBleHRlbnNpb24gbGlicmFyeSBmb3Ige0BsaW5rIEJ5dGV9IG51bWJlcnMuCisgKiAKKyAqIEBhdXRob3IgSmFuIEtvZWhubGVpbiAtIENvZGUgZ2VuZXJhdG9yCisgKiBAc2luY2UgMi4zCisgKi8KK0BHd3RDb21wYXRpYmxlIHB1YmxpYyBjbGFzcyBCeXRlRXh0ZW5zaW9ucyB7CisJLy8gQkVHSU4gZ2VuZXJhdGVkIGNvZGUKKwkvKioKKwkgKiBUaGUgdW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+LTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+LWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKC0kMSkiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9taW51cyhieXRlIGIpIHsKKwkJcmV0dXJuIC1iOworCX0KKwkKKwkvKioKKwkgKiBUaGUgcG9zdGZpeCA8Y29kZT5kZWNyZW1lbnQ8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+LS08L2NvZGU+IHBvc3RmaXggZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+Yi0tPC9jb2RlPgorCSAqIEBzaW5jZSAyLjYKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMS0tIikKKwlwdWJsaWMgc3RhdGljIGJ5dGUgb3BlcmF0b3JfbWludXNNaW51cyhieXRlIGIpIHsKKwkJdGhyb3cgbmV3IEhhcmRjb2RlZEluSW50ZXJwcmV0ZXJFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogVGhlIHBvc3RmaXggPGNvZGU+ZGVjcmVtZW50PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPi0tPC9jb2RlPiBwb3N0Zml4IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmItLTwvY29kZT4KKwkgKiBAc2luY2UgMi42CisJICovCisJQElubGluZSh2YWx1ZT0iJDEtLSIpCisJcHVibGljIHN0YXRpYyBCeXRlIG9wZXJhdG9yX21pbnVzTWludXMoQnl0ZSBiKSB7CisJCXRocm93IG5ldyBIYXJkY29kZWRJbkludGVycHJldGVyRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIFRoZSBwb3N0Zml4IDxjb2RlPmluY3JlbWVudDwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT4rKzwvY29kZT4gcG9zdGZpeCBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5iKys8L2NvZGU+CisJICogQHNpbmNlIDIuNgorCSAqLworCUBJbmxpbmUodmFsdWU9IiQxKysiKQorCXB1YmxpYyBzdGF0aWMgYnl0ZSBvcGVyYXRvcl9wbHVzUGx1cyhieXRlIGIpIHsKKwkJdGhyb3cgbmV3IEhhcmRjb2RlZEluSW50ZXJwcmV0ZXJFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogVGhlIHBvc3RmaXggPGNvZGU+aW5jcmVtZW50PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPisrPC9jb2RlPiBwb3N0Zml4IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmIrKzwvY29kZT4KKwkgKiBAc2luY2UgMi42CisJICovCisJQElubGluZSh2YWx1ZT0iJDErKyIpCisJcHVibGljIHN0YXRpYyBCeXRlIG9wZXJhdG9yX3BsdXNQbHVzKEJ5dGUgYikgeworCQl0aHJvdyBuZXcgSGFyZGNvZGVkSW5JbnRlcnByZXRlckV4Y2VwdGlvbigpOworCX0KKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcGx1cyhieXRlIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9taW51cyhieXRlIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhIC0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tdWx0aXBseTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9tdWx0aXBseShieXRlIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfZGl2aWRlKGJ5dGUgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmElYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9tb2R1bG8oYnl0ZSBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAlIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKGJ5dGUgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihieXRlIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKGJ5dGUgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihieXRlIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoYnl0ZSBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGJ5dGUgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wb3dlcjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT5NYXRoLnBvdygpPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKGJ5dGUgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhieXRlIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhieXRlIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cGx1czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YStiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfcGx1cyhieXRlIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9taW51cyhieXRlIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgLSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm11bHRpcGx5PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9tdWx0aXBseShieXRlIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgKiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmRpdmlkZTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS9iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAvICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfZGl2aWRlKGJ5dGUgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9tb2R1bG8oYnl0ZSBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhICUgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihieXRlIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGJ5dGUgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKGJ5dGUgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA+IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlckVxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4oYnl0ZSBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhieXRlIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGJ5dGUgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPk1hdGgucG93KCk8L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihieXRlIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGJ5dGUgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhieXRlIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wbHVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfcGx1cyhieXRlIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgbG9uZyBvcGVyYXRvcl9taW51cyhieXRlIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgbG9uZyBvcGVyYXRvcl9tdWx0aXBseShieXRlIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAqIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZGl2aWRlPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4vPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfZGl2aWRlKGJ5dGUgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgbG9uZyBvcGVyYXRvcl9tb2R1bG8oYnl0ZSBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oYnl0ZSBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4oYnl0ZSBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgPD0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKGJ5dGUgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKGJ5dGUgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKGJ5dGUgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bm90RXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4hPTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGJ5dGUgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoYnl0ZSBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoYnl0ZSBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IG5vdCBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT4hPTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhieXRlIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9wbHVzKGJ5dGUgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbWludXMoYnl0ZSBhLCBpbnQgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9tdWx0aXBseShieXRlIGEsIGludCBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9kaXZpZGUoYnl0ZSBhLCBpbnQgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbW9kdWxvKGJ5dGUgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKGJ5dGUgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGJ5dGUgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPD0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihieXRlIGEsIGludCBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihieXRlIGEsIGludCBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhieXRlIGEsIGludCBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bm90RXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4hPTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhieXRlIGEsIGludCBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKGJ5dGUgYSwgaW50IGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGJ5dGUgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IG5vdCBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT4hPTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoYnl0ZSBhLCBpbnQgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfcGx1cyhieXRlIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbWludXMoYnl0ZSBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgLSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm11bHRpcGx5PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX211bHRpcGx5KGJ5dGUgYSwgY2hhciBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfZGl2aWRlKGJ5dGUgYSwgY2hhciBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbW9kdWxvKGJ5dGUgYSwgY2hhciBiKSB7CisJCXJldHVybiBhICUgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oYnl0ZSBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihieXRlIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihieXRlIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA+IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlckVxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKGJ5dGUgYSwgY2hhciBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoYnl0ZSBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhieXRlIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPk1hdGgucG93KCk8L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoYnl0ZSBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhieXRlIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoYnl0ZSBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wbHVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfcGx1cyhieXRlIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbWludXMoYnl0ZSBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhIC0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tdWx0aXBseTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX211bHRpcGx5KGJ5dGUgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSAqIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZGl2aWRlPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4vPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfZGl2aWRlKGJ5dGUgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbW9kdWxvKGJ5dGUgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSAlIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oYnl0ZSBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhIDwgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihieXRlIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPD0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihieXRlIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKGJ5dGUgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSA+PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+PT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoYnl0ZSBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bm90RXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4hPTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhieXRlIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wb3dlcjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT5NYXRoLnBvdygpPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoYnl0ZSBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBNYXRoLnBvdyhhLCBiKTsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPj09PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhieXRlIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IG5vdCBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT4hPTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoYnl0ZSBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cGx1czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfcGx1cyhieXRlIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX21pbnVzKGJ5dGUgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhIC0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tdWx0aXBseTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbXVsdGlwbHkoYnl0ZSBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgKiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmRpdmlkZTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfZGl2aWRlKGJ5dGUgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX21vZHVsbyhieXRlIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSAlIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihieXRlIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihieXRlIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlclRoYW4oYnl0ZSBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgPiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgYnl0ZS4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4oYnl0ZSBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoYnl0ZSBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEhPWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ub3RFcXVhbHMoYnl0ZSBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wb3dlcjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT5NYXRoLnBvdygpPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihieXRlIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBieXRlLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhieXRlIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGJ5dGUuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSAhPSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlTm90RXF1YWxzKGJ5dGUgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8vIEVORCBnZW5lcmF0ZWQgY29kZQorfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvQ2hhcmFjdGVyRXh0ZW5zaW9ucy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvQ2hhcmFjdGVyRXh0ZW5zaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDdjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9DaGFyYWN0ZXJFeHRlbnNpb25zLmphdmEKQEAgLTAsMCArMSwxNDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CisKKworLyoqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBsaWJyYXJ5IGZvciB7QGxpbmsgQ2hhcmFjdGVyfSBudW1iZXJzLgorICogCisgKiBAYXV0aG9yIEphbiBLb2VobmxlaW4gLSBDb2RlIGdlbmVyYXRvcgorICogQHNpbmNlIDIuMworICovCitAR3d0Q29tcGF0aWJsZSBwdWJsaWMgY2xhc3MgQ2hhcmFjdGVyRXh0ZW5zaW9ucyB7CisJLy8gQkVHSU4gZ2VuZXJhdGVkIGNvZGUKKwkvKioKKwkgKiBUaGUgdW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+LTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGMgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT4tYzwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoLSQxKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX21pbnVzKGNoYXIgYykgeworCQlyZXR1cm4gLWM7CisJfQorCQorCS8qKgorCSAqIFRoZSBwb3N0Zml4IDxjb2RlPmRlY3JlbWVudDwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT4tLTwvY29kZT4gcG9zdGZpeCBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYyAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmMtLTwvY29kZT4KKwkgKiBAc2luY2UgMi42CisJICovCisJQElubGluZSh2YWx1ZT0iJDEtLSIpCisJcHVibGljIHN0YXRpYyBjaGFyIG9wZXJhdG9yX21pbnVzTWludXMoY2hhciBjKSB7CisJCXRocm93IG5ldyBIYXJkY29kZWRJbkludGVycHJldGVyRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIFRoZSBwb3N0Zml4IDxjb2RlPmRlY3JlbWVudDwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT4tLTwvY29kZT4gcG9zdGZpeCBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYyAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmMtLTwvY29kZT4KKwkgKiBAc2luY2UgMi42CisJICovCisJQElubGluZSh2YWx1ZT0iJDEtLSIpCisJcHVibGljIHN0YXRpYyBDaGFyYWN0ZXIgb3BlcmF0b3JfbWludXNNaW51cyhDaGFyYWN0ZXIgYykgeworCQl0aHJvdyBuZXcgSGFyZGNvZGVkSW5JbnRlcnByZXRlckV4Y2VwdGlvbigpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgcG9zdGZpeCA8Y29kZT5pbmNyZW1lbnQ8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+Kys8L2NvZGU+IHBvc3RmaXggZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGMgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5jKys8L2NvZGU+CisJICogQHNpbmNlIDIuNgorCSAqLworCUBJbmxpbmUodmFsdWU9IiQxKysiKQorCXB1YmxpYyBzdGF0aWMgY2hhciBvcGVyYXRvcl9wbHVzUGx1cyhjaGFyIGMpIHsKKwkJdGhyb3cgbmV3IEhhcmRjb2RlZEluSW50ZXJwcmV0ZXJFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogVGhlIHBvc3RmaXggPGNvZGU+aW5jcmVtZW50PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPisrPC9jb2RlPiBwb3N0Zml4IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBjICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YysrPC9jb2RlPgorCSAqIEBzaW5jZSAyLjYKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMSsrIikKKwlwdWJsaWMgc3RhdGljIENoYXJhY3RlciBvcGVyYXRvcl9wbHVzUGx1cyhDaGFyYWN0ZXIgYykgeworCQl0aHJvdyBuZXcgSGFyZGNvZGVkSW5JbnRlcnByZXRlckV4Y2VwdGlvbigpOworCX0KKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wbHVzKGNoYXIgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbWludXMoY2hhciBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9tdWx0aXBseShjaGFyIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9kaXZpZGUoY2hhciBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbW9kdWxvKGNoYXIgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKGNoYXIgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGNoYXIgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPD0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihjaGFyIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihjaGFyIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhjaGFyIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bm90RXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4hPTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhjaGFyIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKGNoYXIgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGNoYXIgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IG5vdCBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT4hPTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoY2hhciBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YStiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfcGx1cyhjaGFyIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX21pbnVzKGNoYXIgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbXVsdGlwbHkoY2hhciBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS9iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAvICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfZGl2aWRlKGNoYXIgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmElYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX21vZHVsbyhjaGFyIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oY2hhciBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhIDwgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGNoYXIgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlclRoYW4oY2hhciBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKGNoYXIgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA+PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+PT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhjaGFyIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmEhPWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ub3RFcXVhbHMoY2hhciBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoY2hhciBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBNYXRoLnBvdyhhLCBiKTsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPj09PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGNoYXIgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSAhPSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlTm90RXF1YWxzKGNoYXIgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX3BsdXMoY2hhciBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgbG9uZyBvcGVyYXRvcl9taW51cyhjaGFyIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX211bHRpcGx5KGNoYXIgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX2RpdmlkZShjaGFyIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgbG9uZyBvcGVyYXRvcl9tb2R1bG8oY2hhciBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihjaGFyIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGNoYXIgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKGNoYXIgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4oY2hhciBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhjaGFyIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGNoYXIgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihjaGFyIGEsIGxvbmcgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGNoYXIgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhjaGFyIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YStiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX3BsdXMoY2hhciBhLCBpbnQgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX21pbnVzKGNoYXIgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgLSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm11bHRpcGx5PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9tdWx0aXBseShjaGFyIGEsIGludCBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS9iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAvICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX2RpdmlkZShjaGFyIGEsIGludCBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX21vZHVsbyhjaGFyIGEsIGludCBiKSB7CisJCXJldHVybiBhICUgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKGNoYXIgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4oY2hhciBhLCBpbnQgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlclRoYW4oY2hhciBhLCBpbnQgYikgeworCQlyZXR1cm4gYSA+IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlckVxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihjaGFyIGEsIGludCBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKGNoYXIgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEhPWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ub3RFcXVhbHMoY2hhciBhLCBpbnQgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPk1hdGgucG93KCk8L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKGNoYXIgYSwgaW50IGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoY2hhciBhLCBpbnQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSAhPSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlTm90RXF1YWxzKGNoYXIgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wbHVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfcGx1cyhjaGFyIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9taW51cyhjaGFyIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9tdWx0aXBseShjaGFyIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAqIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZGl2aWRlPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4vPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfZGl2aWRlKGNoYXIgYSwgY2hhciBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmElYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9tb2R1bG8oY2hhciBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKGNoYXIgYSwgY2hhciBiKSB7CisJCXJldHVybiBhIDwgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihjaGFyIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKGNoYXIgYSwgY2hhciBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihjaGFyIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA+PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+PT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoY2hhciBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGNoYXIgYSwgY2hhciBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKGNoYXIgYSwgY2hhciBiKSB7CisJCXJldHVybiBNYXRoLnBvdyhhLCBiKTsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPj09PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhjaGFyIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhjaGFyIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YStiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX3BsdXMoY2hhciBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbWludXMoY2hhciBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhIC0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tdWx0aXBseTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbXVsdGlwbHkoY2hhciBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS9iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAvICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX2RpdmlkZShjaGFyIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbW9kdWxvKGNoYXIgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSAlIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihjaGFyIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4oY2hhciBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihjaGFyIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4oY2hhciBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKGNoYXIgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhjaGFyIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wb3dlcjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT5NYXRoLnBvdygpPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihjaGFyIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoY2hhciBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoY2hhciBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cGx1czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9wbHVzKGNoYXIgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9taW51cyhjaGFyIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbXVsdGlwbHkoY2hhciBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgKiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmRpdmlkZTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9kaXZpZGUoY2hhciBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmElYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9tb2R1bG8oY2hhciBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihjaGFyIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGNoYXIgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKGNoYXIgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4oY2hhciBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhjaGFyIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGNoYXJhY3Rlci4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGNoYXIgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihjaGFyIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBjaGFyYWN0ZXIuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGNoYXIgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgY2hhcmFjdGVyLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhjaGFyIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvLyBFTkQgZ2VuZXJhdGVkIGNvZGUKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0NvbGxlY3Rpb25FeHRlbnNpb25zLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9Db2xsZWN0aW9uRXh0ZW5zaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZjAxZGQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9Db2xsZWN0aW9uRXh0ZW5zaW9ucy5qYXZhCkBAIC0wLDAgKzEsMzIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDIxIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNvcnRlZE1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNvcnRlZFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHMuKjsKKworLyoqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBsaWJyYXJ5IGZvciB7QGxpbmsgQ29sbGVjdGlvbiBjb2xsZWN0aW9uc30uCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZSAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqIEBhdXRob3IgU2ViYXN0aWFuIFphcm5la293CisgKi8KK0BHd3RDb21wYXRpYmxlIHB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uRXh0ZW5zaW9ucyB7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0b3IgbWFwcGluZyBmcm9tIHtAY29kZSArPX0gdG8ge0BsaW5rIENvbGxlY3Rpb24jYWRkKE9iamVjdCl9LiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZQorCSAqIGNvbGxlY3Rpb24gY2hhbmdlZCBkdWUgdG8gdGhpcyBvcGVyYXRpb24uCisJICogCisJICogQHBhcmFtIGNvbGxlY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSB0by1iZS1jaGFuZ2VkIGNvbGxlY3Rpb24uIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgdmFsdWUgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24uCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGR1ZSB0byB0aGlzIG9wZXJhdGlvbi4KKwkgKiBAc2VlIENvbGxlY3Rpb24jYWRkKE9iamVjdCkKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMS5hZGQoJDIpIikKKwlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIG9wZXJhdG9yX2FkZChDb2xsZWN0aW9uPD8gc3VwZXIgRT4gY29sbGVjdGlvbiwgRSB2YWx1ZSkgeworCQlyZXR1cm4gY29sbGVjdGlvbi5hZGQodmFsdWUpOworCX0KKworCS8qKgorCSAqIFRoZSBvcGVyYXRvciBtYXBwaW5nIGZyb20ge0Bjb2RlICs9fSB0byB7QGxpbmsgI2FkZEFsbChDb2xsZWN0aW9uLCBJdGVyYWJsZSl9LiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZQorCSAqIGNvbGxlY3Rpb24gY2hhbmdlZCBkdWUgdG8gdGhpcyBvcGVyYXRpb24uCisJICogCisJICogQHBhcmFtIGNvbGxlY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSB0by1iZS1jaGFuZ2VkIGNvbGxlY3Rpb24uIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIG5ld0VsZW1lbnRzCisJICogICAgICAgICAgICBlbGVtZW50cyB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb2xsZWN0aW9uLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IGJ1dCBtYXkgY29udGFpbgorCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudHMgaWYgdGhlIHRhcmdldCBjb2xsZWN0aW9uIHN1cHBvcnRzIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnRzLgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBkdWUgdG8gdGhpcyBvcGVyYXRpb24uCisJICogQHNlZSAjYWRkQWxsKENvbGxlY3Rpb24sIEl0ZXJhYmxlKQorCSAqLworCUBJbmxpbmUodmFsdWU9IiQzLiQ0YWRkQWxsKCQxLCAkMikiLCBpbXBvcnRlZD1JdGVyYWJsZXMuY2xhc3MpCisJcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBvcGVyYXRvcl9hZGQoQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbmV3RWxlbWVudHMpIHsKKwkJcmV0dXJuIGFkZEFsbChjb2xsZWN0aW9uLCBuZXdFbGVtZW50cyk7CisJfQorCisJLyoqCisJICogVGhlIG9wZXJhdG9yIG1hcHBpbmcgZnJvbSB7QGNvZGUgLT19IHRvIHtAbGluayBDb2xsZWN0aW9uI3JlbW92ZShPYmplY3QpfS4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUKKwkgKiBjb2xsZWN0aW9uIGNoYW5nZWQgZHVlIHRvIHRoaXMgb3BlcmF0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBjb2xsZWN0aW9uCisJICogICAgICAgICAgICB0aGUgdG8tYmUtY2hhbmdlZCBjb2xsZWN0aW9uLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSB2YWx1ZQorCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGlvbi4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgZHVlIHRvIHRoaXMgb3BlcmF0aW9uLgorCSAqIEBzZWUgQ29sbGVjdGlvbiNyZW1vdmUoT2JqZWN0KQorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMS5yZW1vdmUoJDIpIikKKwlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIG9wZXJhdG9yX3JlbW92ZShDb2xsZWN0aW9uPD8gc3VwZXIgRT4gY29sbGVjdGlvbiwgRSB2YWx1ZSkgeworCQlyZXR1cm4gY29sbGVjdGlvbi5yZW1vdmUodmFsdWUpOworCX0KKworCS8qKgorCSAqIFRoZSBvcGVyYXRvciBtYXBwaW5nIGZyb20ge0Bjb2RlIC09fSB0byB7QGxpbmsgI3JlbW92ZUFsbChDb2xsZWN0aW9uLCBDb2xsZWN0aW9uKX0uIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlCisJICogY29sbGVjdGlvbiBjaGFuZ2VkIGR1ZSB0byB0aGlzIG9wZXJhdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gY29sbGVjdGlvbgorCSAqICAgICAgICAgICAgdGhlIHRvLWJlLWNoYW5nZWQgY29sbGVjdGlvbi4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gbmV3RWxlbWVudHMKKwkgKiAgICAgICAgICAgIGVsZW1lbnRzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGlvbi4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBidXQgbWF5IGNvbnRhaW4KKwkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnRzIGlmIHRoZSB0YXJnZXQgY29sbGVjdGlvbiBzdXBwb3J0cyA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50cy4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgZHVlIHRvIHRoaXMgb3BlcmF0aW9uLgorCSAqIEBzZWUgI3JlbW92ZUFsbChDb2xsZWN0aW9uLCBDb2xsZWN0aW9uKQorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMy5yZW1vdmVBbGwoJDEsICQyKSIsIGltcG9ydGVkPUl0ZXJhYmxlcy5jbGFzcykKKwlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIG9wZXJhdG9yX3JlbW92ZShDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IG5ld0VsZW1lbnRzKSB7CisJCXJldHVybiByZW1vdmVBbGwoY29sbGVjdGlvbiwgbmV3RWxlbWVudHMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIHZpZXcgb2YgdGhlIHNwZWNpZmllZCB7QGNvZGUgbGlzdH0uCisJICogCisJICogQHBhcmFtIGxpc3QKKwkgKiAgICAgICAgICAgIHRoZSBsaXN0IGZvciB3aGljaCBhbiB1bm1vZGlmaWFibGUgdmlldyBpcyB0byBiZSByZXR1cm5lZC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSBzcGVjaWZpZWQgbGlzdC4KKwkgKiBAc2VlIENvbGxlY3Rpb25zI3VubW9kaWZpYWJsZUxpc3QoTGlzdCkKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMi4kM3VubW9kaWZpYWJsZUxpc3QoJDEpIiwgaW1wb3J0ZWQ9Q29sbGVjdGlvbnMuY2xhc3MpCisJcHVibGljIHN0YXRpYyA8VD4gTGlzdDxUPiB1bm1vZGlmaWFibGVWaWV3KExpc3Q8PyBleHRlbmRzIFQ+IGxpc3QpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobGlzdCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgdmlldyBvZiB0aGUgc3BlY2lmaWVkIHtAY29kZSBjb2xsZWN0aW9ufS4KKwkgKiAKKwkgKiBAcGFyYW0gY29sbGVjdGlvbgorCSAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gZm9yIHdoaWNoIGFuIHVubW9kaWZpYWJsZSB2aWV3IGlzIHRvIGJlIHJldHVybmVkLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIHZpZXcgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgorCSAqIEBzZWUgQ29sbGVjdGlvbnMjdW5tb2RpZmlhYmxlQ29sbGVjdGlvbihDb2xsZWN0aW9uKQorCSAqLworCUBJbmxpbmUodmFsdWU9IiQyLiQzdW5tb2RpZmlhYmxlQ29sbGVjdGlvbigkMSkiLCBpbXBvcnRlZD1Db2xsZWN0aW9ucy5jbGFzcykKKwlwdWJsaWMgc3RhdGljIDxUPiBDb2xsZWN0aW9uPFQ+IHVubW9kaWZpYWJsZVZpZXcoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVD4gY29sbGVjdGlvbikgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihjb2xsZWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSBzcGVjaWZpZWQge0Bjb2RlIHNldH0uCisJICogCisJICogQHBhcmFtIHNldAorCSAqICAgICAgICAgICAgdGhlIHNldCBmb3Igd2hpY2ggYW4gdW5tb2RpZmlhYmxlIHZpZXcgaXMgdG8gYmUgcmV0dXJuZWQuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgdmlldyBvZiB0aGUgc3BlY2lmaWVkIHNldC4KKwkgKiBAc2VlIENvbGxlY3Rpb25zI3VubW9kaWZpYWJsZVNldChTZXQpCisJICovCisJQElubGluZSh2YWx1ZT0iJDIuJDN1bm1vZGlmaWFibGVTZXQoJDEpIiwgaW1wb3J0ZWQ9Q29sbGVjdGlvbnMuY2xhc3MpCisJcHVibGljIHN0YXRpYyA8VD4gU2V0PFQ+IHVubW9kaWZpYWJsZVZpZXcoU2V0PD8gZXh0ZW5kcyBUPiBzZXQpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChzZXQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIHZpZXcgb2YgdGhlIHNwZWNpZmllZCBzb3J0ZWQge0Bjb2RlIHNldH0uCisJICogCisJICogQHBhcmFtIHNldAorCSAqICAgICAgICAgICAgdGhlIHNvcnRlZCBzZXQgZm9yIHdoaWNoIGFuIHVubW9kaWZpYWJsZSB2aWV3IGlzIHRvIGJlIHJldHVybmVkLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIHZpZXcgb2YgdGhlIHNwZWNpZmllZCBzb3J0ZWQgc2V0LgorCSAqIEBzZWUgQ29sbGVjdGlvbnMjdW5tb2RpZmlhYmxlU29ydGVkU2V0KFNvcnRlZFNldCkKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMi4kM3VubW9kaWZpYWJsZVNvcnRlZFNldCgkMSkiLCBpbXBvcnRlZD1Db2xsZWN0aW9ucy5jbGFzcykKKwlwdWJsaWMgc3RhdGljIDxUPiBTb3J0ZWRTZXQ8VD4gdW5tb2RpZmlhYmxlVmlldyhTb3J0ZWRTZXQ8VD4gc2V0KSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRTZXQoc2V0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSBzcGVjaWZpZWQge0Bjb2RlIG1hcH0uCisJICogCisJICogQHBhcmFtIG1hcAorCSAqICAgICAgICAgICAgdGhlIG1hcCBmb3Igd2hpY2ggYW4gdW5tb2RpZmlhYmxlIHZpZXcgaXMgdG8gYmUgcmV0dXJuZWQuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgdmlldyBvZiB0aGUgc3BlY2lmaWVkIG1hcC4KKwkgKiBAc2VlIENvbGxlY3Rpb25zI3VubW9kaWZpYWJsZU1hcChNYXApCisJICovCisJQElubGluZSh2YWx1ZT0iJDIuJDN1bm1vZGlmaWFibGVNYXAoJDEpIiwgaW1wb3J0ZWQ9Q29sbGVjdGlvbnMuY2xhc3MpCisJcHVibGljIHN0YXRpYyA8SywgVj4gTWFwPEssIFY+IHVubW9kaWZpYWJsZVZpZXcoTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbWFwKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobWFwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSBzcGVjaWZpZWQgc29ydGVkIHtAY29kZSBtYXB9LgorCSAqIAorCSAqIEBwYXJhbSBtYXAKKwkgKiAgICAgICAgICAgIHRoZSBzb3J0ZWQgbWFwIGZvciB3aGljaCBhbiB1bm1vZGlmaWFibGUgdmlldyBpcyB0byBiZSByZXR1cm5lZC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSBzcGVjaWZpZWQgc29ydGVkIG1hcC4KKwkgKiBAc2VlIENvbGxlY3Rpb25zI3VubW9kaWZpYWJsZVNvcnRlZE1hcChTb3J0ZWRNYXApCisJICovCisJQElubGluZSh2YWx1ZT0iJDIuJDN1bm1vZGlmaWFibGVTb3J0ZWRNYXAoJDEpIiwgaW1wb3J0ZWQ9Q29sbGVjdGlvbnMuY2xhc3MpCisJcHVibGljIHN0YXRpYyA8SywgVj4gU29ydGVkTWFwPEssIFY+IHVubW9kaWZpYWJsZVZpZXcoU29ydGVkTWFwPEssID8gZXh0ZW5kcyBWPiBtYXApIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZE1hcChtYXApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gaW1tdXRhYmxlIGNvcHkgb2YgdGhlIHNwZWNpZmllZCB7QGNvZGUgbGlzdH0uCisJICogCisJICogQHBhcmFtIGxpc3QKKwkgKiAgICAgICAgICAgIHRoZSBsaXN0IGZvciB3aGljaCBhbiBpbW11dGFibGUgY29weSBzaG91bGQgYmUgY3JlYXRlZC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgbGlzdC4KKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMi4kM2NvcHlPZigkMSkiLCBpbXBvcnRlZD1JbW11dGFibGVMaXN0LmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgPFQ+IExpc3Q8VD4gaW1tdXRhYmxlQ29weShMaXN0PD8gZXh0ZW5kcyBUPiBsaXN0KSB7CisJCXJldHVybiBJbW11dGFibGVMaXN0LmNvcHlPZihsaXN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGltbXV0YWJsZSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQge0Bjb2RlIHNldH0uCisJICogCisJICogQHBhcmFtIHNldAorCSAqICAgICAgICAgICAgdGhlIHNldCBmb3Igd2hpY2ggYW4gaW1tdXRhYmxlIGNvcHkgc2hvdWxkIGJlIGNyZWF0ZWQuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhbiBpbW11dGFibGUgY29weSBvZiB0aGUgc3BlY2lmaWVkIHNldC4KKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMi4kM2NvcHlPZigkMSkiLCBpbXBvcnRlZD1JbW11dGFibGVTZXQuY2xhc3MpCisJcHVibGljIHN0YXRpYyA8VD4gU2V0PFQ+IGltbXV0YWJsZUNvcHkoU2V0PD8gZXh0ZW5kcyBUPiBzZXQpIHsKKwkJcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2Yoc2V0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGltbXV0YWJsZSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgc29ydGVkIHtAY29kZSBzZXR9LgorCSAqIAorCSAqIEBwYXJhbSBzZXQKKwkgKiAgICAgICAgICAgIHRoZSBzb3J0ZWQgc2V0IGZvciB3aGljaCBhbiBpbW11dGFibGUgY29weSBzaG91bGQgYmUgY3JlYXRlZC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgc29ydGVkIHNldC4KKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMi4kM2NvcHlPZlNvcnRlZCgkMSkiLCBpbXBvcnRlZD1JbW11dGFibGVTb3J0ZWRTZXQuY2xhc3MpCisJcHVibGljIHN0YXRpYyA8VD4gU29ydGVkU2V0PFQ+IGltbXV0YWJsZUNvcHkoU29ydGVkU2V0PFQ+IHNldCkgeworCQlyZXR1cm4gSW1tdXRhYmxlU29ydGVkU2V0LmNvcHlPZlNvcnRlZChzZXQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gaW1tdXRhYmxlIGNvcHkgb2YgdGhlIHNwZWNpZmllZCB7QGNvZGUgbWFwfS4KKwkgKiAKKwkgKiBAcGFyYW0gbWFwCisJICogICAgICAgICAgICB0aGUgbWFwIGZvciB3aGljaCBhbiBpbW11dGFibGUgY29weSBzaG91bGQgYmUgY3JlYXRlZC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgbWFwLgorCSAqLworCUBJbmxpbmUodmFsdWU9IiQyLiQzY29weU9mKCQxKSIsIGltcG9ydGVkPUltbXV0YWJsZU1hcC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIDxLLCBWPiBNYXA8SywgVj4gaW1tdXRhYmxlQ29weShNYXA8PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWPiBtYXApIHsKKwkJcmV0dXJuIEltbXV0YWJsZU1hcC5jb3B5T2YobWFwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGltbXV0YWJsZSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgc29ydGVkIHtAY29kZSBtYXB9LgorCSAqIAorCSAqIEBwYXJhbSBtYXAKKwkgKiAgICAgICAgICAgIHRoZSBzb3J0ZWQgbWFwIGZvciB3aGljaCBhbiBpbW11dGFibGUgY29weSBzaG91bGQgYmUgY3JlYXRlZC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgc29ydGVkIG1hcC4KKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMi4kM2NvcHlPZlNvcnRlZCgkMSkiLCBpbXBvcnRlZD1JbW11dGFibGVTb3J0ZWRNYXAuY2xhc3MpCisJcHVibGljIHN0YXRpYyA8SywgVj4gU29ydGVkTWFwPEssIFY+IGltbXV0YWJsZUNvcHkoU29ydGVkTWFwPEssID8gZXh0ZW5kcyBWPiBtYXApIHsKKwkJcmV0dXJuIEltbXV0YWJsZVNvcnRlZE1hcC5jb3B5T2ZTb3J0ZWQobWFwKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gY29sbGVjdGlvbgorCSAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gaW50byB3aGljaCB0aGUge0Bjb2RlIGVsZW1lbnRzfSBhcmUgdG8gYmUgaW5zZXJ0ZWQuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGVsZW1lbnRzCisJICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gaW5zZXJ0IGludG8gdGhlIHtAY29kZSBjb2xsZWN0aW9ufS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBidXQgbWF5IGNvbnRhaW4KKwkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGVudHJpZXMgaWYgdGhlIHtAY29kZSBjb2xsZWN0aW9ufSBhbGxvd3MgdGhhdC4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNhbGwKKwkgKi8KKwlAU2FmZVZhcmFyZ3MKKwlwdWJsaWMgc3RhdGljIDxUPiBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gc3VwZXIgVD4gY29sbGVjdGlvbiwgVC4uLiBlbGVtZW50cykgeworCQlyZXR1cm4gY29sbGVjdGlvbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChlbGVtZW50cykpOworCX0KKworCS8qKgorCSAqIEFkZHMgYWxsIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBjb2xsZWN0aW9uCisJICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBpbnRvIHdoaWNoIHRoZSB7QGNvZGUgZWxlbWVudHN9IGFyZSB0byBiZSBpbnNlcnRlZC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gZWxlbWVudHMKKwkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBpbnNlcnQgaW50byB0aGUge0Bjb2RlIGNvbGxlY3Rpb259LiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IGJ1dCBtYXkgY29udGFpbgorCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gZW50cmllcyBpZiB0aGUge0Bjb2RlIGNvbGxlY3Rpb259IGFsbG93cyB0aGF0LgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdCBvZiB0aGUgY2FsbAorCSAqLworCUBJbmxpbmUodmFsdWU9IiQzLiQ0YWRkQWxsKCQxLCAkMikiLCBpbXBvcnRlZD1JdGVyYWJsZXMuY2xhc3MpCisJcHVibGljIHN0YXRpYyA8VD4gYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjxUPiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/IGV4dGVuZHMgVD4gZWxlbWVudHMpIHsKKwkJcmV0dXJuIEl0ZXJhYmxlcy5hZGRBbGwoY29sbGVjdGlvbiwgZWxlbWVudHMpOworCX0KKwkKKwkvKioKKwkgKiBSZW1vdmVzIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBjb2xsZWN0aW9uCisJICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBmcm9tIHdoaWNoIHRoZSB7QGNvZGUgZWxlbWVudHN9IGFyZSB0byBiZSByZW1vdmVkLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBlbGVtZW50cworCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIGJlIHJlbW92ZSBmcm9tIHRoZSB7QGNvZGUgY29sbGVjdGlvbn0uIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gYnV0IG1heSBjb250YWluCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBlbnRyaWVzIGlmIHRoZSB7QGNvZGUgY29sbGVjdGlvbn0gYWxsb3dzIHRoYXQuCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIHRoZSBjYWxsCisJICogQHNpbmNlIDIuNAorCSAqLworCUBTYWZlVmFyYXJncworCXB1YmxpYyBzdGF0aWMgPFQ+IGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248PyBzdXBlciBUPiBjb2xsZWN0aW9uLCBULi4uIGVsZW1lbnRzKSB7CisJCXJldHVybiBjb2xsZWN0aW9uLnJlbW92ZUFsbChBcnJheXMuYXNMaXN0KGVsZW1lbnRzKSk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyBhbGwgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBjb2xsZWN0aW9uCisJICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBmcm9tIHdoaWNoIHRoZSB7QGNvZGUgZWxlbWVudHN9IGFyZSB0byBiZSByZW1vdmVkLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBlbGVtZW50cworCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIHRvIHJlbW92ZSBmcm9tIHRoZSB7QGNvZGUgY29sbGVjdGlvbn0uIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gYnV0IG1heSBjb250YWluCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBlbnRyaWVzIGlmIHRoZSB7QGNvZGUgY29sbGVjdGlvbn0gYWxsb3dzIHRoYXQuCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIHRoZSBjYWxsCisJICogQHNpbmNlIDIuNAorCSAqLworCUBJbmxpbmUodmFsdWU9IiQzLiQ0cmVtb3ZlQWxsKCQxLCAkMikiLCBpbXBvcnRlZD1JdGVyYWJsZXMuY2xhc3MpCisJcHVibGljIHN0YXRpYyA8VD4gYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjxUPiBjb2xsZWN0aW9uLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUPiBlbGVtZW50cykgeworCQlyZXR1cm4gSXRlcmFibGVzLnJlbW92ZUFsbChjb2xsZWN0aW9uLCBlbGVtZW50cyk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyBhbGwgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gY29sbGVjdGlvbgorCSAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gZnJvbSB3aGljaCB0aGUge0Bjb2RlIGVsZW1lbnRzfSBhcmUgdG8gYmUgcmVtb3ZlZC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gZWxlbWVudHMKKwkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byByZW1vdmUgZnJvbSB0aGUge0Bjb2RlIGNvbGxlY3Rpb259LiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IGJ1dCBtYXkgY29udGFpbgorCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gZW50cmllcyBpZiB0aGUge0Bjb2RlIGNvbGxlY3Rpb259IGFsbG93cyB0aGF0LgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdCBvZiB0aGUgY2FsbAorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPFQ+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8gZXh0ZW5kcyBUPiBlbGVtZW50cykgeworCQlyZXR1cm4gSXRlcmFibGVzLnJlbW92ZUFsbChjb2xsZWN0aW9uLCBuZXdIYXNoU2V0KGVsZW1lbnRzKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvQ29sbGVjdGlvbkxpdGVyYWxzLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9Db2xsZWN0aW9uTGl0ZXJhbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTIwNjMyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvQ29sbGVjdGlvbkxpdGVyYWxzLmphdmEKQEAgLTAsMCArMSw0MDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTcgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkludHM7CisKKy8qKgorICogVGhpcyBpcyBhbiBleHRlbnNpb24gbGlicmFyeSBmb3Ige0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9uIGNvbGxlY3Rpb25zfS4KKyAqIAorICogQGF1dGhvciBTZWJhc3RpYW4gWmFybmVrb3cgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKi8KK0BHd3RDb21wYXRpYmxlIHB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uTGl0ZXJhbHMgeworCisJLyoqCisJICogUmV0dXJucyB0aGUgZW1wdHksIGltbXV0YWJsZSBsaXN0LgorCSAqIAorCSAqIEByZXR1cm4gYW4gZW1wdHksIGltbXV0YWJsZSBsaXN0LgorCSAqIEBzZWUgQ29sbGVjdGlvbnMjZW1wdHlMaXN0KCkKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPFQ+IExpc3Q8VD4gZW1wdHlMaXN0KCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZW1wdHksIGltbXV0YWJsZSBzZXQuCisJICogCisJICogQHJldHVybiBhbiBlbXB0eSwgaW1tdXRhYmxlIHNldC4KKwkgKiBAc2VlIENvbGxlY3Rpb25zI2VtcHR5U2V0KCkKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPFQ+IFNldDxUPiBlbXB0eVNldCgpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZW1wdHksIGltbXV0YWJsZSBtYXAuCisJICogCisJICogQHJldHVybiBhbiBlbXB0eSwgaW1tdXRhYmxlIG1hcC4KKwkgKiBAc2VlIENvbGxlY3Rpb25zI2VtcHR5TWFwKCkKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLCBWPiBlbXB0eU1hcCgpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBpbW11dGFibGUgbGlzdCBjb250YWluaW5nIHRoZSBnaXZlbiBlbGVtZW50cywgaW4gb3JkZXIuCisJICogCisJICogQHBhcmFtIGVsZW1lbnRzCisJICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgY29udGFpbmVkIGluIHRoZSBsaXN0LiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIGNvbnRhaW4gYW55CisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZXMuCisJICogQHJldHVybiBhbiBpbW11dGFibGUgbGlzdCBjb250YWluaW5nIHRoZSBnaXZlbiBlbGVtZW50cy4KKwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYge0Bjb2RlIGVsZW1lbnRzfSBvciBhbnkgb2YgaXRlbXMgaW4ge0Bjb2RlIGVsZW1lbnRzfSBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCUBQdXJlCisJQFNhZmVWYXJhcmdzCisJcHVibGljIHN0YXRpYyA8VD4gTGlzdDxUPiBuZXdJbW11dGFibGVMaXN0KFQuLi4gZWxlbWVudHMpIHsKKwkJcmV0dXJuIEltbXV0YWJsZUxpc3QuY29weU9mKGVsZW1lbnRzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGltbXV0YWJsZSBzZXQgY29udGFpbmluZyB0aGUgZ2l2ZW4gZWxlbWVudHMuIFJlcGVhdGVkIG9jY3VycmVuY2VzIG9mIGFuIGVsZW1lbnQgKGFjY29yZGluZyB0bworCSAqIHtAbGluayBPYmplY3QjZXF1YWxzfSkgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBpZ25vcmVkCisJICogCisJICogQHBhcmFtIGVsZW1lbnRzCisJICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgY29udGFpbmVkIGluIHRoZSBzZXQuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbiBhbnkKKwkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlcy4KKwkgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBzZXQgY29udGFpbmluZyB0aGUgZ2l2ZW4gZWxlbWVudHMuCisJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHtAY29kZSBlbGVtZW50c30gb3IgYW55IG9mIGl0ZW1zIGluIHtAY29kZSBlbGVtZW50c30gaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlAUHVyZQorCUBTYWZlVmFyYXJncworCXB1YmxpYyBzdGF0aWMgPFQ+IFNldDxUPiBuZXdJbW11dGFibGVTZXQoVC4uLiBlbGVtZW50cykgeworCQlyZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZihlbGVtZW50cyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBpbW11dGFibGUgbWFwIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGVudHJpZXMuIFJlcGVhdGVkIG9jY3VycmVuY2VzIG9mIGEga2V5cyB3aWxsIGNhdXNlIGFuCisJICoge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0uCisJICogCisJICogQHBhcmFtIGVudHJpZXMKKwkgKiAgICAgICAgICAgIHRoZSBlbnRyaWVzIHRoYXQgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiB0aGUgbWFwLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBtYXkKKwkgKiAgICAgICAgICAgIG5vdCBjb250YWluIGFueSA8Y29kZT5udWxsPC9jb2RlPiBrZXlzIG9yIHZhbHVlcy4KKwkgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBtYXAgY29udGFpbmluZyB0aGUgZ2l2ZW4gZW50cmllcy4KKwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYge0Bjb2RlIGVudHJpZXN9IG9yIGFueSBrZXkgb3IgdmFsdWUgaW4ge0Bjb2RlIGVudHJpZXN9IGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiBkdXBsaWNhdGUga2V5cyBhcmUgY29udGFpbmVkIGluIHtAY29kZSBlbnRyaWVzfS4KKwkgKi8KKwlAUHVyZQorCUBTYWZlVmFyYXJncworCXB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLCBWPiBuZXdJbW11dGFibGVNYXAoUGFpcjw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+Li4uIGVudHJpZXMpIHsKKwkJaWYgKGVudHJpZXMubGVuZ3RoID09IDApCisJCQlyZXR1cm4gZW1wdHlNYXAoKTsKKwkJSW1tdXRhYmxlTWFwLkJ1aWxkZXI8SywgVj4gYnVpbGRlciA9IEltbXV0YWJsZU1hcC5idWlsZGVyKCk7CisJCWZvciAoUGFpcjw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IGVudHJ5IDogZW50cmllcykgeworCQkJYnVpbGRlci5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworCQl9CisJCXJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBlbXB0eSBtdXRhYmxlIHtAbGluayBBcnJheUxpc3R9IGluc3RhbmNlLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcge0BsaW5rIEFycmF5TGlzdH0KKwkgKiAKKwkgKiBAc2luY2UgMi4xMworCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8VD4gQXJyYXlMaXN0PFQ+IG5ld0FycmF5TGlzdCgpIHsKKwkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8VD4oKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbXV0YWJsZSB7QGxpbmsgQXJyYXlMaXN0fSBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBnaXZlbiBpbml0aWFsIGVsZW1lbnRzLgorCSAqIAorCSAqIEBwYXJhbSBpbml0aWFsCisJICogICAgICAgICAgICB0aGUgaW5pdGlhbCBlbGVtZW50cyB0aGF0IHRoZSBsaXN0IHNob3VsZCBjb250YWluLCBpbiBvcmRlci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBidXQgbWF5CisJICogICAgICAgICAgICBjb250YWluIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlcy4KKwkgKiBAcmV0dXJuIGEgbmV3IHtAbGluayBBcnJheUxpc3R9IGNvbnRhaW5pbmcgdGhvc2UgZWxlbWVudHMKKwkgKi8KKwlAU2FmZVZhcmFyZ3MKKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPFQ+IEFycmF5TGlzdDxUPiBuZXdBcnJheUxpc3QoVC4uLiBpbml0aWFsKSB7CisJCWlmIChpbml0aWFsLmxlbmd0aCA+IDApCisJCQlyZXR1cm4gTGlzdHMubmV3QXJyYXlMaXN0KGluaXRpYWwpOworCQlyZXR1cm4gbmV3QXJyYXlMaXN0KCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBlbXB0eSBtdXRhYmxlIHtAbGluayBMaW5rZWRMaXN0fSBpbnN0YW5jZS4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IHtAbGluayBMaW5rZWRMaXN0fQorCSAqIAorCSAqIEBzaW5jZSAyLjEzCisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxUPiBMaW5rZWRMaXN0PFQ+IG5ld0xpbmtlZExpc3QoKSB7CisJCXJldHVybiBuZXcgTGlua2VkTGlzdDxUPigpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBtdXRhYmxlIHtAbGluayBMaW5rZWRMaXN0fSBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBnaXZlbiBpbml0aWFsIGVsZW1lbnRzLgorCSAqIAorCSAqIEBwYXJhbSBpbml0aWFsCisJICogICAgICAgICAgICB0aGUgaW5pdGlhbCBlbGVtZW50cyB0aGF0IHRoZSBsaXN0IHNob3VsZCBjb250YWluLCBpbiBvcmRlci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBidXQgbWF5CisJICogICAgICAgICAgICBjb250YWluIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlcy4KKwkgKiBAcmV0dXJuIGEgbmV3IHtAbGluayBMaW5rZWRMaXN0fSBjb250YWluaW5nIHRob3NlIGVsZW1lbnRzCisJICovCisJQFNhZmVWYXJhcmdzCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxUPiBMaW5rZWRMaXN0PFQ+IG5ld0xpbmtlZExpc3QoVC4uLiBpbml0aWFsKSB7CisJCWlmIChpbml0aWFsLmxlbmd0aCA+IDApCisJCQlyZXR1cm4gTGlzdHMubmV3TGlua2VkTGlzdChBcnJheXMuYXNMaXN0KGluaXRpYWwpKTsKKwkJcmV0dXJuIG5ld0xpbmtlZExpc3QoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGVtcHR5IG11dGFibGUge0BsaW5rIEhhc2hTZXR9IGluc3RhbmNlLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcge0BsaW5rIEhhc2hTZXR9CisJICogCisJICogQHNpbmNlIDIuMTMKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPFQ+IEhhc2hTZXQ8VD4gbmV3SGFzaFNldCgpIHsKKwkJcmV0dXJuIG5ldyBIYXNoU2V0PFQ+KCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG11dGFibGUge0BsaW5rIEhhc2hTZXR9IGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGluaXRpYWwgZWxlbWVudHMuCisJICogCisJICogQHBhcmFtIGluaXRpYWwKKwkgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGVsZW1lbnRzIHRoYXQgdGhlIHNldCBzaG91bGQgY29udGFpbiwgaW4gb3JkZXIuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gYnV0IG1heQorCSAqICAgICAgICAgICAgY29udGFpbiA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZXMuCisJICogQHJldHVybiBhIG5ldyB7QGxpbmsgSGFzaFNldH0gY29udGFpbmluZyB0aG9zZSBlbGVtZW50cworCSAqLworCUBTYWZlVmFyYXJncworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8VD4gSGFzaFNldDxUPiBuZXdIYXNoU2V0KFQuLi4gaW5pdGlhbCkgeworCQlpZiAoaW5pdGlhbC5sZW5ndGggPiAwKQorCQkJcmV0dXJuIFNldHMubmV3SGFzaFNldChpbml0aWFsKTsKKwkJcmV0dXJuIG5ld0hhc2hTZXQoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGVtcHR5IG11dGFibGUge0BsaW5rIExpbmtlZEhhc2hTZXR9IGluc3RhbmNlLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcge0BsaW5rIExpbmtlZEhhc2hTZXR9CisJICogCisJICogQHNpbmNlIDIuMTMKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPFQ+IExpbmtlZEhhc2hTZXQ8VD4gbmV3TGlua2VkSGFzaFNldCgpIHsKKwkJcmV0dXJuIG5ldyBMaW5rZWRIYXNoU2V0PFQ+KCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG11dGFibGUge0BsaW5rIExpbmtlZEhhc2hTZXR9IGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGluaXRpYWwgZWxlbWVudHMuCisJICogCisJICogQHBhcmFtIGluaXRpYWwKKwkgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGVsZW1lbnRzIHRoYXQgdGhlIHNldCBzaG91bGQgY29udGFpbiwgaW4gb3JkZXIuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gYnV0IG1heQorCSAqICAgICAgICAgICAgY29udGFpbiA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZXMuCisJICogQHJldHVybiBhIG5ldyB7QGxpbmsgTGlua2VkSGFzaFNldH0gY29udGFpbmluZyB0aG9zZSBlbGVtZW50cworCSAqLworCUBTYWZlVmFyYXJncworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8VD4gTGlua2VkSGFzaFNldDxUPiBuZXdMaW5rZWRIYXNoU2V0KFQuLi4gaW5pdGlhbCkgeworCQlpZiAoaW5pdGlhbC5sZW5ndGggPiAwKQorCQkJcmV0dXJuIFNldHMubmV3TGlua2VkSGFzaFNldChBcnJheXMuYXNMaXN0KGluaXRpYWwpKTsKKwkJcmV0dXJuIG5ld0xpbmtlZEhhc2hTZXQoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGVtcHR5IG11dGFibGUge0BsaW5rIFRyZWVTZXR9IGluc3RhbmNlLgorCSAqIAorCSAqIEBwYXJhbSBjb21wYXJhdG9yCisJICogICAgICAgICAgICB0aGUgY29tcGFyYXRvciB0aGF0IHNob3VsZCBiZSB1c2VkLiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIG5hdHVyYWwgb3JkZXJpbmcKKwkgKiAgICAgICAgICAgIG9mIHRoZSBpdGVtcyBzaG91bGQgYmUgdXNlZC4KKwkgKiBAcmV0dXJuIGEgbmV3IHtAbGluayBUcmVlU2V0fQorCSAqIAorCSAqIEBzaW5jZSAyLjEzCisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxUPiBUcmVlU2V0PFQ+IG5ld1RyZWVTZXQoQ29tcGFyYXRvcjw/IHN1cGVyIFQ+IGNvbXBhcmF0b3IpIHsKKwkJcmV0dXJuIG5ldyBUcmVlU2V0PFQ+KGNvbXBhcmF0b3IpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBtdXRhYmxlIHtAbGluayBUcmVlU2V0fSBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBnaXZlbiBpbml0aWFsIGVsZW1lbnRzLgorCSAqIAorCSAqIEBwYXJhbSBpbml0aWFsCisJICogICAgICAgICAgICB0aGUgaW5pdGlhbCBlbGVtZW50cyB0aGF0IHRoZSBzZXQgc2hvdWxkIGNvbnRhaW4sIGluIG9yZGVyLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IGJ1dCBtYXkKKwkgKiAgICAgICAgICAgIGNvbnRhaW4gPGNvZGU+bnVsbDwvY29kZT4gdmFsdWVzLgorCSAqIEBwYXJhbSBjb21wYXJhdG9yCisJICogICAgICAgICAgICB0aGUgY29tcGFyYXRvciB0aGF0IHNob3VsZCBiZSB1c2VkLiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIG5hdHVyYWwgb3JkZXJpbmcKKwkgKiAgICAgICAgICAgIG9mIHRoZSBpdGVtcyBzaG91bGQgYmUgdXNlZC4KKwkgKiBAcmV0dXJuIGEgbmV3IHtAbGluayBUcmVlU2V0fSBjb250YWluaW5nIHRob3NlIGVsZW1lbnRzCisJICovCisJQFNhZmVWYXJhcmdzCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxUPiBUcmVlU2V0PFQ+IG5ld1RyZWVTZXQoQ29tcGFyYXRvcjw/IHN1cGVyIFQ+IGNvbXBhcmF0b3IsIFQuLi4gaW5pdGlhbCkgeworCQlUcmVlU2V0PFQ+IHJlc3VsdCA9IG5ldyBUcmVlU2V0PFQ+KGNvbXBhcmF0b3IpOworCQlpZiAoaW5pdGlhbC5sZW5ndGggPiAwKQorCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGluaXRpYWwpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGVtcHR5IG11dGFibGUge0BsaW5rIEhhc2hNYXB9IGluc3RhbmNlLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcge0BsaW5rIEhhc2hNYXB9CisJICogCisJICogQHNpbmNlIDIuMTMKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPEssIFY+IEhhc2hNYXA8SywgVj4gbmV3SGFzaE1hcCgpIHsKKwkJcmV0dXJuIG5ldyBIYXNoTWFwPEssIFY+KCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG11dGFibGUge0BsaW5rIEhhc2hNYXB9IGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGluaXRpYWwgZW50cmllcy4gUmVwZWF0ZWQgb2NjdXJyZW5jZXMgb2YgYSBrZXlzCisJICogd2lsbCBjYXVzZSBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufS4KKwkgKiAKKwkgKiBAcGFyYW0gaW5pdGlhbAorCSAqICAgICAgICAgICAgdGhlIGVudHJpZXMgdGhhdCBzaG91bGQgYmUgY29udGFpbmVkIGluIHRoZSBtYXAuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gYnV0IG1heSBjb250YWluCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBrZXlzIG9yIHZhbHVlcy4KKwkgKiBAcmV0dXJuIGEgbmV3IHtAbGluayBIYXNoTWFwfSBjb250YWluaW5nIHRob3NlIGVsZW1lbnRzCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiBkdXBsaWNhdGUga2V5cyBhcmUgY29udGFpbmVkIHRoZSB7QGNvZGUgaW5pdGlhbH0gZW50cmllcy4KKwkgKi8KKwlAU2FmZVZhcmFyZ3MKKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPEssIFY+IEhhc2hNYXA8SywgVj4gbmV3SGFzaE1hcChQYWlyPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4uLi4gaW5pdGlhbCkgeworCQlpZiAoaW5pdGlhbC5sZW5ndGggPiAwKSB7CisJCQlIYXNoTWFwPEssIFY+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPEssIFY+KGNhcGFjaXR5KGluaXRpYWwubGVuZ3RoKSk7CisJCQlwdXRBbGwocmVzdWx0LCBpbml0aWFsKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJcmV0dXJuIG5ld0hhc2hNYXAoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGVtcHR5IG11dGFibGUge0BsaW5rIExpbmtlZEhhc2hNYXB9IGluc3RhbmNlLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcge0BsaW5rIExpbmtlZEhhc2hNYXB9CisJICogCisJICogQHNpbmNlIDIuMTMKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPEssIFY+IExpbmtlZEhhc2hNYXA8SywgVj4gbmV3TGlua2VkSGFzaE1hcCgpIHsKKwkJcmV0dXJuIG5ldyBMaW5rZWRIYXNoTWFwPEssIFY+KCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG11dGFibGUge0BsaW5rIExpbmtlZEhhc2hNYXB9IGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGluaXRpYWwgZW50cmllcy4gUmVwZWF0ZWQgb2NjdXJyZW5jZXMgb2YgYQorCSAqIGtleXMgd2lsbCBjYXVzZSBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufS4KKwkgKiAKKwkgKiBAcGFyYW0gaW5pdGlhbAorCSAqICAgICAgICAgICAgdGhlIGVudHJpZXMgdGhhdCBzaG91bGQgYmUgY29udGFpbmVkIGluIHRoZSBtYXAuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gYnV0IG1heSBjb250YWluCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBrZXlzIG9yIHZhbHVlcy4KKwkgKiBAcmV0dXJuIGEgbmV3IHtAbGluayBMaW5rZWRIYXNoTWFwfSBjb250YWluaW5nIHRob3NlIGVsZW1lbnRzCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiBkdXBsaWNhdGUga2V5cyBhcmUgY29udGFpbmVkIHRoZSB7QGNvZGUgaW5pdGlhbH0gZW50cmllcy4KKwkgKi8KKwlAU2FmZVZhcmFyZ3MKKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPEssIFY+IExpbmtlZEhhc2hNYXA8SywgVj4gbmV3TGlua2VkSGFzaE1hcChQYWlyPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4uLi4gaW5pdGlhbCkgeworCQlpZiAoaW5pdGlhbC5sZW5ndGggPiAwKSB7CisJCQlMaW5rZWRIYXNoTWFwPEssIFY+IHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwPEssIFY+KGNhcGFjaXR5KGluaXRpYWwubGVuZ3RoKSk7CisJCQlwdXRBbGwocmVzdWx0LCBpbml0aWFsKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJcmV0dXJuIG5ld0xpbmtlZEhhc2hNYXAoKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgaW50IGNhcGFjaXR5KGludCBpbml0aWFsU2l6ZSkgeworCQlpZiAoaW5pdGlhbFNpemUgPCAzKQorCQkJcmV0dXJuIGluaXRpYWxTaXplICsgMTsKKwkJZWxzZSBpZiAoaW5pdGlhbFNpemUgPCBJbnRzLk1BWF9QT1dFUl9PRl9UV08pCisJCQlyZXR1cm4gaW5pdGlhbFNpemUgKyBpbml0aWFsU2l6ZSAvIDM7CisJCWVsc2UKKwkJCXJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGVtcHR5IG11dGFibGUge0BsaW5rIFRyZWVNYXB9IGluc3RhbmNlLgorCSAqIAorCSAqIEBwYXJhbSBjb21wYXJhdG9yCisJICogICAgICAgICAgICB0aGUgY29tcGFyYXRvciB0aGF0IHNob3VsZCBiZSB1c2VkLiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIG5hdHVyYWwgb3JkZXJpbmcKKwkgKiAgICAgICAgICAgIG9mIHRoZSBrZXlzIHNob3VsZCBiZSB1c2VkLgorCSAqIEByZXR1cm4gYSBuZXcge0BsaW5rIFRyZWVNYXB9CisJICogCisJICogQHNpbmNlIDIuMTMKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPEssIFY+IFRyZWVNYXA8SywgVj4gbmV3VHJlZU1hcChDb21wYXJhdG9yPD8gc3VwZXIgSz4gY29tcGFyYXRvcikgeworCQlyZXR1cm4gbmV3IFRyZWVNYXA8SywgVj4oY29tcGFyYXRvcik7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG11dGFibGUge0BsaW5rIFRyZWVNYXB9IGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGluaXRpYWwgZW50cmllcy4gUmVwZWF0ZWQgb2NjdXJyZW5jZXMgb2YgYSBrZXlzCisJICogd2lsbCBjYXVzZSBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufS4KKwkgKiAKKwkgKiBAcGFyYW0gaW5pdGlhbAorCSAqICAgICAgICAgICAgdGhlIGVudHJpZXMgdGhhdCBzaG91bGQgYmUgY29udGFpbmVkIGluIHRoZSBtYXAuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gYnV0IG1heSBjb250YWluCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBrZXlzIG9yIHZhbHVlcy4KKwkgKiBAcGFyYW0gY29tcGFyYXRvcgorCSAqICAgICAgICAgICAgdGhlIGNvbXBhcmF0b3IgdGhhdCBzaG91bGQgYmUgdXNlZC4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBuYXR1cmFsIG9yZGVyaW5nCisJICogICAgICAgICAgICBvZiB0aGUga2V5cyBzaG91bGQgYmUgdXNlZC4KKwkgKiBAcmV0dXJuIGEgbmV3IHtAbGluayBUcmVlTWFwfSBjb250YWluaW5nIHRob3NlIGVsZW1lbnRzCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiBkdXBsaWNhdGUga2V5cyBhcmUgY29udGFpbmVkIHRoZSB7QGNvZGUgaW5pdGlhbH0gZW50cmllcy4KKwkgKi8KKwlAU2FmZVZhcmFyZ3MKKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPEssIFY+IFRyZWVNYXA8SywgVj4gbmV3VHJlZU1hcChDb21wYXJhdG9yPD8gc3VwZXIgSz4gY29tcGFyYXRvciwgUGFpcjw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+Li4uIGluaXRpYWwpIHsKKwkJVHJlZU1hcDxLLCBWPiByZXN1bHQgPSBuZXcgVHJlZU1hcDxLLCBWPihjb21wYXJhdG9yKTsKKwkJcHV0QWxsKHJlc3VsdCwgaW5pdGlhbCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJQFNhZmVWYXJhcmdzCisJcHJpdmF0ZSBzdGF0aWMgPEssIFY+IHZvaWQgcHV0QWxsKE1hcDxLLCBWPiByZXN1bHQsIFBhaXI8PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWPi4uLiBlbnRyaWVzKSB7CisJCWZvciAoUGFpcjw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IGVudHJ5IDogZW50cmllcykgeworCQkJaWYgKHJlc3VsdC5jb250YWluc0tleShlbnRyeS5nZXRLZXkoKSkpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVwbGljYXRlIGtleTogIiArIGVudHJ5LmdldEtleSgpKTsKKwkJCXJlc3VsdC5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9Db21wYXJhYmxlRXh0ZW5zaW9ucy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvQ29tcGFyYWJsZUV4dGVuc2lvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTgyYzIyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvQ29tcGFyYWJsZUV4dGVuc2lvbnMuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CisKKworLyoqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBsaWJyYXJ5IGZvciB7QGxpbmsgQ29tcGFyYWJsZSBjb21wYXJhYmxlc30uCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZSAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqLworQEd3dENvbXBhdGlibGUgcHVibGljIGNsYXNzIENvbXBhcmFibGVFeHRlbnNpb25zIHsKKworCS8qKgorCSAqIFRoZSBjb21wYXJpc29uIG9wZXJhdG9yIDxjb2RlPmxlc3MgdGhhbjwvY29kZT4uCisJICogCisJICogQHBhcmFtIGxlZnQKKwkgKiAgICAgICAgICAgIGEgY29tcGFyYWJsZQorCSAqIEBwYXJhbSByaWdodAorCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGNvbXBhcmUgd2l0aAorCSAqIEByZXR1cm4gPGNvZGU+bGVmdC5jb21wYXJlVG8ocmlnaHQpICZsdDsgMDwvY29kZT4KKwkgKi8KKwlAUHVyZSAvKiBub3QgZ3VhcmFudGVlZCwgc2luY2UgY29tcGFyZVRvKCkgaXMgaW52b2tlZCAqLworCUBJbmxpbmUoIigkMS5jb21wYXJlVG8oJDIpIDwgMCkiKQorCXB1YmxpYyBzdGF0aWMgPEM+IGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oQ29tcGFyYWJsZTw/IHN1cGVyIEM+IGxlZnQsIEMgcmlnaHQpIHsKKwkJcmV0dXJuIGxlZnQuY29tcGFyZVRvKHJpZ2h0KSA8IDA7CisJfQorCisJLyoqCisJICogVGhlIGNvbXBhcmlzb24gb3BlcmF0b3IgPGNvZGU+Z3JlYXRlciB0aGFuPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gbGVmdAorCSAqICAgICAgICAgICAgYSBjb21wYXJhYmxlCisJICogQHBhcmFtIHJpZ2h0CisJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcGFyZSB3aXRoCisJICogQHJldHVybiA8Y29kZT5sZWZ0LmNvbXBhcmVUbyhyaWdodCkgJmd0OyAwPC9jb2RlPgorCSAqLworCUBQdXJlIC8qIG5vdCBndWFyYW50ZWVkLCBzaW5jZSBjb21wYXJlVG8oKSBpcyBpbnZva2VkICovCisJQElubGluZSgiKCQxLmNvbXBhcmVUbygkMikgPiAwKSIpCisJcHVibGljIHN0YXRpYyA8Qz4gYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihDb21wYXJhYmxlPD8gc3VwZXIgQz4gbGVmdCwgQyByaWdodCkgeworCQlyZXR1cm4gbGVmdC5jb21wYXJlVG8ocmlnaHQpID4gMDsKKwl9CisKKwkvKioKKwkgKiBUaGUgY29tcGFyaXNvbiBvcGVyYXRvciA8Y29kZT5sZXNzIHRoYW4gb3IgZXF1YWxzPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gbGVmdAorCSAqICAgICAgICAgICAgYSBjb21wYXJhYmxlCisJICogQHBhcmFtIHJpZ2h0CisJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcGFyZSB3aXRoCisJICogQHJldHVybiA8Y29kZT5sZWZ0LmNvbXBhcmVUbyhyaWdodCkgJmx0Oz0gMDwvY29kZT4KKwkgKi8KKwlAUHVyZSAvKiBub3QgZ3VhcmFudGVlZCwgc2luY2UgY29tcGFyZVRvKCkgaXMgaW52b2tlZCAqLworCUBJbmxpbmUoIigkMS5jb21wYXJlVG8oJDIpIDw9IDApIikKKwlwdWJsaWMgc3RhdGljIDxDPiBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKENvbXBhcmFibGU8PyBzdXBlciBDPiBsZWZ0LCBDIHJpZ2h0KSB7CisJCXJldHVybiBsZWZ0LmNvbXBhcmVUbyhyaWdodCkgPD0gMDsKKwl9CisKKwkvKioKKwkgKiBUaGUgY29tcGFyaXNvbiBvcGVyYXRvciA8Y29kZT5ncmVhdGVyIHRoYW4gb3IgZXF1YWxzPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gbGVmdAorCSAqICAgICAgICAgICAgYSBjb21wYXJhYmxlCisJICogQHBhcmFtIHJpZ2h0CisJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29tcGFyZSB3aXRoCisJICogQHJldHVybiA8Y29kZT5sZWZ0LmNvbXBhcmVUbyhyaWdodCkgJmd0Oz0gMDwvY29kZT4KKwkgKi8KKwlAUHVyZSAvKiBub3QgZ3VhcmFudGVlZCwgc2luY2UgY29tcGFyZVRvKCkgaXMgaW52b2tlZCAqLworCUBJbmxpbmUoIigkMS5jb21wYXJlVG8oJDIpID49IDApIikKKwlwdWJsaWMgc3RhdGljIDxDPiBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKENvbXBhcmFibGU8PyBzdXBlciBDPiBsZWZ0LCBDIHJpZ2h0KSB7CisJCXJldHVybiBsZWZ0LmNvbXBhcmVUbyhyaWdodCkgPj0gMDsKKwl9CisJCisJLyoqCisJICogVGhlIHNwYWNlc2hpcCBvcGVyYXRvciA8Y29kZT4mbHQ7PSZndDs8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBsZWZ0CisJICogICAgICAgICAgICBhIGNvbXBhcmFibGUKKwkgKiBAcGFyYW0gcmlnaHQKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBjb21wYXJlIHdpdGgKKwkgKiBAcmV0dXJuIDxjb2RlPmxlZnQuY29tcGFyZVRvKHJpZ2h0KTwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUgLyogbm90IGd1YXJhbnRlZWQsIHNpbmNlIGNvbXBhcmVUbygpIGlzIGludm9rZWQgKi8KKwlASW5saW5lKCIoJDEuY29tcGFyZVRvKCQyKSkiKQorCXB1YmxpYyBzdGF0aWMgPEM+IGludCBvcGVyYXRvcl9zcGFjZXNoaXAoQ29tcGFyYWJsZTw/IHN1cGVyIEM+IGxlZnQsIEMgcmlnaHQpIHsKKwkJcmV0dXJuIGxlZnQuY29tcGFyZVRvKHJpZ2h0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9Db252ZXJzaW9ucy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvQ29udmVyc2lvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGYzNWY2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvQ29udmVyc2lvbnMuamF2YQpAQCAtMCwwICsxLDE0OTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTYgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tQWNjZXNzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0SW5jb21wYXRpYmxlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuQm9vbGVhbnM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5CeXRlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkNoYXJzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuRG91YmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkZsb2F0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkludHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5Mb25nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLlNob3J0czsKKworLyoqCisgKiBUaGlzIGlzIGEgbGlicmFyeSB1c2VkIHRvIGNvbnZlcnQgYXJyYXlzIHRvIGxpc3RzIGFuZCB2aWNlIHZlcnNhIGluIGEgd2F5IHRoYXQga2VlcHMgdGhlIGlkZW50aXR5IG9mIHRoZQorICogdG8tYmUtY29udmVydGVkIG9iamVjdC4gVGhhdCBpcywgY2hhbmdlcyBpbiB0aGUgYXJyYXkgd2lsbCBiZSByZWZsZWN0ZWQgYnkgdGhlIGxpc3QgYW5kIGNoYW5nZXMgdG8gdGhlIGxpc3Qgd2lsbCBiZQorICogcmVmbGVjdGVkIGJ5IHRoZSBhcnJheSBmb3IgYm90aCBraW5kcyBvZiBjb252ZXJzaW9uLgorICogCisgKiBUaGUgdXRpbGl0aWVzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUgWGJhc2UgY29tcGlsZXIuCisgKiAKKyAqIEBhdXRob3IgU2ViYXN0aWFuIFphcm5la293IC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlCisgKiBAYXV0aG9yIEZhY3VuZG8gRXRjaGV6YXIgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0eXBlLXNwZWNpZmljIHByaW1pdGl2ZSBhcnJheSB3cmFwcGVycworICovCitAR3d0SW5jb21wYXRpYmxlKCJyZWZsZWN0aW9uIikKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb252ZXJzaW9ucyB7CisKKwlwcml2YXRlIENvbnZlcnNpb25zKCkgeworCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3QgY3JlYXRlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIik7CisJfQorCisJLyoqCisJICogV3JhcHMge0Bjb2RlIG9iamVjdH0gaW4gYSBsaXN0IGlmIGFuZCBvbmx5IGlmIHtAY29kZSBvYmplY3R9IGlzIGFuIGFycmF5LiBXb3JrcyBmb3IgcHJpbWl0aXZlIGFuZAorCSAqIG9iamVjdC1jb21wb25lbnQgdHlwZXMuCisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBiZSB3cmFwcGVkLiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhIGxpc3QgaWYgdGhlIGdpdmVuIG9iamVjdCB3YXMgYW4gYXJyYXkuIE90aGVyd2lzZSB0aGUgdW5tb2RpZmllZCBnaXZlbiBvYmplY3QuIE1heSByZXR1cm4KKwkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBvYmplY3Qgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyBPYmplY3QgZG9XcmFwQXJyYXkoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0ID09IG51bGwpIHsKKwkJCS8vIE5vdGhpbmcgdG8gd3JhcC4KKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJQ2xhc3M8Pz4gYXJyYXlDbGFzcyA9IG9iamVjdC5nZXRDbGFzcygpOworCisJCWlmICghYXJyYXlDbGFzcy5pc0FycmF5KCkpIHsKKwkJCS8vIENhbid0IHdyYXAgc29tZXRoaW5nIHRoYXQgaXNuJ3QgYW4gYXJyYXkuCisJCQlyZXR1cm4gb2JqZWN0OworCQl9CisKKwkJaWYgKCFhcnJheUNsYXNzLmdldENvbXBvbmVudFR5cGUoKS5pc1ByaW1pdGl2ZSgpKSB7CisJCQkvLyBOb3QgYSBwcmltaXRpdmUsIHJldHVybiBnZW5lcmljIHdyYXBwZWQgb2JqZWN0IGFycmF5LgorCQkJcmV0dXJuIFdyYXBwZWRBcnJheS5jcmVhdGUoKE9iamVjdFtdKSBvYmplY3QpOworCQl9CisKKwkJLy8gTm93IGNoZWNrIGZvciBlYWNoIHByaW1pdGl2ZSB0eXBlIGluZGl2aWR1YWxseSwgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgd3JhcHBlci4KKworCQkvLyBUaGVzZSBhcmUgcHJvYmFibHkgdGhlIG1vc3QgdXNlZCB0eXBlcywgY2hlY2sgZm9yIHRoZW0gZmlyc3Q6CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBpbnRbXSkgeworCQkJcmV0dXJuIFdyYXBwZWRJbnRlZ2VyQXJyYXkuY3JlYXRlKChpbnRbXSkgb2JqZWN0KTsKKwkJfQorCisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBsb25nW10pIHsKKwkJCXJldHVybiBXcmFwcGVkTG9uZ0FycmF5LmNyZWF0ZSgobG9uZ1tdKSBvYmplY3QpOworCQl9CisKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIGZsb2F0W10pIHsKKwkJCXJldHVybiBXcmFwcGVkRmxvYXRBcnJheS5jcmVhdGUoKGZsb2F0W10pIG9iamVjdCk7CisJCX0KKworCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgZG91YmxlW10pIHsKKwkJCXJldHVybiBXcmFwcGVkRG91YmxlQXJyYXkuY3JlYXRlKChkb3VibGVbXSkgb2JqZWN0KTsKKwkJfQorCisJCS8vIE5vdyBjaGVjayBmb3IgdGhlIHNsaWdodGx5IGxlc3MgdXNlZCB0eXBlczoKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIGJ5dGVbXSkgeworCQkJcmV0dXJuIFdyYXBwZWRCeXRlQXJyYXkuY3JlYXRlKChieXRlW10pIG9iamVjdCk7CisJCX0KKworCQlpZiAob2JqZWN0IGluc3RhbmNlb2Ygc2hvcnRbXSkgeworCQkJcmV0dXJuIFdyYXBwZWRTaG9ydEFycmF5LmNyZWF0ZSgoc2hvcnRbXSkgb2JqZWN0KTsKKwkJfQorCisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBib29sZWFuW10pIHsKKwkJCXJldHVybiBXcmFwcGVkQm9vbGVhbkFycmF5LmNyZWF0ZSgoYm9vbGVhbltdKSBvYmplY3QpOworCQl9CisKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIGNoYXJbXSkgeworCQkJcmV0dXJuIFdyYXBwZWRDaGFyYWN0ZXJBcnJheS5jcmVhdGUoKGNoYXJbXSkgb2JqZWN0KTsKKwkJfQorCisJCS8vIFVucmVjb2duaXplZCB0eXBlLgorCQl0aHJvdyBuZXcgQXJyYXlTdG9yZUV4Y2VwdGlvbigiVW5yZWNvZ25pc2VkIHR5cGU6ICIgKyBhcnJheUNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CisJfQorCisJLyoqCisJICogVW53cmFwcyB7QGNvZGUgb2JqZWN0fSB0byBleHRyYWN0IHRoZSBvcmlnaW5hbCBhcnJheSBpZiBhbmQgb25seSBpZiB7QGNvZGUgb2JqZWN0fSB3YXMgcHJldmlvdXNseSBjcmVhdGVkIGJ5CisJICoge0BsaW5rICNkb1dyYXBBcnJheShPYmplY3QpfS4gSWYgdGhlIGFycmF5J3MgY29tcG9uZW50IHR5cGUgY2Fubm90IGJlIGRldGVybWluZWQgYXQgcnVudGltZSwge0BsaW5rIE9iamVjdH0gaXMKKwkgKiB1c2VkLgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBiZSB1bndyYXBwZWQuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHRoZSBwcmV2aW91c2x5IHdyYXBwZWQgYXJyYXkgaWYgdGhlIGdpdmVuIHZhbHVlIHJlcHJlc2VudHMgc3VjaC4gT3RoZXJ3aXNlIHJldHVybnMgdGhlIHZhbHVlIHVubW9kaWZpZWQuCisJICogICAgICAgICBNYXkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2YWx1ZSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIE9iamVjdCB1bndyYXBBcnJheShPYmplY3QgdmFsdWUpIHsKKwkJcmV0dXJuIHVud3JhcEFycmF5KHZhbHVlLCBPYmplY3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFVud3JhcHMge0Bjb2RlIG9iamVjdH0gdG8gZXh0cmFjdCB0aGUgb3JpZ2luYWwgYXJyYXkgaWYgYW5kIG9ubHkgaWYge0Bjb2RlIG9iamVjdH0gd2FzIHByZXZpb3VzbHkgY3JlYXRlZCBieQorCSAqIHtAbGluayAjZG9XcmFwQXJyYXkoT2JqZWN0KX0uCisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIHVud3JhcHBlZC4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBjb21wb25lbnRUeXBlCisJICogICAgICAgICAgICB0aGUgZXhwZWN0ZWQgY29tcG9uZW50IHR5cGUgb2YgdGhlIGFycmF5LiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIHByZXZpb3VzbHkgd3JhcHBlZCBhcnJheSBpZiB0aGUgZ2l2ZW4gdmFsdWUgcmVwcmVzZW50cyBzdWNoLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgdmFsdWUgdW5tb2RpZmllZC4KKwkgKiAgICAgICAgIE1heSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZhbHVlIHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAdGhyb3dzIEFycmF5U3RvcmVFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgZXhwZWN0ZWQgcnVudGltZSB7QGNvZGUgY29tcG9uZW50VHlwZX0gZG9lcyBub3QgbWF0Y2ggdGhlIGFjdHVhbCBydW50aW1lIGNvbXBvbmVudCB0eXBlLgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyBPYmplY3QgdW53cmFwQXJyYXkoT2JqZWN0IHZhbHVlLCBDbGFzczw/PiBjb21wb25lbnRUeXBlKSB7CisJCS8vIFRoaXMgaXMgdGhlIGdlbmVyaWMgb2JqZWN0IGFycmF5IGNoZWNrLgorCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXcmFwcGVkQXJyYXk8Pz4pIHsKKwkJCU9iamVjdCByZXN1bHQgPSAoKFdyYXBwZWRBcnJheTw/PikgdmFsdWUpLmludGVybmFsVG9BcnJheSgpOworCQkJcmV0dXJuIGNoZWNrQ29tcG9uZW50VHlwZShyZXN1bHQsIGNvbXBvbmVudFR5cGUpOworCQl9CisJCS8vIEFuZCBub3cgZm9yIHRoZSBwcmltaXRpdmUgYXJyYXlzLgorCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXcmFwcGVkSW50ZWdlckFycmF5KSB7CisJCQlPYmplY3QgcmVzdWx0ID0gKChXcmFwcGVkSW50ZWdlckFycmF5KSB2YWx1ZSkuaW50ZXJuYWxUb0FycmF5KCk7CisJCQlyZXR1cm4gY2hlY2tDb21wb25lbnRUeXBlKHJlc3VsdCwgY29tcG9uZW50VHlwZSk7CisJCX0KKworCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXcmFwcGVkTG9uZ0FycmF5KSB7CisJCQlPYmplY3QgcmVzdWx0ID0gKChXcmFwcGVkTG9uZ0FycmF5KSB2YWx1ZSkuaW50ZXJuYWxUb0FycmF5KCk7CisJCQlyZXR1cm4gY2hlY2tDb21wb25lbnRUeXBlKHJlc3VsdCwgY29tcG9uZW50VHlwZSk7CisJCX0KKworCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXcmFwcGVkRmxvYXRBcnJheSkgeworCQkJT2JqZWN0IHJlc3VsdCA9ICgoV3JhcHBlZEZsb2F0QXJyYXkpIHZhbHVlKS5pbnRlcm5hbFRvQXJyYXkoKTsKKwkJCXJldHVybiBjaGVja0NvbXBvbmVudFR5cGUocmVzdWx0LCBjb21wb25lbnRUeXBlKTsKKwkJfQorCisJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFdyYXBwZWREb3VibGVBcnJheSkgeworCQkJT2JqZWN0IHJlc3VsdCA9ICgoV3JhcHBlZERvdWJsZUFycmF5KSB2YWx1ZSkuaW50ZXJuYWxUb0FycmF5KCk7CisJCQlyZXR1cm4gY2hlY2tDb21wb25lbnRUeXBlKHJlc3VsdCwgY29tcG9uZW50VHlwZSk7CisJCX0KKworCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXcmFwcGVkQnl0ZUFycmF5KSB7CisJCQlPYmplY3QgcmVzdWx0ID0gKChXcmFwcGVkQnl0ZUFycmF5KSB2YWx1ZSkuaW50ZXJuYWxUb0FycmF5KCk7CisJCQlyZXR1cm4gY2hlY2tDb21wb25lbnRUeXBlKHJlc3VsdCwgY29tcG9uZW50VHlwZSk7CisJCX0KKworCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXcmFwcGVkU2hvcnRBcnJheSkgeworCQkJT2JqZWN0IHJlc3VsdCA9ICgoV3JhcHBlZFNob3J0QXJyYXkpIHZhbHVlKS5pbnRlcm5hbFRvQXJyYXkoKTsKKwkJCXJldHVybiBjaGVja0NvbXBvbmVudFR5cGUocmVzdWx0LCBjb21wb25lbnRUeXBlKTsKKwkJfQorCisJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFdyYXBwZWRCb29sZWFuQXJyYXkpIHsKKwkJCU9iamVjdCByZXN1bHQgPSAoKFdyYXBwZWRCb29sZWFuQXJyYXkpIHZhbHVlKS5pbnRlcm5hbFRvQXJyYXkoKTsKKwkJCXJldHVybiBjaGVja0NvbXBvbmVudFR5cGUocmVzdWx0LCBjb21wb25lbnRUeXBlKTsKKwkJfQorCisJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFdyYXBwZWRDaGFyYWN0ZXJBcnJheSkgeworCQkJT2JqZWN0IHJlc3VsdCA9ICgoV3JhcHBlZENoYXJhY3RlckFycmF5KSB2YWx1ZSkuaW50ZXJuYWxUb0FycmF5KCk7CisJCQlyZXR1cm4gY2hlY2tDb21wb25lbnRUeXBlKHJlc3VsdCwgY29tcG9uZW50VHlwZSk7CisJCX0KKworCQlpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEl0ZXJhYmxlPD8+KSkgeworCQkJLy8gTm90aGluZyB0byB1bndyYXAuCisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlpZiAoIWNvbXBvbmVudFR5cGUuaXNQcmltaXRpdmUoKSkgeworCQkJQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIiwgInJhd3R5cGVzIiB9KQorCQkJT2JqZWN0IHJlc3VsdCA9IEl0ZXJhYmxlcy50b0FycmF5KChJdGVyYWJsZSkgdmFsdWUsIGNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCXRyeSB7CisJCQlMaXN0PD8+IGxpc3QgPSBJdGVyYWJsZUV4dGVuc2lvbnMudG9MaXN0KChJdGVyYWJsZTw/PikgdmFsdWUpOworCQkJT2JqZWN0IHJlc3VsdCA9IEFycmF5Lm5ld0luc3RhbmNlKGNvbXBvbmVudFR5cGUsIGxpc3Quc2l6ZSgpKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgeworCQkJCU9iamVjdCBlbGVtZW50ID0gbGlzdC5nZXQoaSk7CisJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgeworCQkJCQl0aHJvdyBuZXcgQXJyYXlTdG9yZUV4Y2VwdGlvbigiQ2Fubm90IHN0b3JlIDxudWxsPiBpbiBwcmltaXRpdmUgYXJyYXlzLiIpOworCQkJCX0KKwkJCQlBcnJheS5zZXQocmVzdWx0LCBpLCBlbGVtZW50KTsKKwkJCX0KKwkJCXJldHVybiByZXN1bHQ7CisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKwkJCXRocm93IG5ldyBBcnJheVN0b3JlRXhjZXB0aW9uKCJQcmltaXRpdmUgY29udmVyc2lvbiBmYWlsZWQ6ICIgKyBpYWUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrcyB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhlIGdpdmVuIGFycmF5IGFnYWluc3QgdGhlIGV4cGVjdGVkIGNvbXBvbmVudCB0eXBlLgorCSAqIAorCSAqIEBwYXJhbSBhcnJheQorCSAqICAgICAgICAgICAgdGhlIGFycmF5IHRvIGJlIGNoZWNrZWQuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGV4cGVjdGVkQ29tcG9uZW50VHlwZQorCSAqICAgICAgICAgICAgdGhlIGV4cGVjdGVkIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBhcnJheS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHRoZSB1bmNoYW5nZWQgYXJyYXkuCisJICogQHRocm93cyBBcnJheVN0b3JlRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIGV4cGVjdGVkIHJ1bnRpbWUge0Bjb2RlIGNvbXBvbmVudFR5cGV9IGRvZXMgbm90IG1hdGNoIHRoZSBhY3R1YWwgcnVudGltZSBjb21wb25lbnQgdHlwZS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBPYmplY3QgY2hlY2tDb21wb25lbnRUeXBlKE9iamVjdCBhcnJheSwgQ2xhc3M8Pz4gZXhwZWN0ZWRDb21wb25lbnRUeXBlKSB7CisJCUNsYXNzPD8+IGFjdHVhbENvbXBvbmVudFR5cGUgPSBhcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKKwkJaWYgKCFleHBlY3RlZENvbXBvbmVudFR5cGUuaXNBc3NpZ25hYmxlRnJvbShhY3R1YWxDb21wb25lbnRUeXBlKSkgeworCQkJdGhyb3cgbmV3IEFycmF5U3RvcmVFeGNlcHRpb24oCisJCQkJCVN0cmluZy5mb3JtYXQoIlRoZSBleHBlY3RlZCBjb21wb25lbnQgdHlwZSAlcyBpcyBub3QgYXNzaWduYWJsZSBmcm9tIHRoZSBhY3R1YWwgdHlwZSAlcyIsCisJCQkJCQkJZXhwZWN0ZWRDb21wb25lbnRUeXBlLmdldENhbm9uaWNhbE5hbWUoKSwgYWN0dWFsQ29tcG9uZW50VHlwZS5nZXRDYW5vbmljYWxOYW1lKCkpKTsKKwkJfQorCQlyZXR1cm4gYXJyYXk7CisJfQorCisJLyoqCisJICogQSBsaXN0IHRoYXQgaXMgY29tcGxldGVseSBiYWNrZWQgYnkgYW4gYXJyYXkgYW5kIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoYXQgYXJyYXkuIE9ubHkgZm9yIGludGVybmFsIHVzZS4KKwkgKiAKKwkgKiBAcGFyYW0gPFQ+CisJICogICAgICAgICAgICB0aGUgdHlwZSBpZiB0aGUgbGlzdCBlbGVtZW50cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFdyYXBwZWRBcnJheTxUPiBleHRlbmRzIEFic3RyYWN0TGlzdDxUPiBpbXBsZW1lbnRzIFJhbmRvbUFjY2VzcyB7CisKKwkJLyoqCisJCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFdyYXBwZWRBcnJheX0gdGhhdCBpcyBiYWNrZWQgYnkgdGhlIGdpdmVuIHtAY29kZSBhcnJheX0uCisJCSAqIAorCQkgKiBAcGFyYW0gYXJyYXkKKwkJICogICAgICAgICAgICB0aGUgdG8tYmUtd3JhcHBlZCBhcnJheS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIHdpbGwgY2F1c2UgYW55IG1ldGhvZCBvbiB0aGUgcmVzdWx0IG9iamVjdAorCQkgKiAgICAgICAgICAgIHRvIGZhaWwgd2l0aCBhIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0uCisJCSAqIEBwYXJhbSA8VD4KKwkJICogICAgICAgICAgICB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSBjcmVhdGVkIGxpc3QuCisJCSAqIEByZXR1cm4gdGhlIHdyYXBwZWQgYXJyYXkuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJcHVibGljIHN0YXRpYyA8VD4gV3JhcHBlZEFycmF5PFQ+IGNyZWF0ZShUW10gYXJyYXkpIHsKKwkJCXJldHVybiBuZXcgV3JhcHBlZEFycmF5PFQ+KGFycmF5KTsKKwkJfQorCisJCXByaXZhdGUgVFtdIGFycmF5OworCisJCS8qKgorCQkgKiBJbnRlcm5hbCBjb25zdHJ1Y3RvciBmb3Ige0BsaW5rIFdyYXBwZWRBcnJheX0uCisJCSAqIAorCQkgKiBAcGFyYW0gYXJyYXkKKwkJICogICAgICAgICAgICB0aGUgdG8tYmUtd3JhcHBlZCBhcnJheS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIHdpbGwgY2F1c2UgYW55IG1ldGhvZCBvbiB0aGUgY3JlYXRlZAorCQkgKiAgICAgICAgICAgIG9iamVjdCB0byBmYWlsIHdpdGggYSB7QGxpbmsgTnVsbFBvaW50ZXJFeGNlcHRpb259LgorCQkgKi8KKwkJcHJvdGVjdGVkIFdyYXBwZWRBcnJheShUW10gYXJyYXkpIHsKKwkJCXRoaXMuYXJyYXkgPSBhcnJheTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqIAorCQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIGlmIHRoZSB3cmFwcGVkIGFycmF5IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgVCBnZXQoaW50IGluZGV4KSB7CisJCQlyZXR1cm4gYXJyYXlbaW5kZXhdOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICogCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAge0Bpbmhlcml0RG9jfQorCQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFQgc2V0KGludCBpbmRleCwgVCBlbGVtZW50KSB7CisJCQlUIG9sZCA9IGFycmF5W2luZGV4XTsKKwkJCWFycmF5W2luZGV4XSA9IGVsZW1lbnQ7CisJCQltb2RDb3VudCsrOworCQkJcmV0dXJuIG9sZDsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqIAorCQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIGlmIHRoZSB3cmFwcGVkIGFycmF5IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IHNpemUoKSB7CisJCQlyZXR1cm4gYXJyYXkubGVuZ3RoOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgeworCQkJcmV0dXJuIGFycmF5LmNsb25lKCk7CisJCX0KKworCQkvKioKKwkJICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBhcnJheSBpbiBhbiB1bnNhZmUgbWFubmVyLiBUaGF0IGlzLCBtb2RpZmljYXRpb24gb2YgdGhlIGFycmF5IHdpbGwgYmUgcmVmbGVjdGVkIGJ5CisJCSAqIHRoaXMgbGlzdCBhbmQgdmljZSB2ZXJzYS4KKwkJICogCisJCSAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcgYXJyYXkuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbGlzdCB3YXMge0BsaW5rICNjcmVhdGUoT2JqZWN0W10pIGNyZWF0ZWR9IHdpdGgKKwkJICogICAgICAgICBhIG51bGwgYXJndW1lbnQuCisJCSAqLworCQlwdWJsaWMgVFtdIGludGVybmFsVG9BcnJheSgpIHsKKwkJCW1vZENvdW50Kys7CisJCQlyZXR1cm4gYXJyYXk7CisJCX0KKworCX0KKworCS8qKgorCSAqIEEgbGlzdCB0aGF0IGlzIGNvbXBsZXRlbHkgYmFja2VkIGJ5IGFuIGFycmF5IG9mIHByaW1pdGl2ZXMgYW5kIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoYXQgYXJyYXkuIE9ubHkgZm9yCisJICogaW50ZXJuYWwgdXNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgV3JhcHBlZEJ5dGVBcnJheSBleHRlbmRzIEFic3RyYWN0TGlzdDxCeXRlPiBpbXBsZW1lbnRzIFJhbmRvbUFjY2VzcyB7CisKKwkJLyoqCisJCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFdyYXBwZWRCeXRlQXJyYXl9IHRoYXQgaXMgYmFja2VkIGJ5IHRoZSBnaXZlbiBwcmltaXRpdmUge0Bjb2RlIGFycmF5fS4KKwkJICoKKwkJICogQHBhcmFtIGFycmF5CisJCSAqICAgICAgICAgICAgdGhlIHRvLWJlLXdyYXBwZWQgYXJyYXkuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCB3aWxsIGNhdXNlIGFueSBtZXRob2Qgb24gdGhlIHJlc3VsdGluZworCQkgKiAgICAgICAgICAgIG9iamVjdCB0byBmYWlsLgorCQkgKiBAcmV0dXJuIHRoZSB3cmFwcGVkIGFycmF5LiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICovCisJCUBQdXJlCisJCXB1YmxpYyBzdGF0aWMgV3JhcHBlZEJ5dGVBcnJheSBjcmVhdGUoYnl0ZVtdIGFycmF5KSB7CisJCQlyZXR1cm4gbmV3IFdyYXBwZWRCeXRlQXJyYXkoYXJyYXkpOworCQl9CisKKwkJcHJpdmF0ZSBmaW5hbCBieXRlW10gYXJyYXk7CisKKwkJLyoqCisJCSAqIEludGVybmFsIGNvbnN0cnVjdG9yIGZvciB7QGxpbmsgV3JhcHBlZEJ5dGVBcnJheX0uCisJCSAqCisJCSAqIEBwYXJhbSBhcnJheQorCQkgKiAgICAgICAgICAgIHRoZSB0by1iZS13cmFwcGVkIGFycmF5LiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggd2lsbCBjYXVzZSBhbnkgbWV0aG9kIG9uIHRoZSBjcmVhdGVkCisJCSAqICAgICAgICAgICAgb2JqZWN0IHRvIGZhaWwgd2l0aCBhIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0uCisJCSAqLworCQlwcm90ZWN0ZWQgV3JhcHBlZEJ5dGVBcnJheShieXRlW10gYXJyYXkpIHsKKwkJCXRoaXMuYXJyYXkgPSBhcnJheTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKwkJICogICAgICAgICAgICAge0Bpbmhlcml0RG9jfQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBCeXRlIGdldChpbnQgaW5kZXgpIHsKKwkJCXJldHVybiBCeXRlLnZhbHVlT2YoYXJyYXlbaW5kZXhdKTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAge0Bpbmhlcml0RG9jfQorCQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEJ5dGUgc2V0KGludCBpbmRleCwgQnl0ZSBlbGVtZW50KSB7CisJCQltb2RDb3VudCsrOworCQkJYnl0ZSBvbGQgPSBhcnJheVtpbmRleF07CisJCQlhcnJheVtpbmRleF0gPSBlbGVtZW50LmJ5dGVWYWx1ZSgpOworCQkJcmV0dXJuIEJ5dGUudmFsdWVPZihvbGQpOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7CisJCQkvLyBXaWxsIG1ha2UgdGhlIG1ldGhvZCBmYWlsIGlmIGFycmF5IGlzIG51bGwuCisJCQlpZiAoc2l6ZSgpIDwgMSkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChvIGluc3RhbmNlb2YgQnl0ZSkgeworCQkJCXJldHVybiBCeXRlcy5pbmRleE9mKGFycmF5LCAoKEJ5dGUpIG8pLmJ5dGVWYWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8pIHsKKwkJCS8vIFdpbGwgbWFrZSB0aGUgbWV0aG9kIGZhaWwgaWYgYXJyYXkgaXMgbnVsbC4KKwkJCWlmIChzaXplKCkgPCAxKSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKG8gaW5zdGFuY2VvZiBCeXRlKSB7CisJCQkJcmV0dXJuIEJ5dGVzLmxhc3RJbmRleE9mKGFycmF5LCAoKEJ5dGUpIG8pLmJ5dGVWYWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisJCQkvLyBXaWxsIG1ha2UgdGhlIG1ldGhvZCBmYWlsIGlmIGFycmF5IGlzIG51bGwuCisJCQlpZiAoc2l6ZSgpIDwgMSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWlmIChvIGluc3RhbmNlb2YgQnl0ZSkgeworCQkJCXJldHVybiBCeXRlcy5jb250YWlucyhhcnJheSwgKChCeXRlKSBvKS5ieXRlVmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvKioKKwkJICoge0Bpbmhlcml0RG9jfQorCQkgKgorCQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIGlmIHRoZSB3cmFwcGVkIGFycmF5IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IHNpemUoKSB7CisJCQlyZXR1cm4gYXJyYXkubGVuZ3RoOworCQl9CisKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYXJyYXkgaW4gYW4gdW5zYWZlIG1hbm5lci4gVGhhdCBpcywgbW9kaWZpY2F0aW9uIG9mIHRoZSBhcnJheSB3aWxsIGJlIHJlZmxlY3RlZCBieQorCQkgKiB0aGlzIGxpc3QgYW5kIHZpY2UgdmVyc2EuCisJCSAqCisJCSAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcgYXJyYXkuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbGlzdCB3YXMge0BsaW5rICNjcmVhdGUoYnl0ZVtdKSBjcmVhdGVkfSB3aXRoIGEKKwkJICogICAgICAgICBudWxsIGFyZ3VtZW50LgorCQkgKi8KKwkJcHVibGljIGJ5dGVbXSBpbnRlcm5hbFRvQXJyYXkoKSB7CisJCQltb2RDb3VudCsrOworCQkJcmV0dXJuIGFycmF5OworCQl9CisJfQorCisJLyoqCisJICogQSBsaXN0IHRoYXQgaXMgY29tcGxldGVseSBiYWNrZWQgYnkgYW4gYXJyYXkgb2YgcHJpbWl0aXZlcyBhbmQgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhhdCBhcnJheS4gT25seSBmb3IKKwkgKiBpbnRlcm5hbCB1c2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBXcmFwcGVkU2hvcnRBcnJheSBleHRlbmRzIEFic3RyYWN0TGlzdDxTaG9ydD4gaW1wbGVtZW50cyBSYW5kb21BY2Nlc3MgeworCisJCS8qKgorCQkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBXcmFwcGVkU2hvcnRBcnJheX0gdGhhdCBpcyBiYWNrZWQgYnkgdGhlIGdpdmVuIHByaW1pdGl2ZSB7QGNvZGUgYXJyYXl9LgorCQkgKgorCQkgKiBAcGFyYW0gYXJyYXkKKwkJICogICAgICAgICAgICB0aGUgdG8tYmUtd3JhcHBlZCBhcnJheS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIHdpbGwgY2F1c2UgYW55IG1ldGhvZCBvbiB0aGUgcmVzdWx0aW5nCisJCSAqICAgICAgICAgICAgb2JqZWN0IHRvIGZhaWwuCisJCSAqIEByZXR1cm4gdGhlIHdyYXBwZWQgYXJyYXkuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJQFB1cmUKKwkJcHVibGljIHN0YXRpYyBXcmFwcGVkU2hvcnRBcnJheSBjcmVhdGUoc2hvcnRbXSBhcnJheSkgeworCQkJcmV0dXJuIG5ldyBXcmFwcGVkU2hvcnRBcnJheShhcnJheSk7CisJCX0KKworCQlwcml2YXRlIGZpbmFsIHNob3J0W10gYXJyYXk7CisKKwkJLyoqCisJCSAqIEludGVybmFsIGNvbnN0cnVjdG9yIGZvciB7QGxpbmsgV3JhcHBlZFNob3J0QXJyYXl9LgorCQkgKgorCQkgKiBAcGFyYW0gYXJyYXkKKwkJICogICAgICAgICAgICB0aGUgdG8tYmUtd3JhcHBlZCBhcnJheS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIHdpbGwgY2F1c2UgYW55IG1ldGhvZCBvbiB0aGUgY3JlYXRlZAorCQkgKiAgICAgICAgICAgIG9iamVjdCB0byBmYWlsIHdpdGggYSB7QGxpbmsgTnVsbFBvaW50ZXJFeGNlcHRpb259LgorCQkgKi8KKwkJcHJvdGVjdGVkIFdyYXBwZWRTaG9ydEFycmF5KHNob3J0W10gYXJyYXkpIHsKKwkJCXRoaXMuYXJyYXkgPSBhcnJheTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKwkJICogICAgICAgICAgICAge0Bpbmhlcml0RG9jfQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTaG9ydCBnZXQoaW50IGluZGV4KSB7CisJCQlyZXR1cm4gU2hvcnQudmFsdWVPZihhcnJheVtpbmRleF0pOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU2hvcnQgc2V0KGludCBpbmRleCwgU2hvcnQgZWxlbWVudCkgeworCQkJbW9kQ291bnQrKzsKKwkJCXNob3J0IG9sZCA9IGFycmF5W2luZGV4XTsKKwkJCWFycmF5W2luZGV4XSA9IGVsZW1lbnQuc2hvcnRWYWx1ZSgpOworCQkJcmV0dXJuIFNob3J0LnZhbHVlT2Yob2xkKTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgeworCQkJLy8gV2lsbCBtYWtlIHRoZSBtZXRob2QgZmFpbCBpZiBhcnJheSBpcyBudWxsLgorCQkJaWYgKHNpemUoKSA8IDEpIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAobyBpbnN0YW5jZW9mIFNob3J0KSB7CisJCQkJcmV0dXJuIFNob3J0cy5pbmRleE9mKGFycmF5LCAoKFNob3J0KSBvKS5zaG9ydFZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgeworCQkJLy8gV2lsbCBtYWtlIHRoZSBtZXRob2QgZmFpbCBpZiBhcnJheSBpcyBudWxsLgorCQkJaWYgKHNpemUoKSA8IDEpIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAobyBpbnN0YW5jZW9mIFNob3J0KSB7CisJCQkJcmV0dXJuIFNob3J0cy5sYXN0SW5kZXhPZihhcnJheSwgKChTaG9ydCkgbykuc2hvcnRWYWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisJCQkvLyBXaWxsIG1ha2UgdGhlIG1ldGhvZCBmYWlsIGlmIGFycmF5IGlzIG51bGwuCisJCQlpZiAoc2l6ZSgpIDwgMSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWlmIChvIGluc3RhbmNlb2YgU2hvcnQpIHsKKwkJCQlyZXR1cm4gU2hvcnRzLmNvbnRhaW5zKGFycmF5LCAoKFNob3J0KSBvKS5zaG9ydFZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBzaXplKCkgeworCQkJcmV0dXJuIGFycmF5Lmxlbmd0aDsKKwkJfQorCisJCS8qKgorCQkgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGFycmF5IGluIGFuIHVuc2FmZSBtYW5uZXIuIFRoYXQgaXMsIG1vZGlmaWNhdGlvbiBvZiB0aGUgYXJyYXkgd2lsbCBiZSByZWZsZWN0ZWQgYnkKKwkJICogdGhpcyBsaXN0IGFuZCB2aWNlIHZlcnNhLgorCQkgKgorCQkgKiBAcmV0dXJuIHRoZSB1bmRlcmx5aW5nIGFycmF5LiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGxpc3Qgd2FzIHtAbGluayAjY3JlYXRlKHNob3J0W10pIGNyZWF0ZWR9IHdpdGgKKwkJICogICAgICAgICBhIG51bGwgYXJndW1lbnQuCisJCSAqLworCQlwdWJsaWMgc2hvcnRbXSBpbnRlcm5hbFRvQXJyYXkoKSB7CisJCQltb2RDb3VudCsrOworCQkJcmV0dXJuIGFycmF5OworCQl9CisJfQorCisJLyoqCisJICogQSBsaXN0IHRoYXQgaXMgY29tcGxldGVseSBiYWNrZWQgYnkgYW4gYXJyYXkgb2YgcHJpbWl0aXZlcyBhbmQgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhhdCBhcnJheS4gT25seSBmb3IKKwkgKiBpbnRlcm5hbCB1c2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBXcmFwcGVkSW50ZWdlckFycmF5IGV4dGVuZHMgQWJzdHJhY3RMaXN0PEludGVnZXI+IGltcGxlbWVudHMgUmFuZG9tQWNjZXNzIHsKKworCQkvKioKKwkJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgV3JhcHBlZEludGVnZXJBcnJheX0gdGhhdCBpcyBiYWNrZWQgYnkgdGhlIGdpdmVuIHByaW1pdGl2ZSB7QGNvZGUgYXJyYXl9LgorCQkgKgorCQkgKiBAcGFyYW0gYXJyYXkKKwkJICogICAgICAgICAgICB0aGUgdG8tYmUtd3JhcHBlZCBhcnJheS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIHdpbGwgY2F1c2UgYW55IG1ldGhvZCBvbiB0aGUgcmVzdWx0aW5nCisJCSAqICAgICAgICAgICAgb2JqZWN0IHRvIGZhaWwuCisJCSAqIEByZXR1cm4gdGhlIHdyYXBwZWQgYXJyYXkuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJQFB1cmUKKwkJcHVibGljIHN0YXRpYyBXcmFwcGVkSW50ZWdlckFycmF5IGNyZWF0ZShpbnRbXSBhcnJheSkgeworCQkJcmV0dXJuIG5ldyBXcmFwcGVkSW50ZWdlckFycmF5KGFycmF5KTsKKwkJfQorCisJCXByaXZhdGUgZmluYWwgaW50W10gYXJyYXk7CisKKwkJLyoqCisJCSAqIEludGVybmFsIGNvbnN0cnVjdG9yIGZvciB7QGxpbmsgV3JhcHBlZEludGVnZXJBcnJheX0uCisJCSAqCisJCSAqIEBwYXJhbSBhcnJheQorCQkgKiAgICAgICAgICAgIHRoZSB0by1iZS13cmFwcGVkIGFycmF5LiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggd2lsbCBjYXVzZSBhbnkgbWV0aG9kIG9uIHRoZSBjcmVhdGVkCisJCSAqICAgICAgICAgICAgb2JqZWN0IHRvIGZhaWwgd2l0aCBhIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0uCisJCSAqLworCQlwcm90ZWN0ZWQgV3JhcHBlZEludGVnZXJBcnJheShpbnRbXSBhcnJheSkgeworCQkJdGhpcy5hcnJheSA9IGFycmF5OworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEludGVnZXIgZ2V0KGludCBpbmRleCkgeworCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZihhcnJheVtpbmRleF0pOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgSW50ZWdlciBzZXQoaW50IGluZGV4LCBJbnRlZ2VyIGVsZW1lbnQpIHsKKwkJCW1vZENvdW50Kys7CisJCQlpbnQgb2xkID0gYXJyYXlbaW5kZXhdOworCQkJYXJyYXlbaW5kZXhdID0gZWxlbWVudC5pbnRWYWx1ZSgpOworCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZihvbGQpOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7CisJCQkvLyBXaWxsIG1ha2UgdGhlIG1ldGhvZCBmYWlsIGlmIGFycmF5IGlzIG51bGwuCisJCQlpZiAoc2l6ZSgpIDwgMSkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChvIGluc3RhbmNlb2YgSW50ZWdlcikgeworCQkJCXJldHVybiBJbnRzLmluZGV4T2YoYXJyYXksICgoSW50ZWdlcikgbykuaW50VmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKioKKwkJICoge0Bpbmhlcml0RG9jfQorCQkgKgorCQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIGlmIHRoZSB3cmFwcGVkIGFycmF5IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7CisJCQkvLyBXaWxsIG1ha2UgdGhlIG1ldGhvZCBmYWlsIGlmIGFycmF5IGlzIG51bGwuCisJCQlpZiAoc2l6ZSgpIDwgMSkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChvIGluc3RhbmNlb2YgSW50ZWdlcikgeworCQkJCXJldHVybiBJbnRzLmxhc3RJbmRleE9mKGFycmF5LCAoKEludGVnZXIpIG8pLmludFZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKKwkJCS8vIFdpbGwgbWFrZSB0aGUgbWV0aG9kIGZhaWwgaWYgYXJyYXkgaXMgbnVsbC4KKwkJCWlmIChzaXplKCkgPCAxKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJaWYgKG8gaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisJCQkJcmV0dXJuIEludHMuY29udGFpbnMoYXJyYXksICgoSW50ZWdlcikgbykuaW50VmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvKioKKwkJICoge0Bpbmhlcml0RG9jfQorCQkgKgorCQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIGlmIHRoZSB3cmFwcGVkIGFycmF5IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IHNpemUoKSB7CisJCQlyZXR1cm4gYXJyYXkubGVuZ3RoOworCQl9CisKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYXJyYXkgaW4gYW4gdW5zYWZlIG1hbm5lci4gVGhhdCBpcywgbW9kaWZpY2F0aW9uIG9mIHRoZSBhcnJheSB3aWxsIGJlIHJlZmxlY3RlZCBieQorCQkgKiB0aGlzIGxpc3QgYW5kIHZpY2UgdmVyc2EuCisJCSAqCisJCSAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcgYXJyYXkuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbGlzdCB3YXMge0BsaW5rICNjcmVhdGUoaW50W10pIGNyZWF0ZWR9IHdpdGggYQorCQkgKiAgICAgICAgIG51bGwgYXJndW1lbnQuCisJCSAqLworCQlwdWJsaWMgaW50W10gaW50ZXJuYWxUb0FycmF5KCkgeworCQkJbW9kQ291bnQrKzsKKwkJCXJldHVybiBhcnJheTsKKwkJfQorCX0KKworCS8qKgorCSAqIEEgbGlzdCB0aGF0IGlzIGNvbXBsZXRlbHkgYmFja2VkIGJ5IGFuIGFycmF5IG9mIHByaW1pdGl2ZXMgYW5kIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoYXQgYXJyYXkuIE9ubHkgZm9yCisJICogaW50ZXJuYWwgdXNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgV3JhcHBlZExvbmdBcnJheSBleHRlbmRzIEFic3RyYWN0TGlzdDxMb25nPiBpbXBsZW1lbnRzIFJhbmRvbUFjY2VzcyB7CisKKwkJLyoqCisJCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFdyYXBwZWRMb25nQXJyYXl9IHRoYXQgaXMgYmFja2VkIGJ5IHRoZSBnaXZlbiBwcmltaXRpdmUge0Bjb2RlIGFycmF5fS4KKwkJICoKKwkJICogQHBhcmFtIGFycmF5CisJCSAqICAgICAgICAgICAgdGhlIHRvLWJlLXdyYXBwZWQgYXJyYXkuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCB3aWxsIGNhdXNlIGFueSBtZXRob2Qgb24gdGhlIHJlc3VsdGluZworCQkgKiAgICAgICAgICAgIG9iamVjdCB0byBmYWlsLgorCQkgKiBAcmV0dXJuIHRoZSB3cmFwcGVkIGFycmF5LiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICovCisJCUBQdXJlCisJCXB1YmxpYyBzdGF0aWMgV3JhcHBlZExvbmdBcnJheSBjcmVhdGUobG9uZ1tdIGFycmF5KSB7CisJCQlyZXR1cm4gbmV3IFdyYXBwZWRMb25nQXJyYXkoYXJyYXkpOworCQl9CisKKwkJcHJpdmF0ZSBmaW5hbCBsb25nW10gYXJyYXk7CisKKwkJLyoqCisJCSAqIEludGVybmFsIGNvbnN0cnVjdG9yIGZvciB7QGxpbmsgV3JhcHBlZExvbmdBcnJheX0uCisJCSAqCisJCSAqIEBwYXJhbSBhcnJheQorCQkgKiAgICAgICAgICAgIHRoZSB0by1iZS13cmFwcGVkIGFycmF5LiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggd2lsbCBjYXVzZSBhbnkgbWV0aG9kIG9uIHRoZSBjcmVhdGVkCisJCSAqICAgICAgICAgICAgb2JqZWN0IHRvIGZhaWwgd2l0aCBhIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0uCisJCSAqLworCQlwcm90ZWN0ZWQgV3JhcHBlZExvbmdBcnJheShsb25nW10gYXJyYXkpIHsKKwkJCXRoaXMuYXJyYXkgPSBhcnJheTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKwkJICogICAgICAgICAgICAge0Bpbmhlcml0RG9jfQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBMb25nIGdldChpbnQgaW5kZXgpIHsKKwkJCXJldHVybiBMb25nLnZhbHVlT2YoYXJyYXlbaW5kZXhdKTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAge0Bpbmhlcml0RG9jfQorCQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIExvbmcgc2V0KGludCBpbmRleCwgTG9uZyBlbGVtZW50KSB7CisJCQltb2RDb3VudCsrOworCQkJbG9uZyBvbGQgPSBhcnJheVtpbmRleF07CisJCQlhcnJheVtpbmRleF0gPSBlbGVtZW50LmxvbmdWYWx1ZSgpOworCQkJcmV0dXJuIExvbmcudmFsdWVPZihvbGQpOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7CisJCQkvLyBXaWxsIG1ha2UgdGhlIG1ldGhvZCBmYWlsIGlmIGFycmF5IGlzIG51bGwuCisJCQlpZiAoc2l6ZSgpIDwgMSkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChvIGluc3RhbmNlb2YgTG9uZykgeworCQkJCXJldHVybiBMb25ncy5pbmRleE9mKGFycmF5LCAoKExvbmcpIG8pLmxvbmdWYWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8pIHsKKwkJCS8vIFdpbGwgbWFrZSB0aGUgbWV0aG9kIGZhaWwgaWYgYXJyYXkgaXMgbnVsbC4KKwkJCWlmIChzaXplKCkgPCAxKSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKG8gaW5zdGFuY2VvZiBMb25nKSB7CisJCQkJcmV0dXJuIExvbmdzLmxhc3RJbmRleE9mKGFycmF5LCAoKExvbmcpIG8pLmxvbmdWYWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisJCQkvLyBXaWxsIG1ha2UgdGhlIG1ldGhvZCBmYWlsIGlmIGFycmF5IGlzIG51bGwuCisJCQlpZiAoc2l6ZSgpIDwgMSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWlmIChvIGluc3RhbmNlb2YgTG9uZykgeworCQkJCXJldHVybiBMb25ncy5jb250YWlucyhhcnJheSwgKChMb25nKSBvKS5sb25nVmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvKioKKwkJICoge0Bpbmhlcml0RG9jfQorCQkgKgorCQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIGlmIHRoZSB3cmFwcGVkIGFycmF5IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IHNpemUoKSB7CisJCQlyZXR1cm4gYXJyYXkubGVuZ3RoOworCQl9CisKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYXJyYXkgaW4gYW4gdW5zYWZlIG1hbm5lci4gVGhhdCBpcywgbW9kaWZpY2F0aW9uIG9mIHRoZSBhcnJheSB3aWxsIGJlIHJlZmxlY3RlZCBieQorCQkgKiB0aGlzIGxpc3QgYW5kIHZpY2UgdmVyc2EuCisJCSAqCisJCSAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcgYXJyYXkuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbGlzdCB3YXMge0BsaW5rICNjcmVhdGUobG9uZ1tdKSBjcmVhdGVkfSB3aXRoIGEKKwkJICogICAgICAgICBudWxsIGFyZ3VtZW50LgorCQkgKi8KKwkJcHVibGljIGxvbmdbXSBpbnRlcm5hbFRvQXJyYXkoKSB7CisJCQltb2RDb3VudCsrOworCQkJcmV0dXJuIGFycmF5OworCQl9CisJfQorCisJLyoqCisJICogQSBsaXN0IHRoYXQgaXMgY29tcGxldGVseSBiYWNrZWQgYnkgYW4gYXJyYXkgb2YgcHJpbWl0aXZlcyBhbmQgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhhdCBhcnJheS4gT25seSBmb3IKKwkgKiBpbnRlcm5hbCB1c2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBXcmFwcGVkRmxvYXRBcnJheSBleHRlbmRzIEFic3RyYWN0TGlzdDxGbG9hdD4gaW1wbGVtZW50cyBSYW5kb21BY2Nlc3MgeworCisJCS8qKgorCQkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBXcmFwcGVkRmxvYXRBcnJheX0gdGhhdCBpcyBiYWNrZWQgYnkgdGhlIGdpdmVuIHByaW1pdGl2ZSB7QGNvZGUgYXJyYXl9LgorCQkgKgorCQkgKiBAcGFyYW0gYXJyYXkKKwkJICogICAgICAgICAgICB0aGUgdG8tYmUtd3JhcHBlZCBhcnJheS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIHdpbGwgY2F1c2UgYW55IG1ldGhvZCBvbiB0aGUgcmVzdWx0aW5nCisJCSAqICAgICAgICAgICAgb2JqZWN0IHRvIGZhaWwuCisJCSAqIEByZXR1cm4gdGhlIHdyYXBwZWQgYXJyYXkuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJQFB1cmUKKwkJcHVibGljIHN0YXRpYyBXcmFwcGVkRmxvYXRBcnJheSBjcmVhdGUoZmxvYXRbXSBhcnJheSkgeworCQkJcmV0dXJuIG5ldyBXcmFwcGVkRmxvYXRBcnJheShhcnJheSk7CisJCX0KKworCQlwcml2YXRlIGZpbmFsIGZsb2F0W10gYXJyYXk7CisKKwkJLyoqCisJCSAqIEludGVybmFsIGNvbnN0cnVjdG9yIGZvciB7QGxpbmsgV3JhcHBlZEZsb2F0QXJyYXl9LgorCQkgKgorCQkgKiBAcGFyYW0gYXJyYXkKKwkJICogICAgICAgICAgICB0aGUgdG8tYmUtd3JhcHBlZCBhcnJheS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIHdpbGwgY2F1c2UgYW55IG1ldGhvZCBvbiB0aGUgY3JlYXRlZAorCQkgKiAgICAgICAgICAgIG9iamVjdCB0byBmYWlsIHdpdGggYSB7QGxpbmsgTnVsbFBvaW50ZXJFeGNlcHRpb259LgorCQkgKi8KKwkJcHJvdGVjdGVkIFdyYXBwZWRGbG9hdEFycmF5KGZsb2F0W10gYXJyYXkpIHsKKwkJCXRoaXMuYXJyYXkgPSBhcnJheTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKwkJICogICAgICAgICAgICAge0Bpbmhlcml0RG9jfQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBGbG9hdCBnZXQoaW50IGluZGV4KSB7CisJCQlyZXR1cm4gRmxvYXQudmFsdWVPZihhcnJheVtpbmRleF0pOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgRmxvYXQgc2V0KGludCBpbmRleCwgRmxvYXQgZWxlbWVudCkgeworCQkJbW9kQ291bnQrKzsKKwkJCWZsb2F0IG9sZCA9IGFycmF5W2luZGV4XTsKKwkJCWFycmF5W2luZGV4XSA9IGVsZW1lbnQuZmxvYXRWYWx1ZSgpOworCQkJcmV0dXJuIEZsb2F0LnZhbHVlT2Yob2xkKTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgeworCQkJLy8gV2lsbCBtYWtlIHRoZSBtZXRob2QgZmFpbCBpZiBhcnJheSBpcyBudWxsLgorCQkJaWYgKHNpemUoKSA8IDEpIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAobyBpbnN0YW5jZW9mIEZsb2F0KSB7CisJCQkJcmV0dXJuIEZsb2F0cy5pbmRleE9mKGFycmF5LCAoKEZsb2F0KSBvKS5mbG9hdFZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgeworCQkJLy8gV2lsbCBtYWtlIHRoZSBtZXRob2QgZmFpbCBpZiBhcnJheSBpcyBudWxsLgorCQkJaWYgKHNpemUoKSA8IDEpIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAobyBpbnN0YW5jZW9mIEZsb2F0KSB7CisJCQkJcmV0dXJuIEZsb2F0cy5sYXN0SW5kZXhPZihhcnJheSwgKChGbG9hdCkgbykuZmxvYXRWYWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisJCQkvLyBXaWxsIG1ha2UgdGhlIG1ldGhvZCBmYWlsIGlmIGFycmF5IGlzIG51bGwuCisJCQlpZiAoc2l6ZSgpIDwgMSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWlmIChvIGluc3RhbmNlb2YgRmxvYXQpIHsKKwkJCQlyZXR1cm4gRmxvYXRzLmNvbnRhaW5zKGFycmF5LCAoKEZsb2F0KSBvKS5mbG9hdFZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBzaXplKCkgeworCQkJcmV0dXJuIGFycmF5Lmxlbmd0aDsKKwkJfQorCisJCS8qKgorCQkgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGFycmF5IGluIGFuIHVuc2FmZSBtYW5uZXIuIFRoYXQgaXMsIG1vZGlmaWNhdGlvbiBvZiB0aGUgYXJyYXkgd2lsbCBiZSByZWZsZWN0ZWQgYnkKKwkJICogdGhpcyBsaXN0IGFuZCB2aWNlIHZlcnNhLgorCQkgKgorCQkgKiBAcmV0dXJuIHRoZSB1bmRlcmx5aW5nIGFycmF5LiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGxpc3Qgd2FzIHtAbGluayAjY3JlYXRlKGZsb2F0W10pIGNyZWF0ZWR9IHdpdGgKKwkJICogICAgICAgICBhIG51bGwgYXJndW1lbnQuCisJCSAqLworCQlwdWJsaWMgZmxvYXRbXSBpbnRlcm5hbFRvQXJyYXkoKSB7CisJCQltb2RDb3VudCsrOworCQkJcmV0dXJuIGFycmF5OworCQl9CisJfQorCisJLyoqCisJICogQSBsaXN0IHRoYXQgaXMgY29tcGxldGVseSBiYWNrZWQgYnkgYW4gYXJyYXkgb2YgcHJpbWl0aXZlcyBhbmQgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhhdCBhcnJheS4gT25seSBmb3IKKwkgKiBpbnRlcm5hbCB1c2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBXcmFwcGVkRG91YmxlQXJyYXkgZXh0ZW5kcyBBYnN0cmFjdExpc3Q8RG91YmxlPiBpbXBsZW1lbnRzIFJhbmRvbUFjY2VzcyB7CisKKwkJLyoqCisJCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFdyYXBwZWREb3VibGVBcnJheX0gdGhhdCBpcyBiYWNrZWQgYnkgdGhlIGdpdmVuIHByaW1pdGl2ZSB7QGNvZGUgYXJyYXl9LgorCQkgKgorCQkgKiBAcGFyYW0gYXJyYXkKKwkJICogICAgICAgICAgICB0aGUgdG8tYmUtd3JhcHBlZCBhcnJheS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIHdpbGwgY2F1c2UgYW55IG1ldGhvZCBvbiB0aGUgcmVzdWx0aW5nCisJCSAqICAgICAgICAgICAgb2JqZWN0IHRvIGZhaWwuCisJCSAqIEByZXR1cm4gdGhlIHdyYXBwZWQgYXJyYXkuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJQFB1cmUKKwkJcHVibGljIHN0YXRpYyBXcmFwcGVkRG91YmxlQXJyYXkgY3JlYXRlKGRvdWJsZVtdIGFycmF5KSB7CisJCQlyZXR1cm4gbmV3IFdyYXBwZWREb3VibGVBcnJheShhcnJheSk7CisJCX0KKworCQlwcml2YXRlIGZpbmFsIGRvdWJsZVtdIGFycmF5OworCisJCS8qKgorCQkgKiBJbnRlcm5hbCBjb25zdHJ1Y3RvciBmb3Ige0BsaW5rIFdyYXBwZWREb3VibGVBcnJheX0uCisJCSAqCisJCSAqIEBwYXJhbSBhcnJheQorCQkgKiAgICAgICAgICAgIHRoZSB0by1iZS13cmFwcGVkIGFycmF5LiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggd2lsbCBjYXVzZSBhbnkgbWV0aG9kIG9uIHRoZSBjcmVhdGVkCisJCSAqICAgICAgICAgICAgb2JqZWN0IHRvIGZhaWwgd2l0aCBhIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0uCisJCSAqLworCQlwcm90ZWN0ZWQgV3JhcHBlZERvdWJsZUFycmF5KGRvdWJsZVtdIGFycmF5KSB7CisJCQl0aGlzLmFycmF5ID0gYXJyYXk7CisJCX0KKworCQkvKioKKwkJICoge0Bpbmhlcml0RG9jfQorCQkgKgorCQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIGlmIHRoZSB3cmFwcGVkIGFycmF5IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgRG91YmxlIGdldChpbnQgaW5kZXgpIHsKKwkJCXJldHVybiBEb3VibGUudmFsdWVPZihhcnJheVtpbmRleF0pOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgRG91YmxlIHNldChpbnQgaW5kZXgsIERvdWJsZSBlbGVtZW50KSB7CisJCQltb2RDb3VudCsrOworCQkJZG91YmxlIG9sZCA9IGFycmF5W2luZGV4XTsKKwkJCWFycmF5W2luZGV4XSA9IGVsZW1lbnQuZG91YmxlVmFsdWUoKTsKKwkJCXJldHVybiBEb3VibGUudmFsdWVPZihvbGQpOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7CisJCQkvLyBXaWxsIG1ha2UgdGhlIG1ldGhvZCBmYWlsIGlmIGFycmF5IGlzIG51bGwuCisJCQlpZiAoc2l6ZSgpIDwgMSkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChvIGluc3RhbmNlb2YgRG91YmxlKSB7CisJCQkJcmV0dXJuIERvdWJsZXMuaW5kZXhPZihhcnJheSwgKChEb3VibGUpIG8pLmRvdWJsZVZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgeworCQkJLy8gV2lsbCBtYWtlIHRoZSBtZXRob2QgZmFpbCBpZiBhcnJheSBpcyBudWxsLgorCQkJaWYgKHNpemUoKSA8IDEpIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAobyBpbnN0YW5jZW9mIERvdWJsZSkgeworCQkJCXJldHVybiBEb3VibGVzLmxhc3RJbmRleE9mKGFycmF5LCAoKERvdWJsZSkgbykuZG91YmxlVmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKioKKwkJICoge0Bpbmhlcml0RG9jfQorCQkgKgorCQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIGlmIHRoZSB3cmFwcGVkIGFycmF5IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworCQkJLy8gV2lsbCBtYWtlIHRoZSBtZXRob2QgZmFpbCBpZiBhcnJheSBpcyBudWxsLgorCQkJaWYgKHNpemUoKSA8IDEpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlpZiAobyBpbnN0YW5jZW9mIERvdWJsZSkgeworCQkJCXJldHVybiBEb3VibGVzLmNvbnRhaW5zKGFycmF5LCAoKERvdWJsZSkgbykuZG91YmxlVmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvKioKKwkJICoge0Bpbmhlcml0RG9jfQorCQkgKgorCQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIGlmIHRoZSB3cmFwcGVkIGFycmF5IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IHNpemUoKSB7CisJCQlyZXR1cm4gYXJyYXkubGVuZ3RoOworCQl9CisKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYXJyYXkgaW4gYW4gdW5zYWZlIG1hbm5lci4gVGhhdCBpcywgbW9kaWZpY2F0aW9uIG9mIHRoZSBhcnJheSB3aWxsIGJlIHJlZmxlY3RlZCBieQorCQkgKiB0aGlzIGxpc3QgYW5kIHZpY2UgdmVyc2EuCisJCSAqCisJCSAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcgYXJyYXkuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbGlzdCB3YXMge0BsaW5rICNjcmVhdGUoZG91YmxlW10pIGNyZWF0ZWR9IHdpdGgKKwkJICogICAgICAgICBhIG51bGwgYXJndW1lbnQuCisJCSAqLworCQlwdWJsaWMgZG91YmxlW10gaW50ZXJuYWxUb0FycmF5KCkgeworCQkJbW9kQ291bnQrKzsKKwkJCXJldHVybiBhcnJheTsKKwkJfQorCX0KKworCS8qKgorCSAqIEEgbGlzdCB0aGF0IGlzIGNvbXBsZXRlbHkgYmFja2VkIGJ5IGFuIGFycmF5IG9mIHByaW1pdGl2ZXMgYW5kIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoYXQgYXJyYXkuIE9ubHkgZm9yCisJICogaW50ZXJuYWwgdXNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgV3JhcHBlZENoYXJhY3RlckFycmF5IGV4dGVuZHMgQWJzdHJhY3RMaXN0PENoYXJhY3Rlcj4gaW1wbGVtZW50cyBSYW5kb21BY2Nlc3MgeworCisJCS8qKgorCQkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBXcmFwcGVkQ2hhcmFjdGVyQXJyYXl9IHRoYXQgaXMgYmFja2VkIGJ5IHRoZSBnaXZlbiBwcmltaXRpdmUge0Bjb2RlIGFycmF5fS4KKwkJICoKKwkJICogQHBhcmFtIGFycmF5CisJCSAqICAgICAgICAgICAgdGhlIHRvLWJlLXdyYXBwZWQgYXJyYXkuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCB3aWxsIGNhdXNlIGFueSBtZXRob2Qgb24gdGhlIHJlc3VsdGluZworCQkgKiAgICAgICAgICAgIG9iamVjdCB0byBmYWlsLgorCQkgKiBAcmV0dXJuIHRoZSB3cmFwcGVkIGFycmF5LiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICovCisJCUBQdXJlCisJCXB1YmxpYyBzdGF0aWMgV3JhcHBlZENoYXJhY3RlckFycmF5IGNyZWF0ZShjaGFyW10gYXJyYXkpIHsKKwkJCXJldHVybiBuZXcgV3JhcHBlZENoYXJhY3RlckFycmF5KGFycmF5KTsKKwkJfQorCisJCXByaXZhdGUgZmluYWwgY2hhcltdIGFycmF5OworCisJCS8qKgorCQkgKiBJbnRlcm5hbCBjb25zdHJ1Y3RvciBmb3Ige0BsaW5rIFdyYXBwZWRDaGFyYWN0ZXJBcnJheX0uCisJCSAqCisJCSAqIEBwYXJhbSBhcnJheQorCQkgKiAgICAgICAgICAgIHRoZSB0by1iZS13cmFwcGVkIGFycmF5LiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggd2lsbCBjYXVzZSBhbnkgbWV0aG9kIG9uIHRoZSBjcmVhdGVkCisJCSAqICAgICAgICAgICAgb2JqZWN0IHRvIGZhaWwgd2l0aCBhIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0uCisJCSAqLworCQlwcm90ZWN0ZWQgV3JhcHBlZENoYXJhY3RlckFycmF5KGNoYXJbXSBhcnJheSkgeworCQkJdGhpcy5hcnJheSA9IGFycmF5OworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIENoYXJhY3RlciBnZXQoaW50IGluZGV4KSB7CisJCQlyZXR1cm4gQ2hhcmFjdGVyLnZhbHVlT2YoYXJyYXlbaW5kZXhdKTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAge0Bpbmhlcml0RG9jfQorCQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIENoYXJhY3RlciBzZXQoaW50IGluZGV4LCBDaGFyYWN0ZXIgZWxlbWVudCkgeworCQkJbW9kQ291bnQrKzsKKwkJCWNoYXIgb2xkID0gYXJyYXlbaW5kZXhdOworCQkJYXJyYXlbaW5kZXhdID0gZWxlbWVudC5jaGFyVmFsdWUoKTsKKwkJCXJldHVybiBDaGFyYWN0ZXIudmFsdWVPZihvbGQpOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7CisJCQkvLyBXaWxsIG1ha2UgdGhlIG1ldGhvZCBmYWlsIGlmIGFycmF5IGlzIG51bGwuCisJCQlpZiAoc2l6ZSgpIDwgMSkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChvIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7CisJCQkJcmV0dXJuIENoYXJzLmluZGV4T2YoYXJyYXksICgoQ2hhcmFjdGVyKSBvKS5jaGFyVmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKioKKwkJICoge0Bpbmhlcml0RG9jfQorCQkgKgorCQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIGlmIHRoZSB3cmFwcGVkIGFycmF5IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7CisJCQkvLyBXaWxsIG1ha2UgdGhlIG1ldGhvZCBmYWlsIGlmIGFycmF5IGlzIG51bGwuCisJCQlpZiAoc2l6ZSgpIDwgMSkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChvIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7CisJCQkJcmV0dXJuIENoYXJzLmxhc3RJbmRleE9mKGFycmF5LCAoKENoYXJhY3RlcikgbykuY2hhclZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKKwkJCS8vIFdpbGwgbWFrZSB0aGUgbWV0aG9kIGZhaWwgaWYgYXJyYXkgaXMgbnVsbC4KKwkJCWlmIChzaXplKCkgPCAxKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJaWYgKG8gaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKKwkJCQlyZXR1cm4gQ2hhcnMuY29udGFpbnMoYXJyYXksICgoQ2hhcmFjdGVyKSBvKS5jaGFyVmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvKioKKwkJICoge0Bpbmhlcml0RG9jfQorCQkgKgorCQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIGlmIHRoZSB3cmFwcGVkIGFycmF5IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IHNpemUoKSB7CisJCQlyZXR1cm4gYXJyYXkubGVuZ3RoOworCQl9CisKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYXJyYXkgaW4gYW4gdW5zYWZlIG1hbm5lci4gVGhhdCBpcywgbW9kaWZpY2F0aW9uIG9mIHRoZSBhcnJheSB3aWxsIGJlIHJlZmxlY3RlZCBieQorCQkgKiB0aGlzIGxpc3QgYW5kIHZpY2UgdmVyc2EuCisJCSAqCisJCSAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcgYXJyYXkuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbGlzdCB3YXMge0BsaW5rICNjcmVhdGUoY2hhcltdKSBjcmVhdGVkfSB3aXRoIGEKKwkJICogICAgICAgICBudWxsIGFyZ3VtZW50LgorCQkgKi8KKwkJcHVibGljIGNoYXJbXSBpbnRlcm5hbFRvQXJyYXkoKSB7CisJCQltb2RDb3VudCsrOworCQkJcmV0dXJuIGFycmF5OworCQl9CisJfQorCisJLyoqCisJICogQSBsaXN0IHRoYXQgaXMgY29tcGxldGVseSBiYWNrZWQgYnkgYW4gYXJyYXkgb2YgcHJpbWl0aXZlcyBhbmQgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhhdCBhcnJheS4gT25seSBmb3IKKwkgKiBpbnRlcm5hbCB1c2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBXcmFwcGVkQm9vbGVhbkFycmF5IGV4dGVuZHMgQWJzdHJhY3RMaXN0PEJvb2xlYW4+IGltcGxlbWVudHMgUmFuZG9tQWNjZXNzIHsKKworCQkvKioKKwkJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgV3JhcHBlZEJvb2xlYW5BcnJheX0gdGhhdCBpcyBiYWNrZWQgYnkgdGhlIGdpdmVuIHByaW1pdGl2ZSB7QGNvZGUgYXJyYXl9LgorCQkgKgorCQkgKiBAcGFyYW0gYXJyYXkKKwkJICogICAgICAgICAgICB0aGUgdG8tYmUtd3JhcHBlZCBhcnJheS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIHdpbGwgY2F1c2UgYW55IG1ldGhvZCBvbiB0aGUgcmVzdWx0aW5nCisJCSAqICAgICAgICAgICAgb2JqZWN0IHRvIGZhaWwuCisJCSAqIEByZXR1cm4gdGhlIHdyYXBwZWQgYXJyYXkuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJQFB1cmUKKwkJcHVibGljIHN0YXRpYyBXcmFwcGVkQm9vbGVhbkFycmF5IGNyZWF0ZShib29sZWFuW10gYXJyYXkpIHsKKwkJCXJldHVybiBuZXcgV3JhcHBlZEJvb2xlYW5BcnJheShhcnJheSk7CisJCX0KKworCQlwcml2YXRlIGZpbmFsIGJvb2xlYW5bXSBhcnJheTsKKworCQkvKioKKwkJICogSW50ZXJuYWwgY29uc3RydWN0b3IgZm9yIHtAbGluayBXcmFwcGVkQm9vbGVhbkFycmF5fS4KKwkJICoKKwkJICogQHBhcmFtIGFycmF5CisJCSAqICAgICAgICAgICAgdGhlIHRvLWJlLXdyYXBwZWQgYXJyYXkuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCB3aWxsIGNhdXNlIGFueSBtZXRob2Qgb24gdGhlIGNyZWF0ZWQKKwkJICogICAgICAgICAgICBvYmplY3QgdG8gZmFpbCB3aXRoIGEge0BsaW5rIE51bGxQb2ludGVyRXhjZXB0aW9ufS4KKwkJICovCisJCXByb3RlY3RlZCBXcmFwcGVkQm9vbGVhbkFycmF5KGJvb2xlYW5bXSBhcnJheSkgeworCQkJdGhpcy5hcnJheSA9IGFycmF5OworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEJvb2xlYW4gZ2V0KGludCBpbmRleCkgeworCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihhcnJheVtpbmRleF0pOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICB7QGluaGVyaXREb2N9CisJCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgQm9vbGVhbiBzZXQoaW50IGluZGV4LCBCb29sZWFuIGVsZW1lbnQpIHsKKwkJCW1vZENvdW50Kys7CisJCQlib29sZWFuIG9sZCA9IGFycmF5W2luZGV4XTsKKwkJCWFycmF5W2luZGV4XSA9IGVsZW1lbnQuYm9vbGVhblZhbHVlKCk7CisJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKG9sZCk7CisJCX0KKworCQkvKioKKwkJICoge0Bpbmhlcml0RG9jfQorCQkgKgorCQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJCSAqICAgICAgICAgICAgIGlmIHRoZSB3cmFwcGVkIGFycmF5IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pIHsKKwkJCS8vIFdpbGwgbWFrZSB0aGUgbWV0aG9kIGZhaWwgaWYgYXJyYXkgaXMgbnVsbC4KKwkJCWlmIChzaXplKCkgPCAxKSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKG8gaW5zdGFuY2VvZiBCb29sZWFuKSB7CisJCQkJcmV0dXJuIEJvb2xlYW5zLmluZGV4T2YoYXJyYXksICgoQm9vbGVhbikgbykuYm9vbGVhblZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgeworCQkJLy8gV2lsbCBtYWtlIHRoZSBtZXRob2QgZmFpbCBpZiBhcnJheSBpcyBudWxsLgorCQkJaWYgKHNpemUoKSA8IDEpIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAobyBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKwkJCQlyZXR1cm4gQm9vbGVhbnMubGFzdEluZGV4T2YoYXJyYXksICgoQm9vbGVhbikgbykuYm9vbGVhblZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICoKKwkJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkgKiAgICAgICAgICAgICBpZiB0aGUgd3JhcHBlZCBhcnJheSB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKKwkJCS8vIFdpbGwgbWFrZSB0aGUgbWV0aG9kIGZhaWwgaWYgYXJyYXkgaXMgbnVsbC4KKwkJCWlmIChzaXplKCkgPCAxKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJaWYgKG8gaW5zdGFuY2VvZiBCb29sZWFuKSB7CisJCQkJcmV0dXJuIEJvb2xlYW5zLmNvbnRhaW5zKGFycmF5LCAoKEJvb2xlYW4pIG8pLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqCisJCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgdGhlIHdyYXBwZWQgYXJyYXkgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgc2l6ZSgpIHsKKwkJCXJldHVybiBhcnJheS5sZW5ndGg7CisJCX0KKworCQkvKioKKwkJICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBhcnJheSBpbiBhbiB1bnNhZmUgbWFubmVyLiBUaGF0IGlzLCBtb2RpZmljYXRpb24gb2YgdGhlIGFycmF5IHdpbGwgYmUgcmVmbGVjdGVkIGJ5CisJCSAqIHRoaXMgbGlzdCBhbmQgdmljZSB2ZXJzYS4KKwkJICoKKwkJICogQHJldHVybiB0aGUgdW5kZXJseWluZyBhcnJheS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBsaXN0IHdhcyB7QGxpbmsgI2NyZWF0ZShib29sZWFuW10pIGNyZWF0ZWR9CisJCSAqICAgICAgICAgd2l0aCBhIG51bGwgYXJndW1lbnQuCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbltdIGludGVybmFsVG9BcnJheSgpIHsKKwkJCW1vZENvdW50Kys7CisJCQlyZXR1cm4gYXJyYXk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvRG91YmxlRXh0ZW5zaW9ucy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvRG91YmxlRXh0ZW5zaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZTE0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9Eb3VibGVFeHRlbnNpb25zLmphdmEKQEAgLTAsMCArMSwxNTY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CisKKworLyoqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBsaWJyYXJ5IGZvciB7QGxpbmsgRG91YmxlIGZsb2F0aW5nIHBvaW50IG51bWJlcnN9LCBlLmcuIDxjb2RlPmRvdWJsZTwvY29kZT4gb3IgPGNvZGU+RG91YmxlPC9jb2RlPi4KKyAqIAorICogQGF1dGhvciBKYW4gS29laG5sZWluIC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICogQHNpbmNlIDIuMworICovCitAR3d0Q29tcGF0aWJsZSBwdWJsaWMgY2xhc3MgRG91YmxlRXh0ZW5zaW9ucyB7CisKKwkvKioKKwkgKiBUaGUgdW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSB1bmFyeSBqYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhIGRvdWJsZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIDxjb2RlPi1hPC9jb2RlPgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYX0gaXMgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9taW51cyhEb3VibGUgYSkgeworCQlyZXR1cm4gLWE7CisJfQorCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wbHVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgamF2YSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgYSBkb3VibGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGIKKwkgKiAgICAgICAgICAgIGEgbnVtYmVyLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gPGNvZGU+YStiPC9jb2RlPgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYX0gb3Ige0Bjb2RlIGJ9IGlzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcGx1cyhEb3VibGUgYSwgTnVtYmVyIGIpIHsKKwkJcmV0dXJuIGEgKyBiLmRvdWJsZVZhbHVlKCk7CisJfQorCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIGphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgZG91YmxlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBiCisJICogICAgICAgICAgICBhIG51bWJlci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYge0Bjb2RlIGF9IG9yIHtAY29kZSBifSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX21pbnVzKERvdWJsZSBhLCBOdW1iZXIgYikgeworCQlyZXR1cm4gYSAtIGIuZG91YmxlVmFsdWUoKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhIGRvdWJsZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgYSBudW1iZXIuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiA8Y29kZT5hICoqIGI8L2NvZGU+CisJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHtAY29kZSBhfSBvciB7QGNvZGUgYn0gaXMgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihEb3VibGUgYSwgTnVtYmVyIGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIuZG91YmxlVmFsdWUoKSk7CisJfQorCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT50aW1lczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIGphdmEgPGNvZGU+KjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgZG91YmxlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBiCisJICogICAgICAgICAgICBhIG51bWJlci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYge0Bjb2RlIGF9IG9yIHtAY29kZSBifSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9tdWx0aXBseShEb3VibGUgYSwgTnVtYmVyIGIpIHsKKwkJcmV0dXJuIGEgKiBiLmRvdWJsZVZhbHVlKCk7CisJfQorCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBqYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLiBUaGF0IGlzLCB0aGUKKwkgKiByZXN1bHQgd2lsbCBiZSB0aGUgaW50ZWdyYWwgcmVzdWx0IG9mIHRoZSBkaXZpc2lvbiwgZS5nLiA8Y29kZT5vcGVyYXRvcl9kaXZpZGUoMSwgMik8L2NvZGU+IHlpZWxkcyA8Y29kZT4wPC9jb2RlPgorCSAqIC4KKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgYSBkb3VibGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGIKKwkgKiAgICAgICAgICAgIGEgbnVtYmVyLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gPGNvZGU+YS9iPC9jb2RlPgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYX0gb3Ige0Bjb2RlIGJ9IGlzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfZGl2aWRlKERvdWJsZSBhLCBOdW1iZXIgYikgeworCQlyZXR1cm4gYSAvIGIuZG91YmxlVmFsdWUoKTsKKwl9CisKKwkvLyBCRUdJTiBnZW5lcmF0ZWQgY29kZQorCS8qKgorCSAqIFRoZSB1bmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT4tPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gZCAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPi1kPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigtJDEpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbWludXMoZG91YmxlIGQpIHsKKwkJcmV0dXJuIC1kOworCX0KKwkKKwkvKioKKwkgKiBUaGUgcG9zdGZpeCA8Y29kZT5kZWNyZW1lbnQ8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+LS08L2NvZGU+IHBvc3RmaXggZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGQgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5kLS08L2NvZGU+CisJICogQHNpbmNlIDIuNgorCSAqLworCUBJbmxpbmUodmFsdWU9IiQxLS0iKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX21pbnVzTWludXMoZG91YmxlIGQpIHsKKwkJdGhyb3cgbmV3IEhhcmRjb2RlZEluSW50ZXJwcmV0ZXJFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogVGhlIHBvc3RmaXggPGNvZGU+ZGVjcmVtZW50PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPi0tPC9jb2RlPiBwb3N0Zml4IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBkICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+ZC0tPC9jb2RlPgorCSAqIEBzaW5jZSAyLjYKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMS0tIikKKwlwdWJsaWMgc3RhdGljIERvdWJsZSBvcGVyYXRvcl9taW51c01pbnVzKERvdWJsZSBkKSB7CisJCXRocm93IG5ldyBIYXJkY29kZWRJbkludGVycHJldGVyRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIFRoZSBwb3N0Zml4IDxjb2RlPmluY3JlbWVudDwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT4rKzwvY29kZT4gcG9zdGZpeCBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gZCAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmQrKzwvY29kZT4KKwkgKiBAc2luY2UgMi42CisJICovCisJQElubGluZSh2YWx1ZT0iJDErKyIpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcGx1c1BsdXMoZG91YmxlIGQpIHsKKwkJdGhyb3cgbmV3IEhhcmRjb2RlZEluSW50ZXJwcmV0ZXJFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogVGhlIHBvc3RmaXggPGNvZGU+aW5jcmVtZW50PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPisrPC9jb2RlPiBwb3N0Zml4IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBkICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+ZCsrPC9jb2RlPgorCSAqIEBzaW5jZSAyLjYKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMSsrIikKKwlwdWJsaWMgc3RhdGljIERvdWJsZSBvcGVyYXRvcl9wbHVzUGx1cyhEb3VibGUgZCkgeworCQl0aHJvdyBuZXcgSGFyZGNvZGVkSW5JbnRlcnByZXRlckV4Y2VwdGlvbigpOworCX0KKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wbHVzKGRvdWJsZSBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9taW51cyhkb3VibGUgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgLSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm11bHRpcGx5PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbXVsdGlwbHkoZG91YmxlIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9kaXZpZGUoZG91YmxlIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmElYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9tb2R1bG8oZG91YmxlIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhICUgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihkb3VibGUgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGRvdWJsZSBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKGRvdWJsZSBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSA+IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlckVxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4oZG91YmxlIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhkb3VibGUgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGRvdWJsZSBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPk1hdGgucG93KCk8L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihkb3VibGUgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGRvdWJsZSBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhkb3VibGUgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wbHVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wbHVzKGRvdWJsZSBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbWludXMoZG91YmxlIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgLSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm11bHRpcGx5PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9tdWx0aXBseShkb3VibGUgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAqIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZGl2aWRlPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4vPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9kaXZpZGUoZG91YmxlIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbW9kdWxvKGRvdWJsZSBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhICUgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKGRvdWJsZSBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhIDwgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGRvdWJsZSBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihkb3VibGUgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA+IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlckVxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihkb3VibGUgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA+PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+PT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhkb3VibGUgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhkb3VibGUgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPk1hdGgucG93KCk8L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKGRvdWJsZSBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBNYXRoLnBvdyhhLCBiKTsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPj09PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGRvdWJsZSBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoZG91YmxlIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wbHVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YStiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3BsdXMoZG91YmxlIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbWludXMoZG91YmxlIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbXVsdGlwbHkoZG91YmxlIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAqIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZGl2aWRlPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4vPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS9iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAvICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX2RpdmlkZShkb3VibGUgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbW9kdWxvKGRvdWJsZSBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihkb3VibGUgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhIDwgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4oZG91YmxlIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihkb3VibGUgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4oZG91YmxlIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSA+PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+PT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKGRvdWJsZSBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhkb3VibGUgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihkb3VibGUgYSwgbG9uZyBiKSB7CisJCXJldHVybiBNYXRoLnBvdyhhLCBiKTsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPj09PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoZG91YmxlIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoZG91YmxlIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YStiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3BsdXMoZG91YmxlIGEsIGludCBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbWludXMoZG91YmxlIGEsIGludCBiKSB7CisJCXJldHVybiBhIC0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tdWx0aXBseTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbXVsdGlwbHkoZG91YmxlIGEsIGludCBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS9iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAvICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX2RpdmlkZShkb3VibGUgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbW9kdWxvKGRvdWJsZSBhLCBpbnQgYikgeworCQlyZXR1cm4gYSAlIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihkb3VibGUgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4oZG91YmxlIGEsIGludCBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihkb3VibGUgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4oZG91YmxlIGEsIGludCBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKGRvdWJsZSBhLCBpbnQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhkb3VibGUgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wb3dlcjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT5NYXRoLnBvdygpPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihkb3VibGUgYSwgaW50IGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoZG91YmxlIGEsIGludCBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoZG91YmxlIGEsIGludCBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cGx1czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YStiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3BsdXMoZG91YmxlIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9taW51cyhkb3VibGUgYSwgY2hhciBiKSB7CisJCXJldHVybiBhIC0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tdWx0aXBseTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX211bHRpcGx5KGRvdWJsZSBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgKiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmRpdmlkZTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS9iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAvICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX2RpdmlkZShkb3VibGUgYSwgY2hhciBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmElYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9tb2R1bG8oZG91YmxlIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAlIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oZG91YmxlIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4oZG91YmxlIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKGRvdWJsZSBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgPiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKGRvdWJsZSBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKGRvdWJsZSBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGRvdWJsZSBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wb3dlcjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT5NYXRoLnBvdygpPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoZG91YmxlIGEsIGNoYXIgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoZG91YmxlIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhkb3VibGUgYSwgY2hhciBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cGx1czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcGx1cyhkb3VibGUgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX21pbnVzKGRvdWJsZSBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhIC0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tdWx0aXBseTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbXVsdGlwbHkoZG91YmxlIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgKiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmRpdmlkZTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfZGl2aWRlKGRvdWJsZSBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX21vZHVsbyhkb3VibGUgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSAlIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihkb3VibGUgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihkb3VibGUgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlclRoYW4oZG91YmxlIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4oZG91YmxlIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoZG91YmxlIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEhPWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ub3RFcXVhbHMoZG91YmxlIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wb3dlcjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT5NYXRoLnBvdygpPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihkb3VibGUgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhkb3VibGUgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSAhPSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlTm90RXF1YWxzKGRvdWJsZSBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cGx1czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wbHVzKGRvdWJsZSBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX21pbnVzKGRvdWJsZSBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgLSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm11bHRpcGx5PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX211bHRpcGx5KGRvdWJsZSBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgKiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmRpdmlkZTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9kaXZpZGUoZG91YmxlIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX21vZHVsbyhkb3VibGUgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhICUgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oZG91YmxlIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGRvdWJsZSBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgPD0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlclRoYW4oZG91YmxlIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA+IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlckVxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKGRvdWJsZSBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhkb3VibGUgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bm90RXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4hPTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZG91YmxlLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEhPWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ub3RFcXVhbHMoZG91YmxlIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPk1hdGgucG93KCk8L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGRvdWJsZS4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoZG91YmxlIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGRvdWJsZSBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IG5vdCBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT4hPTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBkb3VibGUuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSAhPSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlTm90RXF1YWxzKGRvdWJsZSBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLy8gRU5EIGdlbmVyYXRlZCBjb2RlCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9FeGNlcHRpb25zLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9FeGNlcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiNjA5MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0V4Y2VwdGlvbnMuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CisKKy8qKgorICogVXNlZnVsIGhlbHBlciBtZXRob2RzIHdoZW4gZGVhbGluZyB3aXRoIGV4Y2VwdGlvbnMuCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKi8KK0BHd3RDb21wYXRpYmxlIHB1YmxpYyBjbGFzcyBFeGNlcHRpb25zIHsKKworCS8qCisJICogc2hhbWVsZXNzbHkgdGFrZW4gZnJvbSBQcm9qZWN0IExvbWJvaworCSAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yendpdHNlcmxvb3QvbG9tYm9rL2Jsb2IvbWFzdGVyL3NyYy9jb3JlL2xvbWJvay9Mb21ib2suamF2YQorCSAqLworCS8qKgorCSAqIFRocm93cyB0aGUgZ2l2ZW4gZXhjZXB0aW9uIGFuZCBzbmVha3MgaXQgdGhyb3VnaCBhbnkgY29tcGlsZXIgY2hlY2tzLiBUaGlzCisJICogYWxsb3dzIHRvIHRocm93IGNoZWNrZWQgZXhjZXB0aW9ucyB3aXRob3V0IHRoZSBuZWVkIHRvIGRlY2xhcmUgaXQuCisJICogQ2xpZW50cyBzaG91bGQgdXNlIHRoZSBmb2xsb3dpbmcgaWRpb20gdG8gdHJpY2sgc3RhdGljIGFuYWx5c2lzIGFuZCBkZWFkIGNvZGUgY2hlY2tzOgorCSAqIDxwcmU+CisJICogdGhyb3cgc25lYWt5VGhyb3cobmV3IENoZWNrZWRFeGNlcHRpb24oIkNhdGNoIG1lIGlmIHlvdSBjYW4gOy0pIikpLgorCSAqIDwvcHJlPgorCSAqIFRoaXMgbWV0aG9kIGlzIGhlYXZpbHkgaW5zcGlyZWQgYnkgcHJvamVjdAorCSAqIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9yendpdHNlcmxvb3QvbG9tYm9rL2Jsb2IvbWFzdGVyL3NyYy9jb3JlL2xvbWJvay9Mb21ib2suamF2YSI+TG9tYm9rPC9hPi4KKwkgKiBAcGFyYW0gdCB0aGUgdGhyb3dhYmxlIHRoYXQgc2hvdWxkIGJlIHNuZWFrZWQgdGhyb3VnaCBjb21waWxlciBjaGVja3MuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBuZXZlciByZXR1cm5zIGFueXRoaW5nIHNpbmNlIHtAY29kZSB0fSBpcyBhbHdheXMgdGhyb3duLgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYge0Bjb2RlIHR9IGlzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgUnVudGltZUV4Y2VwdGlvbiBzbmVha3lUaHJvdyhUaHJvd2FibGUgdCkgeworCQlpZiAodCA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0Iik7CisJCUV4Y2VwdGlvbnMuPFJ1bnRpbWVFeGNlcHRpb24+IHNuZWFreVRocm93MCh0KTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSBzdGF0aWMgPFQgZXh0ZW5kcyBUaHJvd2FibGU+IHZvaWQgc25lYWt5VGhyb3cwKFRocm93YWJsZSB0KSB0aHJvd3MgVCB7CisJCXRocm93IChUKSB0OworCX0KK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0V4Y2x1c2l2ZVJhbmdlLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9FeGNsdXNpdmVSYW5nZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMDZjZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9FeGNsdXNpdmVSYW5nZS5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlOworCisvKioKKyAqIEEgc2VxdWVuY2Ugb2YgaW50ZWdlcnMgc3RhcnRpbmcgZnJvbSA8Y29kZT5zdGFydDwvY29kZT4gdG8gPGNvZGU+ZW5kPC9jb2RlPiBjb3VudGluZyB1cCBvciBkb3duLgorICogSXQgZXhjbHVkZXMgdGhlIDxjb2RlPmVuZDwvY29kZT4gdmFsdWUgd2hlbiBjb3VudGluZyB1cCBhbmQgdGhlIDxjb2RlPnN0YXJ0PC9jb2RlPiB2YWx1ZSB3aGVuIGNvdW50aW5nIGRvd24uICAgCisgKiAKKyAqIEV4YW1wbGVzOgorICogPHRhYmxlPgorICogPHRyPjx0ZD48Y29kZT5uZXcgRXhjbHVzaXZlUmFuZ2UoMSwgNSwgdHJ1ZSk8L2NvZGU+PC90ZD48dGQ+KDEsMiwzLDQpPC90ZD48L3RyPgorICogPHRyPjx0ZD48Y29kZT5uZXcgRXhjbHVzaXZlUmFuZ2UoMCwgMCwgdHJ1ZSk8L2NvZGU+PC90ZD48dGQ+KCk8L3RkPjwvdHI+CisgKiA8dHI+PHRkPjxjb2RlPm5ldyBFeGNsdXNpdmVSYW5nZSgwLCAtMSwgdHJ1ZSk8L2NvZGU+PC90ZD48dGQ+KCk8L3RkPjwvdHI+CisgKiA8dHI+PHRkPjxjb2RlPm5ldyBFeGNsdXNpdmVSYW5nZSgtMSwgMCwgdHJ1ZSk8L2NvZGU+PC90ZD48dGQ+KC0xKTwvdGQ+PC90cj4KKyAqIDx0cj48dGQ+PGNvZGU+bmV3IEV4Y2x1c2l2ZVJhbmdlKDUsIDEsIGZhbHNlKTwvY29kZT48L3RkPjx0ZD4oNCwzLDIsMSk8L3RkPjwvdHI+CisgKiA8dHI+PHRkPjxjb2RlPm5ldyBFeGNsdXNpdmVSYW5nZSgwLCAwLCBmYWxzZSk8L2NvZGU+PC90ZD48dGQ+KCk8L3RkPjwvdHI+CisgKiA8dHI+PHRkPjxjb2RlPm5ldyBFeGNsdXNpdmVSYW5nZSgtMSwgMCwgZmFsc2UpPC9jb2RlPjwvdGQ+PHRkPigpPC90ZD48L3RyPgorICogPHRyPjx0ZD48Y29kZT5uZXcgRXhjbHVzaXZlUmFuZ2UoMCwgLTEsIGZhbHNlKTwvY29kZT48L3RkPjx0ZD4oLTEpPC90ZD48L3RyPgorICogPC90YWJsZT4KKyAqIAorICogQXMgb3Bwb3NlZCB0byB7QGxpbmsgSW50ZWdlclJhbmdlfSB0aGlzIGNsYXNzIG1lZXRzIHRoZSByZXF1aXJlbWVudHMgdG8gaXRlcmF0ZSBhcnJheXMgb3IgbGlzdHMgd2l0aG91dCAKKyAqIHRoZSBuZWVkIGZvciBmdXJ0aGVyIGd1YXJkcywgZS5nLgorICogCisgKiA8cHJlPgorICogZm9yKGk6IG5ldyBFeGNsdXNpdmVSYW5nZSgwLCBsaXN0LnNpemUsIHRydWUpKSAKKyAqICAgbGlzdC5nZXQoaSkuLi4KKyAqIAorICogZm9yKGk6IG5ldyBFeGNsdXNpdmVSYW5nZShhcnJheS5sZW5ndGgsIDAsIGZhbHNlKSkgCisgKiAgIGFycmF5LmdldChpKS4uLgorICogCisgKiBmb3IoaTogbmV3IEV4Y2x1c2l2ZVJhbmdlKDAsIHN0cmluZy5pbmRleE9mKCd4JyksIHRydWUpCisgKiAgIHN0cmluZy5jaGFyQXQoaSkuLi4KKyAqIDwvcHJlPgorICogCisgKiBAYXV0aG9yIEphbiBLb2VobmxlaW4gLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKiBAc2luY2UgMi40CisgKi8KK0BHd3RDb21wYXRpYmxlIAorcHVibGljIGNsYXNzIEV4Y2x1c2l2ZVJhbmdlIGltcGxlbWVudHMgSXRlcmFibGU8SW50ZWdlcj4geworCisJcHJpdmF0ZSBmaW5hbCBpbnQgZmlyc3Q7CisJcHJpdmF0ZSBmaW5hbCBpbnQgbGFzdDsKKwlwcml2YXRlIGZpbmFsIGludCBzdGVwOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdEl0ZXJhdG9yPEludGVnZXI+IEVNUFRZX0xJU1RfSVRFUkFUT1IgPSBuZXcgTGlzdEl0ZXJhdG9yPEludGVnZXI+KCkgeworCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBJbnRlZ2VyIG5leHQoKSB7CisJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBJbnRlZ2VyIHByZXZpb3VzKCkgeworCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcmVtb3ZlKCkgeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgcmVtb3ZlIGVsZW1lbnRzIGZyb20gYSBSYW5nZSIpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHNldChJbnRlZ2VyIGUpIHsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IHNldCBlbGVtZW50cyBpbiBhIFJhbmdlIik7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgYWRkKEludGVnZXIgZSkgeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgYWRkIGVsZW1lbnRzIHRvIGEgUmFuZ2UiKTsKKwkJfQorCX07CisJCisJLyoqCisJICogQHJldHVybiBhIHJlYWQtb25seSB7QGxpbmsgTGlzdEl0ZXJhdG9yfSBmb3IgdGhpcy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlAUHVyZQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SW50ZWdlcj4gaXRlcmF0b3IoKSB7CisJCXJldHVybiBpc0VtcHR5KCkgPyBFTVBUWV9MSVNUX0lURVJBVE9SIDogbmV3IFJhbmdlSXRlcmF0b3IoKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IEV4Y2x1c2l2ZVJhbmdlIG9iamVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IHZhbHVlCisJICogQHBhcmFtIGVuZCB0aGUgZW5kIHZhbHVlCisJICogQHBhcmFtIGluY3JlbWVudAorCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgdGhlIHJhbmdlIGdvZXMgZnJvbSBzdGFydCB1cCB0byBlbmQgKGV4Y2x1c2l2ZSkKKwkgKiAgICAgICAgICAgIGlmIGZhbHNlLCB0aGUgcmFuZ2UgZ29lcyBmcm9tIGVuZCBkb3duIHRvIHN0YXJ0IChleGNsdXNpdmUpCisJICovCisJQFB1cmUKKwlwdWJsaWMgRXhjbHVzaXZlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sZWFuIGluY3JlbWVudCkgeworCQlpZiAoaW5jcmVtZW50KSB7CisJCQlmaXJzdCA9IHN0YXJ0OworCQkJbGFzdCA9IGVuZCAtIDE7CisJCQlzdGVwID0gMTsKKwkJfSBlbHNlIHsKKwkJCWZpcnN0ID0gc3RhcnQgLSAxOworCQkJbGFzdCA9IGVuZDsKKwkJCXN0ZXAgPSAtMTsKKwkJfSAKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBFeGNsdXNpdmVSYW5nZS4gCisJICogCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgRXhjbHVzaXZlUmFuZ2UuCisJICovCisJQFB1cmUKKwlwdWJsaWMgaW50IHNpemUoKSB7CisJCXJldHVybiAoaXNFbXB0eSgpKSA/IDAgOiBNYXRoLmFicyhsYXN0IC0gZmlyc3QpICsgMTsKKwl9CisKKworCS8qKiAKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpcyByYW5nZSBpcyBlbXB0eS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyByYW5nZSBpcyBlbXB0eS4KKwkgKi8KKwlAUHVyZSAKKwlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworCQlyZXR1cm4gKGxhc3QgLSBmaXJzdCkgKiBzdGVwIDwgMDsKKwl9CisJCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjb250YWlucyB0aGUgZ2l2ZW4gbnVtYmVyLCBpLmUuIHdoZXRoZXIgdGhlIGl0ZXJhdG9yIHdpbGwgeWllbGQgdGhlIG51bWJlci4gVGhpcyBpcyBkaWZmZXJlbnQKKwkgKiBmcm9tIGludGVydmFsIGNvbnRhaW5tZW50OiA8Y29kZT4wLi4yLmJ5KDIpPC9jb2RlPiB3aWxsIDxlbT5ub3Q8L2VtPiBjb250YWluIDEuCisJICogCisJICogQHBhcmFtIG51bWJlcgorCSAqICAgICAgICAgICAgdGhlIG51bWJlciB0byBiZSBjaGVja2VkIGZvciBjb250YWlubWVudC4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBzZXF1ZW5jZSBjb250YWlucyB0aGUgZ2l2ZW4gbnVtYmVyIG9yIG5vdC4KKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCBudW1iZXIpIHsKKwkJaWYgKGlzRW1wdHkoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYoc3RlcCA9PSAtMSkKKwkJCXJldHVybiBudW1iZXIgPD0gZmlyc3QgJiYgbnVtYmVyID49IGxhc3Q7CisJCWVsc2UKKwkJCXJldHVybiBudW1iZXIgPj0gZmlyc3QgJiYgbnVtYmVyIDw9IGxhc3Q7CisJfQorCisJcHJpdmF0ZSBjbGFzcyBSYW5nZUl0ZXJhdG9yIGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEludGVnZXI+IHsKKworCQlwcml2YXRlIGludCBuZXh0ID0gZmlyc3Q7CisJCXByaXZhdGUgaW50IG5leHRJbmRleCA9IDA7CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisJCQlpZiAoc3RlcCA8IDApCisJCQkJcmV0dXJuIG5leHQgPj0gbGFzdDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gbmV4dCA8PSBsYXN0OworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBJbnRlZ2VyIG5leHQoKSB7CisJCQlpZiAoIWhhc05leHQoKSkgeworCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisJCQl9CisJCQlpbnQgdmFsdWUgPSBuZXh0OworCQkJbmV4dCArPSBzdGVwOworCQkJKytuZXh0SW5kZXg7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7CisJCQlyZXR1cm4gbmV4dEluZGV4ID4gMDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgSW50ZWdlciBwcmV2aW91cygpIHsKKwkJCWlmIChuZXh0SW5kZXggPD0gMCkKKwkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworCQkJLS1uZXh0SW5kZXg7CisJCQluZXh0IC09IHN0ZXA7CisJCQlyZXR1cm4gbmV4dDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKKwkJCXJldHVybiBuZXh0SW5kZXg7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgeworCQkJcmV0dXJuIG5leHRJbmRleCAtIDE7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcmVtb3ZlKCkgeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgcmVtb3ZlIGVsZW1lbnRzIGZyb20gYSBSYW5nZSIpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHNldChJbnRlZ2VyIGUpIHsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IHNldCBlbGVtZW50cyBpbiBhIFJhbmdlIik7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgYWRkKEludGVnZXIgZSkgeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgYWRkIGVsZW1lbnRzIHRvIGEgUmFuZ2UiKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0V4dGVuc2lvbi5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvRXh0ZW5zaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiMWM2OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0V4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKKworLyoqCisgKiBNYXJrcyBhIGZpZWxkLCBwYXJhbWV0ZXIgb3IgbG9jYWwgdmFyaWFibGUgYXMgZXh0ZW5zaW9uIHByb3ZpZGVyLgorICogCisgKiBBbm5vdGF0ZWQgZXh0ZW5zaW9uIGZpZWxkcyBhcmUgaW5oZXJpdGVkIGlmIHRoZWlyIHZpc2liaWxpdHkgaXMgc2V0CisgKiBhY2NvcmRpbmdseS4KKyAqICAKKyAqIEBhdXRob3IgU2ViYXN0aWFuIFphcm5la293IC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICogCisgKiBAc2luY2UgMi40CisgKi8KK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KHsKKyAgICBFbGVtZW50VHlwZS5GSUVMRCwKKyAgICBFbGVtZW50VHlwZS5QQVJBTUVURVIsCisgICAgRWxlbWVudFR5cGUuTE9DQUxfVkFSSUFCTEUKK30pCitARG9jdW1lbnRlZAorQEJldGEKK0BHd3RDb21wYXRpYmxlIHB1YmxpYyBAaW50ZXJmYWNlIEV4dGVuc2lvbiB7CisKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0Zsb2F0RXh0ZW5zaW9ucy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvRmxvYXRFeHRlbnNpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3YzdmNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0Zsb2F0RXh0ZW5zaW9ucy5qYXZhCkBAIC0wLDAgKzEsMTQ3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMiBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlOworCisKKy8qKgorICogVGhpcyBpcyBhbiBleHRlbnNpb24gbGlicmFyeSBmb3Ige0BsaW5rIEZsb2F0fSBudW1iZXJzLgorICogCisgKiBAYXV0aG9yIEphbiBLb2VobmxlaW4gLSBDb2RlIGdlbmVyYXRvcgorICogQHNpbmNlIDIuMworICovCitAR3d0Q29tcGF0aWJsZSBwdWJsaWMgY2xhc3MgRmxvYXRFeHRlbnNpb25zIHsKKwkvLyBCRUdJTiBnZW5lcmF0ZWQgY29kZQorCS8qKgorCSAqIFRoZSB1bmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT4tPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gZiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+LWY8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKC0kMSkiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX21pbnVzKGZsb2F0IGYpIHsKKwkJcmV0dXJuIC1mOworCX0KKwkKKwkvKioKKwkgKiBUaGUgcG9zdGZpeCA8Y29kZT5kZWNyZW1lbnQ8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+LS08L2NvZGU+IHBvc3RmaXggZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGYgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmYtLTwvY29kZT4KKwkgKiBAc2luY2UgMi42CisJICovCisJQElubGluZSh2YWx1ZT0iJDEtLSIpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9taW51c01pbnVzKGZsb2F0IGYpIHsKKwkJdGhyb3cgbmV3IEhhcmRjb2RlZEluSW50ZXJwcmV0ZXJFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogVGhlIHBvc3RmaXggPGNvZGU+ZGVjcmVtZW50PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPi0tPC9jb2RlPiBwb3N0Zml4IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBmICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5mLS08L2NvZGU+CisJICogQHNpbmNlIDIuNgorCSAqLworCUBJbmxpbmUodmFsdWU9IiQxLS0iKQorCXB1YmxpYyBzdGF0aWMgRmxvYXQgb3BlcmF0b3JfbWludXNNaW51cyhGbG9hdCBmKSB7CisJCXRocm93IG5ldyBIYXJkY29kZWRJbkludGVycHJldGVyRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIFRoZSBwb3N0Zml4IDxjb2RlPmluY3JlbWVudDwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT4rKzwvY29kZT4gcG9zdGZpeCBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gZiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+ZisrPC9jb2RlPgorCSAqIEBzaW5jZSAyLjYKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMSsrIikKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX3BsdXNQbHVzKGZsb2F0IGYpIHsKKwkJdGhyb3cgbmV3IEhhcmRjb2RlZEluSW50ZXJwcmV0ZXJFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogVGhlIHBvc3RmaXggPGNvZGU+aW5jcmVtZW50PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPisrPC9jb2RlPiBwb3N0Zml4IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBmICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5mKys8L2NvZGU+CisJICogQHNpbmNlIDIuNgorCSAqLworCUBJbmxpbmUodmFsdWU9IiQxKysiKQorCXB1YmxpYyBzdGF0aWMgRmxvYXQgb3BlcmF0b3JfcGx1c1BsdXMoRmxvYXQgZikgeworCQl0aHJvdyBuZXcgSGFyZGNvZGVkSW5JbnRlcnByZXRlckV4Y2VwdGlvbigpOworCX0KKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YStiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3BsdXMoZmxvYXQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9taW51cyhmbG9hdCBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX211bHRpcGx5KGZsb2F0IGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS9iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAvICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX2RpdmlkZShmbG9hdCBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmElYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9tb2R1bG8oZmxvYXQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oZmxvYXQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4oZmxvYXQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPD0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKGZsb2F0IGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKGZsb2F0IGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKGZsb2F0IGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bm90RXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4hPTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGZsb2F0IGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoZmxvYXQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoZmxvYXQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IG5vdCBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT4hPTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhmbG9hdCBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9wbHVzKGZsb2F0IGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbWludXMoZmxvYXQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9tdWx0aXBseShmbG9hdCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9kaXZpZGUoZmxvYXQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbW9kdWxvKGZsb2F0IGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihmbG9hdCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhIDwgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4oZmxvYXQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihmbG9hdCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4oZmxvYXQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA+PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+PT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKGZsb2F0IGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhmbG9hdCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihmbG9hdCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBNYXRoLnBvdyhhLCBiKTsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPj09PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoZmxvYXQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoZmxvYXQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX3BsdXMoZmxvYXQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbWludXMoZmxvYXQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhIC0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tdWx0aXBseTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbXVsdGlwbHkoZmxvYXQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX2RpdmlkZShmbG9hdCBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbW9kdWxvKGZsb2F0IGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAlIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oZmxvYXQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhIDwgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihmbG9hdCBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgPD0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihmbG9hdCBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgPiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKGZsb2F0IGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSA+PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+PT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoZmxvYXQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bm90RXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4hPTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhmbG9hdCBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wb3dlcjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT5NYXRoLnBvdygpPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoZmxvYXQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBNYXRoLnBvdyhhLCBiKTsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPj09PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhmbG9hdCBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IG5vdCBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT4hPTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoZmxvYXQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cGx1czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX3BsdXMoZmxvYXQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbWludXMoZmxvYXQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgLSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm11bHRpcGx5PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbXVsdGlwbHkoZmxvYXQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgKiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmRpdmlkZTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX2RpdmlkZShmbG9hdCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbW9kdWxvKGZsb2F0IGEsIGludCBiKSB7CisJCXJldHVybiBhICUgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oZmxvYXQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihmbG9hdCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihmbG9hdCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSA+IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlckVxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKGZsb2F0IGEsIGludCBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoZmxvYXQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhmbG9hdCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPk1hdGgucG93KCk8L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoZmxvYXQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhmbG9hdCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoZmxvYXQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wbHVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX3BsdXMoZmxvYXQgYSwgY2hhciBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9taW51cyhmbG9hdCBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgLSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm11bHRpcGx5PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX211bHRpcGx5KGZsb2F0IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAqIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZGl2aWRlPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4vPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX2RpdmlkZShmbG9hdCBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9tb2R1bG8oZmxvYXQgYSwgY2hhciBiKSB7CisJCXJldHVybiBhICUgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKGZsb2F0IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihmbG9hdCBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgPD0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKGZsb2F0IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA+IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlckVxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihmbG9hdCBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoZmxvYXQgYSwgY2hhciBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bm90RXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4hPTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGZsb2F0IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPk1hdGgucG93KCk8L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKGZsb2F0IGEsIGNoYXIgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhmbG9hdCBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IG5vdCBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT4hPTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhmbG9hdCBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wbHVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YStiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfcGx1cyhmbG9hdCBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX21pbnVzKGZsb2F0IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgLSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm11bHRpcGx5PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbXVsdGlwbHkoZmxvYXQgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSAqIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZGl2aWRlPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4vPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS9iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAvICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfZGl2aWRlKGZsb2F0IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmElYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX21vZHVsbyhmbG9hdCBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhICUgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oZmxvYXQgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGZsb2F0IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPD0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlclRoYW4oZmxvYXQgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSA+IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlckVxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKGZsb2F0IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhmbG9hdCBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bm90RXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4hPTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEhPWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ub3RFcXVhbHMoZmxvYXQgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPk1hdGgucG93KCk8L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoZmxvYXQgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGZsb2F0IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IG5vdCBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT4hPTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSAhPSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlTm90RXF1YWxzKGZsb2F0IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wbHVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9wbHVzKGZsb2F0IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX21pbnVzKGZsb2F0IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX211bHRpcGx5KGZsb2F0IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSAqIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZGl2aWRlPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4vPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9kaXZpZGUoZmxvYXQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmElYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX21vZHVsbyhmbG9hdCBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKGZsb2F0IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4oZmxvYXQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlclRoYW4oZmxvYXQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihmbG9hdCBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKGZsb2F0IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGZsb2F0LgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEhPWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ub3RFcXVhbHMoZmxvYXQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKGZsb2F0IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBmbG9hdC4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoZmxvYXQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgZmxvYXQuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSAhPSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlTm90RXF1YWxzKGZsb2F0IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvLyBFTkQgZ2VuZXJhdGVkIGNvZGUKKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvRnVuY3Rpb25FeHRlbnNpb25zLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9GdW5jdGlvbkV4dGVuc2lvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTI3NGJkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvRnVuY3Rpb25FeHRlbnNpb25zLmphdmEKQEAgLTAsMCArMSwzMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjA7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjE7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjY7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXMuUHJvY2VkdXJlMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlcy5Qcm9jZWR1cmUxOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKKworLyoqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBsaWJyYXJ5IGZvciB7QGxpbmsgRnVuY3Rpb25zIGZ1bmN0aW9uc30sIGUuZy4gY2xvc3VyZXMuCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZSAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqIEBzZWUgRnVuY3Rpb25zCisgKi8KK0BHd3RDb21wYXRpYmxlIHB1YmxpYyBjbGFzcyBGdW5jdGlvbkV4dGVuc2lvbnMgeworCisJLyoqCisJICogQ3VycmllcyBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgb25lIGFyZ3VtZW50LgorCSAqIAorCSAqIEBwYXJhbSBmdW5jdGlvbgorCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBhcmd1bWVudAorCSAqICAgICAgICAgICAgdGhlIGZpeGVkIGFyZ3VtZW50LgorCSAqIEByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxQMSwgUkVTVUxUPiBGdW5jdGlvbjA8UkVTVUxUPiBjdXJyeShmaW5hbCBGdW5jdGlvbjE8PyBzdXBlciBQMSwgPyBleHRlbmRzIFJFU1VMVD4gZnVuY3Rpb24sIGZpbmFsIFAxIGFyZ3VtZW50KSB7CisJCWlmIChmdW5jdGlvbiA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmdW5jdGlvbiIpOworCQlyZXR1cm4gbmV3IEZ1bmN0aW9uMDxSRVNVTFQ+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgUkVTVUxUIGFwcGx5KCkgeworCQkJCXJldHVybiBmdW5jdGlvbi5hcHBseShhcmd1bWVudCk7CisJCQl9CisJCX07CisJfQorCisJLyoqCisJICogQ3VycmllcyBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdHdvIGFyZ3VtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gZnVuY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gYXJndW1lbnQKKwkgKiAgICAgICAgICAgIHRoZSBmaXhlZCBmaXJzdCBhcmd1bWVudCBvZiB7QGNvZGUgZnVuY3Rpb259LgorCSAqIEByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHRha2VzIG9uZSBhcmd1bWVudC4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxQMSwgUDIsIFJFU1VMVD4gRnVuY3Rpb24xPFAyLCBSRVNVTFQ+IGN1cnJ5KGZpbmFsIEZ1bmN0aW9uMjw/IHN1cGVyIFAxLCA/IHN1cGVyIFAyLCA/IGV4dGVuZHMgUkVTVUxUPiBmdW5jdGlvbiwKKwkJCWZpbmFsIFAxIGFyZ3VtZW50KSB7CisJCWlmIChmdW5jdGlvbiA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmdW5jdGlvbiIpOworCQlyZXR1cm4gbmV3IEZ1bmN0aW9uMTxQMiwgUkVTVUxUPigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFJFU1VMVCBhcHBseShQMiBwKSB7CisJCQkJcmV0dXJuIGZ1bmN0aW9uLmFwcGx5KGFyZ3VtZW50LCBwKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBDdXJyaWVzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aHJlZSBhcmd1bWVudHMuCisJICogCisJICogQHBhcmFtIGZ1bmN0aW9uCisJICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGFyZ3VtZW50CisJICogICAgICAgICAgICB0aGUgZml4ZWQgZmlyc3QgYXJndW1lbnQgb2Yge0Bjb2RlIGZ1bmN0aW9ufS4KKwkgKiBAcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0d28gYXJndW1lbnRzLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPFAxLCBQMiwgUDMsIFJFU1VMVD4gRnVuY3Rpb24yPFAyLCBQMywgUkVTVUxUPiBjdXJyeShmaW5hbCBGdW5jdGlvbjM8PyBzdXBlciBQMSwgPyBzdXBlciBQMiwgPyBzdXBlciBQMywgPyBleHRlbmRzIFJFU1VMVD4gZnVuY3Rpb24sCisJCQlmaW5hbCBQMSBhcmd1bWVudCkgeworCQlpZiAoZnVuY3Rpb24gPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZnVuY3Rpb24iKTsKKwkJcmV0dXJuIG5ldyBGdW5jdGlvbjI8UDIsIFAzLCBSRVNVTFQ+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgUkVTVUxUIGFwcGx5KFAyIHAyLCBQMyBwMykgeworCQkJCXJldHVybiBmdW5jdGlvbi5hcHBseShhcmd1bWVudCwgcDIsIHAzKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBDdXJyaWVzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBmb3VyIGFyZ3VtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gZnVuY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gYXJndW1lbnQKKwkgKiAgICAgICAgICAgIHRoZSBmaXhlZCBmaXJzdCBhcmd1bWVudCBvZiB7QGNvZGUgZnVuY3Rpb259LgorCSAqIEByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHRha2VzIHRocmVlIGFyZ3VtZW50cy4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxQMSwgUDIsIFAzLCBQNCwgUkVTVUxUPiBGdW5jdGlvbjM8UDIsIFAzLCBQNCwgUkVTVUxUPiBjdXJyeSgKKwkJCWZpbmFsIEZ1bmN0aW9uNDw/IHN1cGVyIFAxLCA/IHN1cGVyIFAyLCA/IHN1cGVyIFAzLCA/IHN1cGVyIFA0LCA/IGV4dGVuZHMgUkVTVUxUPiBmdW5jdGlvbiwgZmluYWwgUDEgYXJndW1lbnQpIHsKKwkJaWYgKGZ1bmN0aW9uID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZ1bmN0aW9uIik7CisJCXJldHVybiBuZXcgRnVuY3Rpb24zPFAyLCBQMywgUDQsIFJFU1VMVD4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBSRVNVTFQgYXBwbHkoUDIgcDIsIFAzIHAzLCBQNCBwNCkgeworCQkJCXJldHVybiBmdW5jdGlvbi5hcHBseShhcmd1bWVudCwgcDIsIHAzLCBwNCk7CisJCQl9CisJCX07CisJfQorCisJLyoqCisJICogQ3VycmllcyBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgZml2ZSBhcmd1bWVudHMuCisJICogCisJICogQHBhcmFtIGZ1bmN0aW9uCisJICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGFyZ3VtZW50CisJICogICAgICAgICAgICB0aGUgZml4ZWQgZmlyc3QgYXJndW1lbnQgb2Yge0Bjb2RlIGZ1bmN0aW9ufS4KKwkgKiBAcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBmb3VyIGFyZ3VtZW50cy4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxQMSwgUDIsIFAzLCBQNCwgUDUsIFJFU1VMVD4gRnVuY3Rpb240PFAyLCBQMywgUDQsIFA1LCBSRVNVTFQ+IGN1cnJ5KAorCQkJZmluYWwgRnVuY3Rpb241PD8gc3VwZXIgUDEsID8gc3VwZXIgUDIsID8gc3VwZXIgUDMsID8gc3VwZXIgUDQsID8gc3VwZXIgUDUsID8gZXh0ZW5kcyBSRVNVTFQ+IGZ1bmN0aW9uLCBmaW5hbCBQMSBhcmd1bWVudCkgeworCQlpZiAoZnVuY3Rpb24gPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZnVuY3Rpb24iKTsKKwkJcmV0dXJuIG5ldyBGdW5jdGlvbjQ8UDIsIFAzLCBQNCwgUDUsIFJFU1VMVD4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBSRVNVTFQgYXBwbHkoUDIgcDIsIFAzIHAzLCBQNCBwNCwgUDUgcDUpIHsKKwkJCQlyZXR1cm4gZnVuY3Rpb24uYXBwbHkoYXJndW1lbnQsIHAyLCBwMywgcDQsIHA1KTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBDdXJyaWVzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBzaXggYXJndW1lbnRzLgorCSAqIAorCSAqIEBwYXJhbSBmdW5jdGlvbgorCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBhcmd1bWVudAorCSAqICAgICAgICAgICAgdGhlIGZpeGVkIGZpcnN0IGFyZ3VtZW50IG9mIHtAY29kZSBmdW5jdGlvbn0uCisJICogQHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgZml2ZSBhcmd1bWVudHMuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8UDEsIFAyLCBQMywgUDQsIFA1LCBQNiwgUkVTVUxUPiBGdW5jdGlvbjU8UDIsIFAzLCBQNCwgUDUsIFA2LCBSRVNVTFQ+IGN1cnJ5KAorCQkJZmluYWwgRnVuY3Rpb242PD8gc3VwZXIgUDEsID8gc3VwZXIgUDIsID8gc3VwZXIgUDMsID8gc3VwZXIgUDQsID8gc3VwZXIgUDUsID8gc3VwZXIgUDYsID8gZXh0ZW5kcyBSRVNVTFQ+IGZ1bmN0aW9uLCBmaW5hbCBQMSBhcmd1bWVudCkgeworCQlpZiAoZnVuY3Rpb24gPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZnVuY3Rpb24iKTsKKwkJcmV0dXJuIG5ldyBGdW5jdGlvbjU8UDIsIFAzLCBQNCwgUDUsIFA2LCBSRVNVTFQ+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgUkVTVUxUIGFwcGx5KFAyIHAyLCBQMyBwMywgUDQgcDQsIFA1IHA1LCBQNiBwNikgeworCQkJCXJldHVybiBmdW5jdGlvbi5hcHBseShhcmd1bWVudCwgcDIsIHAzLCBwNCwgcDUsIHA2KTsKKwkJCX0KKwkJfTsKKwl9CisJCisJCisJLyoqCisJICogUmV0dXJucyBhIGNvbXBvc2VkIGZ1bmN0aW9uIHRoYXQgZmlyc3QgYXBwbGllcyB0aGUge0Bjb2RlIGJlZm9yZX0KKwkgKiBmdW5jdGlvbiB0byBpdHMgaW5wdXQsIGFuZCB0aGVuIGFwcGxpZXMgdGhlIHtAY29kZSBhZnRlcn0gZnVuY3Rpb24gdG8gdGhlIHJlc3VsdC4KKwkgKiBJZiBldmFsdWF0aW9uIG9mIGVpdGhlciBmdW5jdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uLCBpdCBpcyByZWxheWVkIHRvCisJICogdGhlIGNhbGxlciBvZiB0aGUgY29tcG9zZWQgZnVuY3Rpb24uCisJICoKKwkgKiBAcGFyYW0gPFY+IHRoZSB0eXBlIG9mIGlucHV0IHRvIHRoZSB7QGNvZGUgYmVmb3JlfSBmdW5jdGlvbiwgYW5kIHRvIHRoZQorCSAqICAgICAgICBjb21wb3NlZCBmdW5jdGlvbgorCSAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2Ygb3V0cHV0IG9mIHRoZSB7QGNvZGUgYmVmb3JlfSBmdW5jdGlvbiwgYW5kIGlucHV0IHRvIHRoZQorCSAqICAgICAgICB7QGNvZGUgYWZ0ZXJ9IGZ1bmN0aW9uCisJICogQHBhcmFtIDxSPiB0aGUgdHlwZSBvZiBvdXRwdXQgdG8gdGhlIHtAY29kZSBhZnRlcn0gZnVuY3Rpb24sIGFuZCB0byB0aGUKKwkgKiAgICAgICAgY29tcG9zZWQgZnVuY3Rpb24KKwkgKiBAcGFyYW0gYWZ0ZXIgdGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGFmdGVyIHRoZSBiZWZvcmUgZnVuY3Rpb24gaXMgYXBwbGllZAorCSAqIEBwYXJhbSBiZWZvcmUgdGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGJlZm9yZSB0aGUgYWZ0ZXIgZnVuY3Rpb24gaXMgYXBwbGllZAorCSAqIEByZXR1cm4gYSBjb21wb3NlZCBmdW5jdGlvbiB0aGF0IGZpcnN0IGFwcGxpZXMgdGhlIHtAY29kZSBiZWZvcmV9CisJICogZnVuY3Rpb24gYW5kIHRoZW4gYXBwbGllcyB0aGUge0Bjb2RlIGFmdGVyfSBmdW5jdGlvbgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYge0Bjb2RlIGJlZm9yZX0gb3Ige0Bjb2RlIGFmdGVyfSBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqCisJICogQHNlZSAjYW5kVGhlbihGdW5jdGlvbnMuRnVuY3Rpb24xLCBGdW5jdGlvbnMuRnVuY3Rpb24xKQorCSAqIEBzaW5jZSAyLjkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxWLFQsUj4gRnVuY3Rpb24xPFYsIFI+IGNvbXBvc2UoZmluYWwgRnVuY3Rpb24xPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+IGFmdGVyLCBmaW5hbCBGdW5jdGlvbjE8PyBzdXBlciBWLCA/IGV4dGVuZHMgVD4gYmVmb3JlKSB7CisJCWlmIChhZnRlciA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJhZnRlciIpOworCQlpZiAoYmVmb3JlID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImJlZm9yZSIpOworCQlyZXR1cm4gbmV3IEZ1bmN0aW9uMTxWLFI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgUiBhcHBseShWIHYpIHsKKwkJCQlyZXR1cm4gYWZ0ZXIuYXBwbHkoYmVmb3JlLmFwcGx5KHYpKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyBhIGNvbXBvc2VkIGZ1bmN0aW9uIHRoYXQgZmlyc3QgYXBwbGllcyB0aGUge0Bjb2RlIGJlZm9yZX0KKwkgKiBmdW5jdGlvbiB0byBpdHMgaW5wdXQsIGFuZCB0aGVuIGFwcGxpZXMgdGhlIHtAY29kZSBhZnRlcn0gZnVuY3Rpb24gdG8gdGhlIHJlc3VsdC4KKwkgKiBJZiBldmFsdWF0aW9uIG9mIGVpdGhlciBmdW5jdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uLCBpdCBpcyByZWxheWVkIHRvCisJICogdGhlIGNhbGxlciBvZiB0aGUgY29tcG9zZWQgZnVuY3Rpb24uCisJICoKKwkgKiBAcGFyYW0gPFY+IHRoZSB0eXBlIG9mIGlucHV0IHRvIHRoZSB7QGNvZGUgYmVmb3JlfSBmdW5jdGlvbiwgYW5kIHRvIHRoZSBjb21wb3NlZCBmdW5jdGlvbgorCSAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2Ygb3V0cHV0IG9mIHRoZSB7QGNvZGUgYmVmb3JlfSBmdW5jdGlvbiwgYW5kIGlucHV0IHRvIHRoZSB7QGNvZGUgYWZ0ZXJ9IGZ1bmN0aW9uCisJICogQHBhcmFtIDxSPiB0aGUgdHlwZSBvZiBvdXRwdXQgdG8gdGhlIHtAY29kZSBhZnRlcn0gZnVuY3Rpb24sIGFuZCB0byB0aGUgY29tcG9zZWQgZnVuY3Rpb24KKwkgKiBAcGFyYW0gYmVmb3JlIHRoZSBmdW5jdGlvbiB0byBhcHBseSBiZWZvcmUgdGhlIGFmdGVyIGZ1bmN0aW9uIGlzIGFwcGxpZWQKKwkgKiBAcGFyYW0gYWZ0ZXIgdGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGFmdGVyIHRoZSBiZWZvcmUgZnVuY3Rpb24gaXMgYXBwbGllZAorCSAqIEByZXR1cm4gYSBjb21wb3NlZCBmdW5jdGlvbiB0aGF0IGZpcnN0IGFwcGxpZXMgdGhlIHtAY29kZSBiZWZvcmV9CisJICogZnVuY3Rpb24gYW5kIHRoZW4gYXBwbGllcyB0aGUge0Bjb2RlIGFmdGVyfSBmdW5jdGlvbgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYge0Bjb2RlIGJlZm9yZX0gb3Ige0Bjb2RlIGFmdGVyfSBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqCisJICogQHNlZSAjY29tcG9zZShGdW5jdGlvbnMuRnVuY3Rpb24xLCBGdW5jdGlvbnMuRnVuY3Rpb24xKQorCSAqIEBzaW5jZSAyLjkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxWLFQsUj4gRnVuY3Rpb24xPFYsIFI+IGFuZFRoZW4oZmluYWwgRnVuY3Rpb24xPD8gc3VwZXIgViwgPyBleHRlbmRzIFQ+IGJlZm9yZSwgZmluYWwgRnVuY3Rpb24xPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+IGFmdGVyKSB7CisJCXJldHVybiBjb21wb3NlKGFmdGVyLCBiZWZvcmUpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIGEgY29tcG9zZWQgZnVuY3Rpb24gdGhhdCBmaXJzdCBhcHBsaWVzIHRoZSB7QGNvZGUgYmVmb3JlfQorCSAqIGZ1bmN0aW9uIHRvIGl0cyBpbnB1dCwgYW5kIHRoZW4gYXBwbGllcyB0aGUge0Bjb2RlIGFmdGVyfSBmdW5jdGlvbiB0byB0aGUgcmVzdWx0LgorCSAqIElmIGV2YWx1YXRpb24gb2YgZWl0aGVyIGZ1bmN0aW9uIHRocm93cyBhbiBleGNlcHRpb24sIGl0IGlzIHJlbGF5ZWQgdG8KKwkgKiB0aGUgY2FsbGVyIG9mIHRoZSBjb21wb3NlZCBmdW5jdGlvbi4KKwkgKgorCSAqIEBwYXJhbSA8VjE+IHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gdGhlIHtAY29kZSBiZWZvcmV9IGZ1bmN0aW9uLCBhbmQgdG8gdGhlIGNvbXBvc2VkIGZ1bmN0aW9uCisJICogQHBhcmFtIDxWMj4gdGhlIHR5cGUgb2YgdGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gdGhlIHtAY29kZSBiZWZvcmV9IGZ1bmN0aW9uLCBhbmQgdG8gdGhlIGNvbXBvc2VkIGZ1bmN0aW9uCisJICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiBvdXRwdXQgb2YgdGhlIHtAY29kZSBiZWZvcmV9IGZ1bmN0aW9uLCBhbmQgaW5wdXQgdG8gdGhlIHtAY29kZSBhZnRlcn0gZnVuY3Rpb24KKwkgKiBAcGFyYW0gPFI+IHRoZSB0eXBlIG9mIG91dHB1dCB0byB0aGUge0Bjb2RlIGFmdGVyfSBmdW5jdGlvbiwgYW5kIHRvIHRoZSBjb21wb3NlZCBmdW5jdGlvbgorCSAqIEBwYXJhbSBiZWZvcmUgdGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGJlZm9yZSB0aGUge0Bjb2RlIGFmdGVyfSBmdW5jdGlvbiBpcyBhcHBsaWVkCisJICogQHBhcmFtIGFmdGVyIHRoZSBmdW5jdGlvbiB0byBhcHBseSBhZnRlciB0aGUge0Bjb2RlIGJlZm9yZX0gZnVuY3Rpb24gaXMgYXBwbGllZAorCSAqIEByZXR1cm4gYSBjb21wb3NlZCBmdW5jdGlvbiB0aGF0IGZpcnN0IGFwcGxpZXMgdGhlIHtAY29kZSBiZWZvcmV9CisJICogZnVuY3Rpb24gYW5kIHRoZW4gYXBwbGllcyB0aGUge0Bjb2RlIGFmdGVyfSBmdW5jdGlvbgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYge0Bjb2RlIGJlZm9yZX0gb3Ige0Bjb2RlIGFmdGVyfSBpcyBudWxsCisJICoKKwkgKiBAc2VlICNjb21wb3NlKEZ1bmN0aW9ucy5GdW5jdGlvbjEsIEZ1bmN0aW9ucy5GdW5jdGlvbjEpCisJICogQHNpbmNlIDIuOQorCSAqLworCXB1YmxpYyBzdGF0aWMgPFYxLFYyLFQsUj4gRnVuY3Rpb24yPFYxLCBWMiwgUj4gYW5kVGhlbihmaW5hbCBGdW5jdGlvbjI8PyBzdXBlciBWMSw/IHN1cGVyIFYyLCA/IGV4dGVuZHMgVD4gYmVmb3JlLCBmaW5hbCBGdW5jdGlvbjE8PyBzdXBlciBULCA/IGV4dGVuZHMgUj4gYWZ0ZXIpIHsKKwkJaWYgKGFmdGVyID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImFmdGVyIik7CisJCWlmIChiZWZvcmUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYmVmb3JlIik7CisJCXJldHVybiBuZXcgRnVuY3Rpb24yPFYxLCBWMiwgUj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBSIGFwcGx5KFYxIHYxLCBWMiB2MikgeworCQkJCXJldHVybiBhZnRlci5hcHBseShiZWZvcmUuYXBwbHkodjEsIHYyKSk7CisJCQl9CisJCX07CisJfQorCQorCQorCS8qKgorCSAqIFJldHVybnMgYSBjb21wb3NlZCB7QGNvZGUgUHJvY2VkdXJlMX0gdGhhdCBwZXJmb3JtcywgaW4gc2VxdWVuY2UsIHRoZSB7QGNvZGUgYmVmb3JlfQorCSAqIG9wZXJhdGlvbiBmb2xsb3dlZCBieSB0aGUge0Bjb2RlIGFmdGVyfSBvcGVyYXRpb24uIElmIHBlcmZvcm1pbmcgZWl0aGVyCisJICogb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24sIGl0IGlzIHJlbGF5ZWQgdG8gdGhlIGNhbGxlciBvZiB0aGUKKwkgKiBjb21wb3NlZCBvcGVyYXRpb24uIElmIHBlcmZvcm1pbmcgdGhlIHtAY29kZSBiZWZvcmV9IG9wZXJhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uLAorCSAqIHRoZSB7QGNvZGUgYWZ0ZXJ9IG9wZXJhdGlvbiB3aWxsIG5vdCBiZSBwZXJmb3JtZWQuCisJICoKKwkgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIGlucHV0IGZvciB0aGUge0Bjb2RlIGJlZm9yZX0gb3BlcmF0aW9uCisJICogQHBhcmFtIGJlZm9yZSB0aGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gZmlyc3QKKwkgKiBAcGFyYW0gYWZ0ZXIgdGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGFmdGVyd2FyZHMKKwkgKiBAcmV0dXJuIGEgY29tcG9zZWQge0Bjb2RlIFByb2NlZHVyZTF9IHRoYXQgcGVyZm9ybXMgaW4gc2VxdWVuY2UgdGhlIHtAY29kZSBiZWZvcmV9CisJICogb3BlcmF0aW9uIGZvbGxvd2VkIGJ5IHRoZSB7QGNvZGUgYWZ0ZXJ9IG9wZXJhdGlvbgorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYge0Bjb2RlIGJlZm9yZX0gb3Ige0Bjb2RlIGFmdGVyfSBpcyBudWxsCisJICogQHNpbmNlIDIuOQorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IFByb2NlZHVyZTE8VD4gYW5kVGhlbihmaW5hbCBQcm9jZWR1cmUxPD8gc3VwZXIgVD4gYmVmb3JlLCBmaW5hbCBQcm9jZWR1cmUxPD8gc3VwZXIgVD4gYWZ0ZXIpIHsKKwkJaWYgKGFmdGVyID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImFmdGVyIik7CisJCWlmIChiZWZvcmUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYmVmb3JlIik7CisJCXJldHVybiBuZXcgUHJvY2VkdXJlcy5Qcm9jZWR1cmUxPFQ+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBseShUIHApIHsKKwkJCQliZWZvcmUuYXBwbHkocCk7CisJCQkJYWZ0ZXIuYXBwbHkocCk7CisJCQl9CisJCX07CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgYSBjb21wb3NlZCB7QGNvZGUgUHJvY2VkdXJlMX0gdGhhdCBwZXJmb3JtcywgaW4gc2VxdWVuY2UsIHRoZSB7QGNvZGUgYmVmb3JlfQorCSAqIG9wZXJhdGlvbiBmb2xsb3dlZCBieSB0aGUge0Bjb2RlIGFmdGVyfSBvcGVyYXRpb24uIElmIHBlcmZvcm1pbmcgZWl0aGVyCisJICogb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24sIGl0IGlzIHJlbGF5ZWQgdG8gdGhlIGNhbGxlciBvZiB0aGUKKwkgKiBjb21wb3NlZCBvcGVyYXRpb24uIElmIHBlcmZvcm1pbmcgdGhlIHtAY29kZSBiZWZvcmV9IG9wZXJhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uLAorCSAqIHRoZSB7QGNvZGUgYWZ0ZXJ9IG9wZXJhdGlvbiB3aWxsIG5vdCBiZSBwZXJmb3JtZWQuCisJICoKKwkgKiBAcGFyYW0gYmVmb3JlIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBmaXJzdAorCSAqIEBwYXJhbSBhZnRlciB0aGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gYWZ0ZXJ3YXJkcworCSAqIEByZXR1cm4gYSBjb21wb3NlZCB7QGNvZGUgUHJvY2VkdXJlMX0gdGhhdCBwZXJmb3JtcyBpbiBzZXF1ZW5jZSB0aGUge0Bjb2RlIGJlZm9yZX0KKwkgKiBvcGVyYXRpb24gZm9sbG93ZWQgYnkgdGhlIHtAY29kZSBhZnRlcn0gb3BlcmF0aW9uCisJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB7QGNvZGUgYmVmb3JlfSBvciB7QGNvZGUgYWZ0ZXJ9IGlzIG51bGwKKwkgKiBAc2luY2UgMi45CisJICovCisJcHVibGljIHN0YXRpYyBQcm9jZWR1cmUwIGFuZFRoZW4oZmluYWwgUHJvY2VkdXJlMCBiZWZvcmUsIGZpbmFsIFByb2NlZHVyZTAgYWZ0ZXIpIHsKKwkJaWYgKGFmdGVyID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImFmdGVyIik7CisJCWlmIChiZWZvcmUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYmVmb3JlIik7CisJCXJldHVybiBuZXcgUHJvY2VkdXJlcy5Qcm9jZWR1cmUwKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBseSgpIHsKKwkJCQliZWZvcmUuYXBwbHkoKTsKKwkJCQlhZnRlci5hcHBseSgpOworCQkJfQorCQl9OworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0Z1bmN0aW9ucy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvRnVuY3Rpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhZTE1MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0Z1bmN0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBzZXJ2ZXMgYXMgYSBjb250YWluZXIgZm9yIHRoZSB2YXJpb3VzIGZ1bmN0aW9uIHR5cGVzIHRoYXQgYXJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSB0eXBlIG9mIGNsb3N1cmVzIGluCisgKiBYYmFzZS4KKyAqIAorICogQGF1dGhvciBTZWJhc3RpYW4gWmFybmVrb3cgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKiBAc2VlIEZ1bmN0aW9uRXh0ZW5zaW9ucworICogQHNlZSBQcm9jZWR1cmVzCisgKi8KK0BHd3RDb21wYXRpYmxlIHB1YmxpYyBpbnRlcmZhY2UgRnVuY3Rpb25zIHsKKworCS8qKgorCSAqIEEgZnVuY3Rpb24gd2l0aG91dCBhbnkgcGFyYW1ldGVycy4KKwkgKiAKKwkgKiBAcGFyYW0gPFJlc3VsdD4KKwkgKiAgICAgICAgICAgIHRoZSByZXN1bHQgb2YgdGhlIHNpbmdsZSBjbG9zdXJlIHtAbGluayAjYXBwbHkoKSBtZXRob2R9LgorCSAqLworCWludGVyZmFjZSBGdW5jdGlvbjA8UmVzdWx0PiB7CisKKwkJUmVzdWx0IGFwcGx5KCk7CisKKwl9CisKKwkvKioKKwkgKiBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgb25lIGFyZ3VtZW50LgorCSAqIAorCSAqIEBwYXJhbSA8UGFyYW0+CisJICogICAgICAgICAgICB0aGUgb25seSBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0byB0aGUge0BsaW5rICNhcHBseShPYmplY3QpIGNsb3N1cmV9CisJICogQHBhcmFtIDxSZXN1bHQ+CisJICogICAgICAgICAgICB0aGUgcmVzdWx0IG9mIHRoZSBzaW5nbGUgY2xvc3VyZSB7QGxpbmsgI2FwcGx5KE9iamVjdCkgbWV0aG9kfS4KKwkgKi8KKwlpbnRlcmZhY2UgRnVuY3Rpb24xPFBhcmFtLCBSZXN1bHQ+IHsKKworCQlSZXN1bHQgYXBwbHkoUGFyYW0gcCk7CisKKwl9CisKKwkvKioKKwkgKiBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdHdvIGFyZ3VtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gPFAxPgorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB7QGxpbmsgI2FwcGx5KE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UDI+CisJICogICAgICAgICAgICB0aGUgc2Vjb25kIGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB7QGxpbmsgI2FwcGx5KE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UmVzdWx0PgorCSAqICAgICAgICAgICAgdGhlIHJlc3VsdCBvZiB0aGUgc2luZ2xlIGNsb3N1cmUge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCkgbWV0aG9kfS4KKwkgKi8KKwlpbnRlcmZhY2UgRnVuY3Rpb24yPFAxLCBQMiwgUmVzdWx0PiB7CisKKwkJUmVzdWx0IGFwcGx5KFAxIHAxLCBQMiBwMik7CisKKwl9CisKKwkvKioKKwkgKiBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhyZWUgYXJndW1lbnRzLgorCSAqIAorCSAqIEBwYXJhbSA8UDE+CisJICogICAgICAgICAgICB0aGUgZmlyc3QgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHtAbGluayAjYXBwbHkoT2JqZWN0LCBPYmplY3QsIE9iamVjdCkgY2xvc3VyZX0KKwkgKiBAcGFyYW0gPFAyPgorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0byB0aGUge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UDM+CisJICogICAgICAgICAgICB0aGUgdGhpcmQgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHtAbGluayAjYXBwbHkoT2JqZWN0LCBPYmplY3QsIE9iamVjdCkgY2xvc3VyZX0KKwkgKiBAcGFyYW0gPFJlc3VsdD4KKwkgKiAgICAgICAgICAgIHRoZSByZXN1bHQgb2YgdGhlIHNpbmdsZSBjbG9zdXJlIHtAbGluayAjYXBwbHkoT2JqZWN0LCBPYmplY3QsIE9iamVjdCkgbWV0aG9kfS4KKwkgKi8KKwlpbnRlcmZhY2UgRnVuY3Rpb24zPFAxLCBQMiwgUDMsIFJlc3VsdD4geworCisJCVJlc3VsdCBhcHBseShQMSBwMSwgUDIgcDIsIFAzIHAzKTsKKworCX0KKworCS8qKgorCSAqIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBmb3VyIGFyZ3VtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gPFAxPgorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB7QGxpbmsgI2FwcGx5KE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCkgY2xvc3VyZX0KKwkgKiBAcGFyYW0gPFAyPgorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0byB0aGUge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QpIGNsb3N1cmV9CisJICogQHBhcmFtIDxQMz4KKwkgKiAgICAgICAgICAgIHRoZSB0aGlyZCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0byB0aGUge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QpIGNsb3N1cmV9CisJICogQHBhcmFtIDxQND4KKwkgKiAgICAgICAgICAgIHRoZSBmb3VydGggYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHtAbGluayAjYXBwbHkoT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UmVzdWx0PgorCSAqICAgICAgICAgICAgdGhlIHJlc3VsdCBvZiB0aGUgc2luZ2xlIGNsb3N1cmUge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QpIG1ldGhvZH0uCisJICovCisJaW50ZXJmYWNlIEZ1bmN0aW9uNDxQMSwgUDIsIFAzLCBQNCwgUmVzdWx0PiB7CisKKwkJUmVzdWx0IGFwcGx5KFAxIHAxLCBQMiBwMiwgUDMgcDMsIFA0IHA0KTsKKworCX0KKworCS8qKgorCSAqIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBmaXZlIGFyZ3VtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gPFAxPgorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB7QGxpbmsgI2FwcGx5KE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KQorCSAqICAgICAgICAgICAgY2xvc3VyZX0KKwkgKiBAcGFyYW0gPFAyPgorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0byB0aGUge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCkKKwkgKiAgICAgICAgICAgIGNsb3N1cmV9CisJICogQHBhcmFtIDxQMz4KKwkgKiAgICAgICAgICAgIHRoZSB0aGlyZCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0byB0aGUge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCkKKwkgKiAgICAgICAgICAgIGNsb3N1cmV9CisJICogQHBhcmFtIDxQND4KKwkgKiAgICAgICAgICAgIHRoZSBmb3VydGggYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHtAbGluayAjYXBwbHkoT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QpCisJICogICAgICAgICAgICBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UDU+CisJICogICAgICAgICAgICB0aGUgZmlmdGggYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHtAbGluayAjYXBwbHkoT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QpCisJICogICAgICAgICAgICBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UmVzdWx0PgorCSAqICAgICAgICAgICAgdGhlIHJlc3VsdCBvZiB0aGUgc2luZ2xlIGNsb3N1cmUge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCkgbWV0aG9kfS4KKwkgKi8KKwlpbnRlcmZhY2UgRnVuY3Rpb241PFAxLCBQMiwgUDMsIFA0LCBQNSwgUmVzdWx0PiB7CisKKwkJUmVzdWx0IGFwcGx5KFAxIHAxLCBQMiBwMiwgUDMgcDMsIFA0IHA0LCBQNSBwNSk7CisKKwl9CisKKwkvKioKKwkgKiBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgc2l4IGFyZ3VtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gPFAxPgorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIHRoZQorCSAqICAgICAgICAgICAge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UDI+CisJICogICAgICAgICAgICB0aGUgc2Vjb25kIGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIHRoZQorCSAqICAgICAgICAgICAge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UDM+CisJICogICAgICAgICAgICB0aGUgdGhpcmQgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlCisJICogICAgICAgICAgICB7QGxpbmsgI2FwcGx5KE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QpIGNsb3N1cmV9CisJICogQHBhcmFtIDxQND4KKwkgKiAgICAgICAgICAgIHRoZSBmb3VydGggYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlCisJICogICAgICAgICAgICB7QGxpbmsgI2FwcGx5KE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QpIGNsb3N1cmV9CisJICogQHBhcmFtIDxQNT4KKwkgKiAgICAgICAgICAgIHRoZSBmaWZ0aCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0byB0aGUKKwkgKiAgICAgICAgICAgIHtAbGluayAjYXBwbHkoT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCkgY2xvc3VyZX0KKwkgKiBAcGFyYW0gPFA2PgorCSAqICAgICAgICAgICAgdGhlIHNpeHRoIGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIHRoZQorCSAqICAgICAgICAgICAge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UmVzdWx0PgorCSAqICAgICAgICAgICAgdGhlIHJlc3VsdCBvZiB0aGUgc2luZ2xlIGNsb3N1cmUge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KSBtZXRob2R9CisJICogICAgICAgICAgICAuCisJICovCisJaW50ZXJmYWNlIEZ1bmN0aW9uNjxQMSwgUDIsIFAzLCBQNCwgUDUsIFA2LCBSZXN1bHQ+IHsKKworCQlSZXN1bHQgYXBwbHkoUDEgcDEsIFAyIHAyLCBQMyBwMywgUDQgcDQsIFA1IHA1LCBQNiBwNik7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0hhcmRjb2RlZEluSW50ZXJwcmV0ZXJFeGNlcHRpb24uamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0hhcmRjb2RlZEluSW50ZXJwcmV0ZXJFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWIyMzY3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvSGFyZGNvZGVkSW5JbnRlcnByZXRlckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKKworLyoqCisgKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgYSBtZXRob2Qgd2FzIGludm9rZWQgZGlyZWN0bHkgdGhvdWdoIGl0IGlzIHVzdWFsbHkgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYnkgbWVhbnMgb2YKKyAqIHRoZSB7QGxpbmsgSW5saW5lIEBJbmxpbmUgYW5ub3RhdGlvbn0gYW5kIGV4ZWN1dGVkIGluIGEgY3VzdG9tIG1hbm5lciBieSB0aGUgaW50ZXJwcmV0ZXIuCisgKiAKKyAqIEBhdXRob3IgU2ViYXN0aWFuIFphcm5la293IC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICogQHNpbmNlIDIuNgorICovCitAR3d0Q29tcGF0aWJsZQorY2xhc3MgSGFyZGNvZGVkSW5JbnRlcnByZXRlckV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0lubGluZS5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvSW5saW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlZTBlYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0lubGluZS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CisKKy8qKgorICogQWxsb3dzIHRvIGRlc2NyaWJlIGhvdyBhIGNlcnRhaW4gc3RhdGljIGZ1bmN0aW9uIHNob3VsZCBiZSBpbmxpbmVkIGJ5IHRoZSBYYmFzZSBjb21waWxlci4KKyAqIAorICogQGF1dGhvciBTZWJhc3RpYW4gWmFybmVrb3cgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKiBAc2luY2UgMi4zCisgKi8KK0BCZXRhCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldCh2YWx1ZSA9IHsgRWxlbWVudFR5cGUuTUVUSE9EIH0pCitAR3d0Q29tcGF0aWJsZQorcHVibGljIEBpbnRlcmZhY2UgSW5saW5lIHsKKworCS8qKgorCSAqIDxwPgorCSAqIFRoZSBpbmxpbmUgZm9ybWF0IHN0cmluZy4gUGxhY2Vob2xkZXJzIGxpa2Uge0Bjb2RlICQxLCAkMn0gZXRjIGNhbiBiZSB1c2VkIHdoZXJlIHRoZSB7QGNvZGUgMS4ubn0gcGFyYW1ldGVycyBvZgorCSAqIHRoZSBpbmxpbmVkIG1ldGhvZCBhcmUgdXNlZCBmb3Ige0Bjb2RlICQxfSB0byB7QGNvZGUgJG59IGFuZCB0aGUge0BsaW5rICNpbXBvcnRlZCgpfSB0eXBlcyBhcmUgdXNlZCBmb3IKKwkgKiBzdWJzZXF1ZW50IGluZGljZXMuIFRoZSBuZXh0IGluZGV4IHtAY29kZSAkbn0gY2FuIGJlIHVzZWQgdG8gaW5zZXJ0IGFsbCB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIG9yaWdpbmFsCisJICogZGVjbGFyYXRpb24uIEFuZCBmaW5hbGx5IHRoZSBsYXN0IGluZGljZXMgcmVmZXIgdG8gdGhlIHVwcGVyIGJvdW5kIHN1YnN0aXR1dGUgb2YgdGhlIHR5cGUgcGFyYW1ldGVycworCSAqIGluZGl2aWR1YWxseS4KKwkgKiA8L3A+CisJICogPHA+CisJICogU28gdGhlIG9yZGVyIGlzIGFyZ3VtZW50cywgaW1wb3J0cywgYWxsIHR5cGUgcGFyYW1ldGVycyBhdCBvbmNlIGluY2wuIGJyYWNrZXRzIGFuZCB1cHBlciBib3VuZHMgb2YgdGhlIGluZGl2aWR1YWwKKwkgKiB0eXBlIHBhcmFtZXRlcnMgd2l0aG91dCBicmFja2V0cworCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBGb3IgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgPGJyLz4KKwkgKiB7QGNvZGUgQElubGluZSh2YWx1ZT0iLi4iIGltcG9ydGVkID0gQmlnRGVjaW1hbC5jbGFzcykgcHVibGljIHZvaWQgPFQxLCBUMj4gbXlNZXRob2QoU3RyaW5nIHAxLCBTdHJpbmcgcDIpfQorCSAqIDwvcD4KKwkgKiA8dWw+CisJICogPGxpPgorCSAqIHtAY29kZSAkMX0gcmVmZXJzIHRvIHtAY29kZSBwMX08L2xpPgorCSAqIDxsaT4KKwkgKiB7QGNvZGUgJDJ9IHJlZmVycyB0byB7QGNvZGUgcDJ9PC9saT4KKwkgKiA8bGk+CisJICoge0Bjb2RlICQzfSByZWZlcnMgdG8ge0Bjb2RlIEJpZ0RlY2ltYWx9PC9saT4KKwkgKiA8bGk+CisJICoge0Bjb2RlICQ0fSByZWZlcnMgdG8ge0Bjb2RlIDxUMSwgVDI+fTwvbGk+CisJICogPGxpPgorCSAqIHtAY29kZSAkNX0gcmVmZXJzIHRvIHRoZSB1cHBlciBib3VuZCBvZiB7QGNvZGUgVDF9PC9saT4KKwkgKiA8bGk+CisJICoge0Bjb2RlICQ2fSByZWZlcnMgdG8gdGhlIHVwcGVyIGJvdW5kIG9mIHtAY29kZSBUMn08L2xpPgorCSAqIDwvdWw+CisJICogCisJICovCisJU3RyaW5nIHZhbHVlKCk7CisKKwkvKioKKwkgKiBUeXBlcyB0aGF0IHNob3VsZCBiZSBpbXBvcnRlZCB0byBpbmxpbmUgdGhlIG9wZXJhdGlvbi4KKwkgKi8KKwlDbGFzczw/PltdIGltcG9ydGVkKCkgZGVmYXVsdCB7fTsKKworCS8qKgorCSAqIFdoZXRoZXIgdGhlIGlubGluZWQgZXhwcmVzc2lvbiBpcyBhIHN0YXRlbWVudCBleHByZXNzaW9uIChzZWUgPGEKKwkgKiBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2U1LjAvaHRtbC9zdGF0ZW1lbnRzLmh0bWwjMTQuOCI+MTQuOCAtIFN0YXRlbWVudCBFeHByZXNzaW9ucyBpbgorCSAqIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgVGhpcmQgRWRpdGlvbjwvYT4gKQorCSAqLworCWJvb2xlYW4gc3RhdGVtZW50RXhwcmVzc2lvbigpIGRlZmF1bHQgZmFsc2U7CisKKwkvKioKKwkgKiBXaGV0aGVyIHRoZSBjb21waWxlZCBKYXZhIGlzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBvcGVyYXRvci4gKHNlZSA8YQorCSAqIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlL3NwZWNzL2pscy9zZTcvaHRtbC9qbHMtMTUuaHRtbCNqbHMtMTUuMjgiPjE1LjI4LiBDb25zdGFudCBFeHByZXNzaW9ucyBpbiBKYXZhCisJICogTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgVGhpcmQgRWRpdGlvbjwvYT4KKwkgKiAKKwkgKiBAc2luY2UgMi41CisJICovCisJYm9vbGVhbiBjb25zdGFudEV4cHJlc3Npb24oKSBkZWZhdWx0IGZhbHNlOworCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9JbnB1dE91dHB1dC5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvSW5wdXRPdXRwdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTA1MWI4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvSW5wdXRPdXRwdXQuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CisKKy8qKgorICogVXRpbGl0aWVzIHRvIHByaW50IGluZm9ybWF0aW9uIHRvIHRoZSBjb25zb2xlLgorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKi8KK0BHd3RDb21wYXRpYmxlIHB1YmxpYyBjbGFzcyBJbnB1dE91dHB1dCB7CisKKwkvKioKKwkgKiBQcmludHMgYSBuZXdsaW5lIHRvIHN0YW5kYXJkIG91dCwgYnkgZGVsZWdhdGluZyBkaXJlY3RseSB0byA8Y29kZT5TeXN0ZW0ub3V0LnByaW50bG4oKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHByaW50bG4oKSB7CisJCVN5c3RlbS5vdXQucHJpbnRsbigpOworCX0KKwkvKioKKwkgKiBQcmludHMgdGhlIGdpdmVuIHtAY29kZSBvYmplY3R9IHRvIHtAbGluayBTeXN0ZW0jb3V0IFN5c3RlbS5vdXR9IGFuZCB0ZXJtaW5hdGUgdGhlIGxpbmUuIFVzZWZ1bCB0byBsb2cgcGFydGlhbAorCSAqIGV4cHJlc3Npb25zIHRvIHRyYXAgZXJyb3JzLCBlLmcuIHRoZSBmb2xsb3dpbmcgaXMgcG9zc2libGU6IDxjb2RlPnByaW50bG4oMSArIHByaW50bG4oMikpICsgMzwvY29kZT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogICAgICAgICAgICB0aGUgdG8tYmUtcHJpbnRlZCBvYmplY3QKKwkgKiBAcmV0dXJuIHRoZSBwcmludGVkIG9iamVjdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiBUIHByaW50bG4oVCBvYmplY3QpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKG9iamVjdCk7CisJCXJldHVybiBvYmplY3Q7CisJfQorCisJLyoqCisJICogUHJpbnRzIHRoZSBnaXZlbiB7QGNvZGUgb2JqZWN0fSB0byB7QGxpbmsgU3lzdGVtI291dCBTeXN0ZW0ub3V0fS4gVXNlZnVsIHRvIGxvZyBwYXJ0aWFsIGV4cHJlc3Npb25zIHRvIHRyYXAKKwkgKiBlcnJvcnMsIGUuZy4gdGhlIGZvbGxvd2luZyBpcyBwb3NzaWJsZTogPGNvZGU+MSArIHByaW50KDIpICsgMzwvY29kZT4KKwkgKiAKKwkgKiBAcGFyYW0gbworCSAqICAgICAgICAgICAgdGhlIHRvLWJlLXByaW50ZWQgb2JqZWN0CisJICogQHJldHVybiB0aGUgcHJpbnRlZCBvYmplY3QuCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gVCBwcmludChUIG8pIHsKKwkJU3lzdGVtLm91dC5wcmludChvKTsKKwkJcmV0dXJuIG87CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvSW50ZWdlckV4dGVuc2lvbnMuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0ludGVnZXJFeHRlbnNpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3M2Q4OAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0ludGVnZXJFeHRlbnNpb25zLmphdmEKQEAgLTAsMCArMSwxNjgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CisKKworCisvKioKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIGxpYnJhcnkgZm9yIHtAbGluayBJbnRlZ2VyIGludGVncmFsIG51bWJlcnN9LCBlLmcuIDxjb2RlPmludDwvY29kZT4gb3IgPGNvZGU+SW50ZWdlcjwvY29kZT4uCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZSAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqIEBhdXRob3IgSmFuIEtvZWhubGVpbiAtIFByaW1pdGl2ZSB2ZXJzaW9ucworICogQHNpbmNlIDIuMworICovCitAR3d0Q29tcGF0aWJsZSBwdWJsaWMgY2xhc3MgSW50ZWdlckV4dGVuc2lvbnMgeworCQorCS8qKgorCSAqIFRoZSA8Y29kZT4uLjwvY29kZT4gb3BlcmF0b3IgeWllbGRzIGFuIHtAbGluayBJbnRlZ2VyUmFuZ2V9LgorCSAqIAorCSAqIEBwYXJhbSBhIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuCisJICogQHBhcmFtIGIgdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisJICogQHJldHVybiBhbiB7QGxpbmsgSW50ZWdlclJhbmdlfS4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0ibmV3ICQzKCQxLCAkMikiLCBpbXBvcnRlZD1JbnRlZ2VyUmFuZ2UuY2xhc3MsIHN0YXRlbWVudEV4cHJlc3Npb249ZmFsc2UpCisJcHVibGljIHN0YXRpYyBJbnRlZ2VyUmFuZ2Ugb3BlcmF0b3JfdXBUbyhmaW5hbCBpbnQgYSwgZmluYWwgaW50IGIpIHsKKwkJcmV0dXJuIG5ldyBJbnRlZ2VyUmFuZ2UoYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT4uLiZsdDs8L2NvZGU+IG9wZXJhdG9yIHlpZWxkcyBhbiB7QGxpbmsgRXhjbHVzaXZlUmFuZ2V9IHRoYXQgaW5jcmVtZW50cyBmcm9tCisJICogYSB0byBiIChleGNsdXNpdmUpLgorCSAqIAorCSAqIEBwYXJhbSBhIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuCisJICogQHBhcmFtIGIgdGhlIGVuZCBvZiB0aGUgcmFuZ2UgKGV4Y2x1c2l2ZSkuCisJICogQHJldHVybiBhbiBpbmNyZW1lbnRpbmcge0BsaW5rIEV4Y2x1c2l2ZVJhbmdlfS4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0ibmV3ICQzKCQxLCAkMiwgdHJ1ZSkiLCBpbXBvcnRlZD1FeGNsdXNpdmVSYW5nZS5jbGFzcywgc3RhdGVtZW50RXhwcmVzc2lvbj1mYWxzZSkKKwlwdWJsaWMgc3RhdGljIEV4Y2x1c2l2ZVJhbmdlIG9wZXJhdG9yX2RvdWJsZURvdExlc3NUaGFuKGZpbmFsIGludCBhLCBmaW5hbCBpbnQgYikgeworCQlyZXR1cm4gbmV3IEV4Y2x1c2l2ZVJhbmdlKGEsIGIsIHRydWUpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+Jmd0Oy4uPC9jb2RlPiBvcGVyYXRvciB5aWVsZHMgYW4ge0BsaW5rIEV4Y2x1c2l2ZVJhbmdlfSB0aGF0IGRlY3JlbWVudHMgZnJvbSBhCisJICogKGV4Y2x1c2l2ZSkgZG93biB0byBiLgorCSAqIAorCSAqIEBwYXJhbSBhIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgKGV4Y2x1c2l2ZSkuCisJICogQHBhcmFtIGIgdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisJICogQHJldHVybiBhIGRlY3JlbWVudGluZyB7QGxpbmsgRXhjbHVzaXZlUmFuZ2V9LiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSJuZXcgJDMoJDEsICQyLCBmYWxzZSkiLCBpbXBvcnRlZD1FeGNsdXNpdmVSYW5nZS5jbGFzcywgc3RhdGVtZW50RXhwcmVzc2lvbj1mYWxzZSkKKwlwdWJsaWMgc3RhdGljIEV4Y2x1c2l2ZVJhbmdlIG9wZXJhdG9yX2dyZWF0ZXJUaGFuRG91YmxlRG90KGZpbmFsIGludCBhLCBmaW5hbCBpbnQgYikgeworCQlyZXR1cm4gbmV3IEV4Y2x1c2l2ZVJhbmdlKGEsIGIsIGZhbHNlKTsKKwl9CisJCisJLyoqCisJICogVGhlIGJpdHdpc2UgaW5jbHVzaXZlIDxjb2RlPm9yPC9jb2RlPiBvcGVyYXRpb24uIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIGphdmEgPGNvZGU+fDwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIKKwkgKiAgICAgICAgICAgIGFuIGludGVnZXIuCisJICogQHJldHVybiA8Y29kZT5hfGI8L2NvZGU+CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgfCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBiaXR3aXNlT3IoaW50IGEsIGludCBiKSB7CisJCXJldHVybiBhIHwgYjsKKwl9CisKKwkvKioKKwkgKiBUaGUgYml0d2lzZSBleGNsdXNpdmUgPGNvZGU+b3I8L2NvZGU+IG9wZXJhdGlvbi4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgamF2YSA8Y29kZT5ePC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuIDxjb2RlPmFeYjwvY29kZT4KKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSBeICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IGJpdHdpc2VYb3IoaW50IGEsIGludCBiKSB7CisJCXJldHVybiBhIF4gYjsKKwl9CisKKwkvKioKKwkgKiBUaGUgYml0d2lzZSA8Y29kZT5hbmQ8L2NvZGU+IG9wZXJhdGlvbi4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgamF2YSA8Y29kZT4mYW1wOzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIKKwkgKiAgICAgICAgICAgIGFuIGludGVnZXIuCisJICogQHJldHVybiA8Y29kZT5hJmFtcDtiPC9jb2RlPgorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICYgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgYml0d2lzZUFuZChpbnQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgJiBiOworCX0KKworCS8qKgorCSAqIFRoZSBiaXR3aXNlIGNvbXBsZW1lbnQgb3BlcmF0aW9uLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBqYXZhIDxjb2RlPn48L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gdGhlIGJpdHdpc2UgY29tcGxlbWVudCBvZiA8Y29kZT5hPC9jb2RlPi4KKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9Iih+JDEpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgYml0d2lzZU5vdChpbnQgYSkgeworCQlyZXR1cm4gfmE7CisJfQorCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5zaWduZWQgbGVmdCBzaGlmdDwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIGphdmEgPGNvZGU+Jmx0OyZsdDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIEZpbGxzIGluIGEgemVybyBhcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBkaXN0YW5jZSAKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gc2hpZnQuCisJICogQHJldHVybiA8Y29kZT5hJmx0OyZsdDtkaXN0YW5jZTwvY29kZT4KKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNvcGVyYXRvcl9kb3VibGVMZXNzVGhhbihpbnQsIGludCl9IGluc3RlYWQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlARGVwcmVjYXRlZAorCXB1YmxpYyBzdGF0aWMgaW50IHNoaWZ0TGVmdChpbnQgYSwgaW50IGRpc3RhbmNlKSB7CisJCXJldHVybiBhIDw8IGRpc3RhbmNlOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnNpZ25lZCBsZWZ0IHNoaWZ0PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgamF2YSA8Y29kZT4mbHQ7Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogRmlsbHMgaW4gYSB6ZXJvIGFzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGRpc3RhbmNlIAorCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiB0aW1lcyB0byBzaGlmdC4KKwkgKiBAcmV0dXJuIDxjb2RlPmEmbHQ7Jmx0O2Rpc3RhbmNlPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9kb3VibGVMZXNzVGhhbihpbnQgYSwgaW50IGRpc3RhbmNlKSB7CisJCXJldHVybiBhIDw8IGRpc3RhbmNlOworCX0KKworCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+c2lnbmVkIHJpZ2h0IHNpZnQ8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBqYXZhIDxjb2RlPiZndDsmZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiBTaGlmdHMgaW4gdGhlIHZhbHVlIG9mIHRoZSBzaWduIGJpdCBhcyB0aGUgbGVmdG1vc3QgYml0LCB0aHVzIHByZXNlcnZpbmcgdGhlIHNpZ24gb2YgdGhlIGluaXRpYWwgdmFsdWUuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGRpc3RhbmNlIAorCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiB0aW1lcyB0byBzaGlmdC4KKwkgKiBAcmV0dXJuIDxjb2RlPmEmZ3Q7Jmd0O2Rpc3RhbmNlPC9jb2RlPgorCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI29wZXJhdG9yX2RvdWJsZUdyZWF0ZXJUaGFuKGludCwgaW50KX0gaW5zdGVhZAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBpbnQgc2hpZnRSaWdodChpbnQgYSwgaW50IGRpc3RhbmNlKSB7CisJCXJldHVybiBhID4+IGRpc3RhbmNlOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnNpZ25lZCByaWdodCBzaWZ0PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgamF2YSA8Y29kZT4mZ3Q7Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogU2hpZnRzIGluIHRoZSB2YWx1ZSBvZiB0aGUgc2lnbiBiaXQgYXMgdGhlIGxlZnRtb3N0IGJpdCwgdGh1cyBwcmVzZXJ2aW5nIHRoZSBzaWduIG9mIHRoZSBpbml0aWFsIHZhbHVlLgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBkaXN0YW5jZSAKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gc2hpZnQuCisJICogQHJldHVybiA8Y29kZT5hJmd0OyZndDtkaXN0YW5jZTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfZG91YmxlR3JlYXRlclRoYW4oaW50IGEsIGludCBkaXN0YW5jZSkgeworCQlyZXR1cm4gYSA+PiBkaXN0YW5jZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnVuc2lnbmVkIHJpZ2h0IHNoaWZ0PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgamF2YSA8Y29kZT4mZ3Q7Jmd0OyZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIFNoaWZ0cyBpbiB6ZXJvcyBpbnRvIGFzIGxlZnRtb3N0IGJpdHMsIHRodXMgYWx3YXlzIHlpZWxkaW5nIGEgcG9zaXRpdmUgaW50ZWdlci4KKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gZGlzdGFuY2UKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gc2hpZnQuCisJICogQHJldHVybiA8Y29kZT5hJmd0OyZndDsmZ3Q7ZGlzdGFuY2U8L2NvZGU+CisJICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjb3BlcmF0b3JfdHJpcGxlR3JlYXRlclRoYW4oaW50LCBpbnQpfSBpbnN0ZWFkCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj4+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBpbnQgc2hpZnRSaWdodFVuc2lnbmVkKGludCBhLCBpbnQgZGlzdGFuY2UpIHsKKwkJcmV0dXJuIGEgPj4+IGRpc3RhbmNlOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnVuc2lnbmVkIHJpZ2h0IHNoaWZ0PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgamF2YSA8Y29kZT4mZ3Q7Jmd0OyZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIFNoaWZ0cyBpbiB6ZXJvcyBpbnRvIGFzIGxlZnRtb3N0IGJpdHMsIHRodXMgYWx3YXlzIHlpZWxkaW5nIGEgcG9zaXRpdmUgaW50ZWdlci4KKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gZGlzdGFuY2UKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gc2hpZnQuCisJICogQHJldHVybiA8Y29kZT5hJmd0OyZndDsmZ3Q7ZGlzdGFuY2U8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4+PiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl90cmlwbGVHcmVhdGVyVGhhbihpbnQgYSwgaW50IGRpc3RhbmNlKSB7CisJCXJldHVybiBhID4+PiBkaXN0YW5jZTsKKwl9CisKKwkvLyBCRUdJTiBnZW5lcmF0ZWQgY29kZQorCS8qKgorCSAqIFRoZSB1bmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT4tPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gaSAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+LWk8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKC0kMSkiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9taW51cyhpbnQgaSkgeworCQlyZXR1cm4gLWk7CisJfQorCQorCS8qKgorCSAqIFRoZSBwb3N0Zml4IDxjb2RlPmRlY3JlbWVudDwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT4tLTwvY29kZT4gcG9zdGZpeCBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gaSAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+aS0tPC9jb2RlPgorCSAqIEBzaW5jZSAyLjYKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMS0tIikKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9taW51c01pbnVzKGludCBpKSB7CisJCXRocm93IG5ldyBIYXJkY29kZWRJbkludGVycHJldGVyRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIFRoZSBwb3N0Zml4IDxjb2RlPmRlY3JlbWVudDwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT4tLTwvY29kZT4gcG9zdGZpeCBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gaSAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+aS0tPC9jb2RlPgorCSAqIEBzaW5jZSAyLjYKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMS0tIikKKwlwdWJsaWMgc3RhdGljIEludGVnZXIgb3BlcmF0b3JfbWludXNNaW51cyhJbnRlZ2VyIGkpIHsKKwkJdGhyb3cgbmV3IEhhcmRjb2RlZEluSW50ZXJwcmV0ZXJFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogVGhlIHBvc3RmaXggPGNvZGU+aW5jcmVtZW50PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPisrPC9jb2RlPiBwb3N0Zml4IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBpICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5pKys8L2NvZGU+CisJICogQHNpbmNlIDIuNgorCSAqLworCUBJbmxpbmUodmFsdWU9IiQxKysiKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX3BsdXNQbHVzKGludCBpKSB7CisJCXRocm93IG5ldyBIYXJkY29kZWRJbkludGVycHJldGVyRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIFRoZSBwb3N0Zml4IDxjb2RlPmluY3JlbWVudDwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT4rKzwvY29kZT4gcG9zdGZpeCBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gaSAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+aSsrPC9jb2RlPgorCSAqIEBzaW5jZSAyLjYKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMSsrIikKKwlwdWJsaWMgc3RhdGljIEludGVnZXIgb3BlcmF0b3JfcGx1c1BsdXMoSW50ZWdlciBpKSB7CisJCXRocm93IG5ldyBIYXJkY29kZWRJbkludGVycHJldGVyRXhjZXB0aW9uKCk7CisJfQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cGx1czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcGx1cyhpbnQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9taW51cyhpbnQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgLSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm11bHRpcGx5PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9tdWx0aXBseShpbnQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgKiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmRpdmlkZTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfZGl2aWRlKGludCBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmElYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9tb2R1bG8oaW50IGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhICUgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKGludCBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihpbnQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPD0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKGludCBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSA+IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlckVxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihpbnQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoaW50IGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bm90RXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4hPTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGludCBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPk1hdGgucG93KCk8L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKGludCBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhpbnQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IG5vdCBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT4hPTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhpbnQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wbHVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YStiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfcGx1cyhpbnQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9taW51cyhpbnQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9tdWx0aXBseShpbnQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAqIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZGl2aWRlPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4vPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS9iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAvICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfZGl2aWRlKGludCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9tb2R1bG8oaW50IGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihpbnQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGludCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKGludCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4oaW50IGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhpbnQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGludCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihpbnQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGludCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhpbnQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfcGx1cyhpbnQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgbG9uZyBvcGVyYXRvcl9taW51cyhpbnQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhIC0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tdWx0aXBseTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgbG9uZyBvcGVyYXRvcl9tdWx0aXBseShpbnQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfZGl2aWRlKGludCBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgbG9uZyBvcGVyYXRvcl9tb2R1bG8oaW50IGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAlIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oaW50IGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4oaW50IGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKGludCBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgPiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKGludCBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKGludCBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGludCBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wb3dlcjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT5NYXRoLnBvdygpPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoaW50IGEsIGxvbmcgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoaW50IGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhpbnQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cGx1czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9wbHVzKGludCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbWludXMoaW50IGEsIGludCBiKSB7CisJCXJldHVybiBhIC0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tdWx0aXBseTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9tdWx0aXBseShpbnQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgKiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmRpdmlkZTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9kaXZpZGUoaW50IGEsIGludCBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbW9kdWxvKGludCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSAlIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKGludCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGludCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihpbnQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihpbnQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhpbnQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhpbnQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wb3dlcjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT5NYXRoLnBvdygpPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKGludCBhLCBpbnQgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGludCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoaW50IGEsIGludCBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cGx1czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfcGx1cyhpbnQgYSwgY2hhciBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbWludXMoaW50IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX211bHRpcGx5KGludCBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgKiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmRpdmlkZTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfZGl2aWRlKGludCBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbW9kdWxvKGludCBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oaW50IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihpbnQgYSwgY2hhciBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihpbnQgYSwgY2hhciBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKGludCBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoaW50IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhpbnQgYSwgY2hhciBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoaW50IGEsIGNoYXIgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhpbnQgYSwgY2hhciBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoaW50IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfcGx1cyhpbnQgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbWludXMoaW50IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgLSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm11bHRpcGx5PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX211bHRpcGx5KGludCBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfZGl2aWRlKGludCBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbW9kdWxvKGludCBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhICUgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oaW50IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihpbnQgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihpbnQgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSA+IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlckVxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKGludCBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoaW50IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhpbnQgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPk1hdGgucG93KCk8L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoaW50IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhpbnQgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoaW50IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wbHVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfcGx1cyhpbnQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX21pbnVzKGludCBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgLSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm11bHRpcGx5PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbXVsdGlwbHkoaW50IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSAqIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZGl2aWRlPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4vPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfZGl2aWRlKGludCBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX21vZHVsbyhpbnQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhICUgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihpbnQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhIDwgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihpbnQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlclRoYW4oaW50IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA+IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlckVxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYW4gaW50ZWdlci4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4oaW50IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA+PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+PT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoaW50IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEhPWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ub3RFcXVhbHMoaW50IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPk1hdGgucG93KCk8L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihpbnQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBNYXRoLnBvdyhhLCBiKTsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPj09PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhbiBpbnRlZ2VyLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhpbnQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGFuIGludGVnZXIuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSAhPSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlTm90RXF1YWxzKGludCBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLy8gRU5EIGdlbmVyYXRlZCBjb2RlCisKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0ludGVnZXJSYW5nZS5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvSW50ZWdlclJhbmdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3NGM2NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0ludGVnZXJSYW5nZS5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlOworCisvKioKKyAqIEEgc2VxdWVuY2Ugb2YgaW50ZWdlcnMgc3RhcnRpbmcgZnJvbSA8Y29kZT5zdGFydDwvY29kZT4gdXAgdG8gPGNvZGU+ZW5kPC9jb2RlPiB3aXRoIGFuIGluY3JlbWVudCBvZiA8Y29kZT5zdGVwPC9jb2RlPi4gCisgKiBUaGUgdmFsdWUgb2YgPGNvZGU+c3RhcnQ8L2NvZGU+IGlzIGFsd2F5cyBpbmNsdWRlZC4gCisgKiBUaGUgdmFsdWUgb2YgPGNvZGU+ZW5kPC9jb2RlPiBpcyBpbmNsdWRlZCBvbmx5IGlmIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gPGNvZGU+ZW5kLXN0YXJ0PC9jb2RlPiBpcyBhIG11bHRpcGxlIG9mIDxjb2RlPnN0ZXA8L2NvZGU+LiAKKyAqIFRoZSA8Y29kZT5zdGVwPC9jb2RlPiBjYW4gYmUgcG9zaXRpdmUgb3IgbmVnYXRpdmUsIGJ1dCBuZXZlciAwLiBJdCBtdXN0IGhhdmUgdGhlIHNhbWUgc2lnbnVtIGFzIG9mIDxjb2RlPmVuZC1zdGFydDwvY29kZT4uCisgKiAKKyAqIEBhdXRob3IgSmFuIEtvZWhubGVpbiAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqIEBhdXRob3IgS2Fyc3RlbiBUaG9tcyAtIEJ1ZyMzODExNDAKKyAqIEBzaW5jZSAyLjMKKyAqLworQEd3dENvbXBhdGlibGUgcHVibGljIGNsYXNzIEludGVnZXJSYW5nZSBpbXBsZW1lbnRzIEl0ZXJhYmxlPEludGVnZXI+IHsKKworCXByaXZhdGUgZmluYWwgaW50IHN0YXJ0OworCXByaXZhdGUgZmluYWwgaW50IGVuZDsKKwlwcml2YXRlIGZpbmFsIGludCBzdGVwOworCisJLyoqCisJICogQHJldHVybiBhIHJlYWQtb25seSB7QGxpbmsgTGlzdEl0ZXJhdG9yfSBmb3IgdGhpcy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlAUHVyZQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SW50ZWdlcj4gaXRlcmF0b3IoKSB7CisJCXJldHVybiBuZXcgUmFuZ2VJdGVyYXRvcigpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgSW50ZWdlclJhbmdlIG9iamVjdC4KKwkgKiBUaGUgc3RlcCB3aWxsIGJlIHNldCB0byAtMSBpZiBlbmQmbHQ7c3RhcnQgb3IgdG8gMSBvdGhlcndpc2UuCisJICogCisJICogQHBhcmFtIHN0YXJ0CisJICogICAgICAgICAgICB0aGUgc3RhcnQgdmFsdWUgKGluY2x1c2l2ZSkKKwkgKiBAcGFyYW0gZW5kCisJICogICAgICAgICAgICB0aGUgZW5kIHZhbHVlIChpbmNsdXNpdmUpCisJICovCisJQFB1cmUKKwlwdWJsaWMgSW50ZWdlclJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgeworCQl0aGlzKHN0YXJ0LCBlbmQsIGVuZCA+PSBzdGFydCA/IDEgOiAtMSk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBJbnRlZ2VyUmFuZ2Ugb2JqZWN0LgorCSAqIAorCSAqIEBwYXJhbSBzdGFydAorCSAqICAgICAgICAgICAgdGhlIHN0YXJ0IHZhbHVlIChpbmNsdXNpdmUpCisJICogQHBhcmFtIGVuZAorCSAqICAgICAgICAgICAgdGhlIGVuZCB2YWx1ZSAoaW5jbHVzaXZlIGlmIGVuZC1zdGFydCVzdGVwID09IDApCisJICogQHBhcmFtIHN0ZXAKKwkgKiAgICAgICAgICAgIHRoZSBpbmNyZW1lbnQKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBJbnRlZ2VyUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgc3RlcCkgeworCQlpZiAoKHN0YXJ0IDwgZW5kKSAmJiBzdGVwIDwgMCB8fCAoc3RhcnQgPiBlbmQpICYmIHN0ZXAgPiAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHN0ZXAgb2YgYW4gSW50ZWdlclJhbmdlIG11c3QgaGF2ZSB0aGUgY29ycmVjdCBzaWduLiIpOworCQlpZiAoc3RlcCA9PSAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHN0ZXAgb2YgYW4gSW50ZWdlclJhbmdlIG11c3Qgbm90IGJlIDAiKTsKKwkJdGhpcy5zdGFydCA9IHN0YXJ0OworCQl0aGlzLmVuZCA9IGVuZDsKKwkJdGhpcy5zdGVwID0gc3RlcDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzdGFydCB2YWx1ZQorCSAqLworCUBQdXJlCisJcHVibGljIGludCBnZXRTdGFydCgpIHsKKwkJcmV0dXJuIHN0YXJ0OworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHN0ZXAgdmFsdWUKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBpbnQgZ2V0U3RlcCgpIHsKKwkJcmV0dXJuIHN0ZXA7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgZW5kIHZhbHVlCisJICovCisJQFB1cmUKKwlwdWJsaWMgaW50IGdldEVuZCgpIHsKKwkJcmV0dXJuIGVuZDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBJbnRlZ2VyUmFuZ2UuIFRoYXQgaXMgPGVtPm5vdDwvZW0+IHRoZSBsZW5ndGggb2YgdGhlIGludGVydmFsLAorCSAqIGJ1dCA8Y29kZT4oZW5kLXN0YXJ0KS9zdGVwICsgMTwvY29kZT4uCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgSW50ZWdlclJhbmdlLgorCSAqLworCUBQdXJlCisJcHVibGljIGludCBnZXRTaXplKCkgeworCQlyZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIHN0ZXAgKyAxOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzdGVwCisJICogICAgICAgICAgICB0aGUgc3RlcCBvZiB0aGUgbmV3IHJhbmdlLgorCSAqIEByZXR1cm4gYSBuZXcgSW50ZWdlclJhbmdlIHdpdGggdGhlIGdpdmVuIHN0ZXAuCisJICovCisJQFB1cmUKKwlwdWJsaWMgSW50ZWdlclJhbmdlIHdpdGhTdGVwKGludCBzdGVwKSB7CisJCXJldHVybiBuZXcgSW50ZWdlclJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgY29udGFpbnMgdGhlIGdpdmVuIG51bWJlciwgaS5lLiB3aGV0aGVyIHRoZSBpdGVyYXRvciB3aWxsIHlpZWxkIHRoZSBudW1iZXIuIFRoaXMgaXMgZGlmZmVyZW50CisJICogZnJvbSBpbnRlcnZhbCBjb250YWlubWVudDogPGNvZGU+MC4uMi5ieSgyKTwvY29kZT4gd2lsbCA8ZW0+bm90PC9lbT4gY29udGFpbiAxLgorCSAqIAorCSAqIEBwYXJhbSBudW1iZXIKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgdG8gYmUgY2hlY2tlZCBmb3IgY29udGFpbm1lbnQuCisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgc2VxdWVuY2UgY29udGFpbnMgdGhlIGdpdmVuIG51bWJlciBvciBub3QuCisJICovCisJQFB1cmUKKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgbnVtYmVyKSB7CisJCWlmIChzdGVwIDwgMCkKKwkJCXJldHVybiBudW1iZXIgPD0gc3RhcnQgJiYgbnVtYmVyID49IGVuZCAmJiAobnVtYmVyIC0gc3RhcnQpICUgc3RlcCA9PSAwOworCQllbHNlCisJCQlyZXR1cm4gbnVtYmVyID49IHN0YXJ0ICYmIG51bWJlciA8PSBlbmQgJiYgKG51bWJlciAtIHN0YXJ0KSAlIHN0ZXAgPT0gMDsKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIEphbiBLb2VobmxlaW4gLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisJICovCisJcHJpdmF0ZSBjbGFzcyBSYW5nZUl0ZXJhdG9yIGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEludGVnZXI+IHsKKworCQlwcml2YXRlIGludCBuZXh0ID0gc3RhcnQ7CisJCXByaXZhdGUgaW50IG5leHRJbmRleCA9IDA7CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisJCQlpZiAoc3RlcCA8IDApCisJCQkJcmV0dXJuIG5leHQgPj0gZW5kOworCQkJZWxzZQorCQkJCXJldHVybiBuZXh0IDw9IGVuZDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgSW50ZWdlciBuZXh0KCkgeworCQkJaWYgKCFoYXNOZXh0KCkpIHsKKwkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworCQkJfQorCQkJaW50IHZhbHVlID0gbmV4dDsKKwkJCW5leHQgKz0gc3RlcDsKKwkJCSsrbmV4dEluZGV4OworCQkJcmV0dXJuIHZhbHVlOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgeworCQkJcmV0dXJuIG5leHRJbmRleCA+IDA7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEludGVnZXIgcHJldmlvdXMoKSB7CisJCQlpZiAobmV4dEluZGV4IDw9IDApCisJCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKwkJCS0tbmV4dEluZGV4OworCQkJbmV4dCAtPSBzdGVwOworCQkJcmV0dXJuIG5leHQ7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBuZXh0SW5kZXgoKSB7CisJCQlyZXR1cm4gbmV4dEluZGV4OworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKKwkJCXJldHVybiBuZXh0SW5kZXggLSAxOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IHJlbW92ZSBlbGVtZW50cyBmcm9tIGEgUmFuZ2UiKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzZXQoSW50ZWdlciBlKSB7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbm5vdCBzZXQgZWxlbWVudHMgaW4gYSBSYW5nZSIpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGFkZChJbnRlZ2VyIGUpIHsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGFkZCBlbGVtZW50cyB0byBhIFJhbmdlIik7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9JdGVyYWJsZUV4dGVuc2lvbnMuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0l0ZXJhYmxlRXh0ZW5zaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZWFmYjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9JdGVyYWJsZUV4dGVuc2lvbnMuamF2YQpAQCAtMCwwICsxLDEwMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTcgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjE7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXMuUHJvY2VkdXJlMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlcy5Qcm9jZWR1cmUyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5pbnRlcm5hbC5Cb29sZWFuRnVuY3Rpb25EZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuaW50ZXJuYWwuRnVuY3Rpb25EZWxlZ2F0ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RJbmNvbXBhdGlibGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworCisvKioKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIGxpYnJhcnkgZm9yIHtAbGluayBJdGVyYWJsZSBpdGVyYWJsZXN9LgorICogCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKiBAYXV0aG9yIFNlYmFzdGlhbiBaYXJuZWtvdworICovCitAR3d0Q29tcGF0aWJsZQorcHVibGljIGNsYXNzIEl0ZXJhYmxlRXh0ZW5zaW9ucyB7CisKKwkvKioKKwkgKiA8cD4KKwkgKiBDb25jYXRlbmF0ZXMgdHdvIGl0ZXJhYmxlcyBpbnRvIGEgc2luZ2xlIGl0ZXJhYmxlLiBUaGUgcmV0dXJuZWQgaXRlcmFibGUgaGFzIGFuIGl0ZXJhdG9yIHRoYXQgdHJhdmVyc2VzIHRoZQorCSAqIGVsZW1lbnRzIGluIHtAY29kZSBhfSwgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzIGluIHtAY29kZSBifS4gVGhlIHJlc3VsdGluZyBpdGVyYWJsZSBpcyBlZmZlY3Rpdmx5IGEgdmlldyBvbiB0aGUKKwkgKiBzb3VyY2UgaXRlcmFibGVzLiBUaGF0IGlzLCB0aGUgc291cmNlIGl0ZXJhdG9ycyBhcmUgbm90IHBvbGxlZCB1bnRpbCBuZWNlc3NhcnkgYW5kIHRoZSByZXN1bHQgd2lsbCByZWZsZWN0CisJICogY2hhbmdlcyBpbiB0aGUgc291cmNlcy4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIHJldHVybmVkIGl0ZXJhYmxlJ3MgaXRlcmF0b3Igc3VwcG9ydHMge0Bjb2RlIHJlbW92ZSgpfSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IGl0ZXJhdG9yIHN1cHBvcnRzIGl0LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGl0ZXJhYmxlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBiCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIGl0ZXJhYmxlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYSBjb21iaW5lZCBpdGVyYWJsZS4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy4kNGNvbmNhdCgkMSwgJDIpIiwgaW1wb3J0ZWQ9SXRlcmFibGVzLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhYmxlPFQ+IG9wZXJhdG9yX3BsdXMoSXRlcmFibGU8PyBleHRlbmRzIFQ+IGEsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBUPiBiKSB7CisJCXJldHVybiBJdGVyYWJsZXMuY29uY2F0KGEsIGIpOworCX0KKworCS8qKgorCSAqIEZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBnaXZlbiBpdGVyYWJsZSB0aGF0IGZ1bGZpbGxzIHRoZSBwcmVkaWNhdGUuIElmIG5vbmUgaXMgZm91bmQgb3IgdGhlIGl0ZXJhYmxlIGlzCisJICogZW1wdHksIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYWJsZQorCSAqICAgICAgICAgICAgdGhlIGl0ZXJhYmxlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBwcmVkaWNhdGUKKwkgKiAgICAgICAgICAgIHRoZSBwcmVkaWNhdGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgaXRlcmFibGUgZm9yIHdoaWNoIHRoZSBnaXZlbiBwcmVkaWNhdGUgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiwgcmV0dXJucworCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZWxlbWVudCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUgb3IgdGhlIGl0ZXJhYmxlIGlzIGVtcHR5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IFQgZmluZEZpcnN0KEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlLCBGdW5jdGlvbjE8PyBzdXBlciBULCBCb29sZWFuPiBwcmVkaWNhdGUpIHsKKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5maW5kRmlyc3QoaXRlcmFibGUuaXRlcmF0b3IoKSwgcHJlZGljYXRlKTsKKwl9CisKKwkvKioKKwkgKiBGaW5kcyB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBnaXZlbiBpdGVyYWJsZSB0aGF0IGZ1bGZpbGxzIHRoZSBwcmVkaWNhdGUuIElmIG5vbmUgaXMgZm91bmQgb3IgdGhlIGl0ZXJhYmxlIGlzCisJICogZW1wdHksIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYWJsZQorCSAqICAgICAgICAgICAgdGhlIGl0ZXJhYmxlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBwcmVkaWNhdGUKKwkgKiAgICAgICAgICAgIHRoZSBwcmVkaWNhdGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBpdGVyYWJsZSBmb3Igd2hpY2ggdGhlIGdpdmVuIHByZWRpY2F0ZSByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCByZXR1cm5zCisJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlIHByZWRpY2F0ZSBvciB0aGUgaXRlcmFibGUgaXMgZW1wdHkuCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gVCBmaW5kTGFzdChJdGVyYWJsZTxUPiBpdGVyYWJsZSwgRnVuY3Rpb25zLkZ1bmN0aW9uMTw/IHN1cGVyIFQsIEJvb2xlYW4+IHByZWRpY2F0ZSkgeworCQlpZiAocHJlZGljYXRlID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInByZWRpY2F0ZSIpOworCQlpZiAoaXRlcmFibGUgaW5zdGFuY2VvZiBMaXN0PD8+KSB7CisJCQlMaXN0PFQ+IGxpc3QgPSAoTGlzdDxUPikgaXRlcmFibGU7CisJCQlMaXN0SXRlcmF0b3I8VD4gaXRlcmF0b3IgPSBsaXN0Lmxpc3RJdGVyYXRvcihsaXN0LnNpemUoKSk7CisJCQl3aGlsZSAoaXRlcmF0b3IuaGFzUHJldmlvdXMoKSkgeworCQkJCVQgdCA9IGl0ZXJhdG9yLnByZXZpb3VzKCk7CisJCQkJaWYgKHByZWRpY2F0ZS5hcHBseSh0KSkKKwkJCQkJcmV0dXJuIHQ7CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBJdGVyYXRvckV4dGVuc2lvbnMuZmluZExhc3QoaXRlcmFibGUuaXRlcmF0b3IoKSwgcHJlZGljYXRlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGdpdmVuIGl0ZXJhYmxlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGVtcHR5LgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYWJsZQorCSAqICAgICAgICAgICAgdGhlIGl0ZXJhYmxlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhYmxlIG9yIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IFQgaGVhZChJdGVyYWJsZTxUPiBpdGVyYWJsZSkgeworCQlyZXR1cm4gSXRlcmF0b3JFeHRlbnNpb25zLmhlYWQoaXRlcmFibGUuaXRlcmF0b3IoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIHZpZXcgb24gdGhpcyBpdGVyYWJsZSB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgZXhjZXB0IHRoZSBmaXJzdC4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmFibGUKKwkgKiAgICAgICAgICAgIHRoZSBpdGVyYWJsZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGFuIGl0ZXJhYmxlIHdpdGggYWxsIGVsZW1lbnRzIGV4Y2VwdCB0aGUgZmlyc3QuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBzZWUgI2Ryb3AoSXRlcmFibGUsIGludCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiBJdGVyYWJsZTxUPiB0YWlsKGZpbmFsIEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlKSB7CisJCXJldHVybiBkcm9wKGl0ZXJhYmxlLCAxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGdpdmVuIGl0ZXJhYmxlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGVtcHR5LgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYWJsZQorCSAqICAgICAgICAgICAgdGhlIGl0ZXJhYmxlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgaXRlcmFibGUgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gVCBsYXN0KEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlKSB7CisJCWlmIChpdGVyYWJsZSBpbnN0YW5jZW9mIExpc3Q8Pz4pIHsKKwkJCUxpc3Q8VD4gbGlzdCA9IChMaXN0PFQ+KSBpdGVyYWJsZTsKKwkJCWlmIChsaXN0LmlzRW1wdHkoKSkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCXJldHVybiBsaXN0LmdldChsaXN0LnNpemUoKSAtIDEpOworCQl9IGVsc2UgaWYgKGl0ZXJhYmxlIGluc3RhbmNlb2YgU29ydGVkU2V0KSB7CisJCQlTb3J0ZWRTZXQ8VD4gc29ydGVkU2V0ID0gKFNvcnRlZFNldDxUPikgaXRlcmFibGU7CisJCQlpZiAoc29ydGVkU2V0LmlzRW1wdHkoKSkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCXJldHVybiBzb3J0ZWRTZXQubGFzdCgpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5sYXN0KGl0ZXJhYmxlLml0ZXJhdG9yKCkpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIHZpZXcgb24gdGhpcyBpdGVyYWJsZSB0aGF0IHByb3ZpZGVzIGF0IG1vc3QgdGhlIGZpcnN0IDxjb2RlPmNvdW50PC9jb2RlPiBlbnRyaWVzLgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYWJsZQorCSAqICAgICAgICAgICAgdGhlIGl0ZXJhYmxlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBjb3VudAorCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBhdCBtb3N0LgorCSAqIEByZXR1cm4gYW4gaXRlcmFibGUgd2l0aCA8Y29kZT5jb3VudDwvY29kZT4gZWxlbWVudHMuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgPGNvZGU+Y291bnQ8L2NvZGU+IGlzIG5lZ2F0aXZlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhYmxlPFQ+IHRha2UoZmluYWwgSXRlcmFibGU8VD4gaXRlcmFibGUsIGZpbmFsIGludCBjb3VudCkgeworCQlpZiAoaXRlcmFibGUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaXRlcmFibGUiKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCB0YWtlIGEgbmVnYXRpdmUgbnVtYmVyIG9mIGVsZW1lbnRzLiBBcmd1bWVudCAnY291bnQnIHdhczogIgorCQkJCQkrIGNvdW50KTsKKwkJaWYgKGNvdW50ID09IDApCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJCXJldHVybiBuZXcgSXRlcmFibGU8VD4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxUPiBpdGVyYXRvcigpIHsKKwkJCQlyZXR1cm4gSXRlcmF0b3JFeHRlbnNpb25zLnRha2UoaXRlcmFibGUuaXRlcmF0b3IoKSwgY291bnQpOworCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSB2aWV3IG9uIHRoaXMgaXRlcmFibGUgdGhhdCBwcm92aWRlcyBhbGwgZWxlbWVudHMgZXhjZXB0IHRoZSBmaXJzdCA8Y29kZT5jb3VudDwvY29kZT4gZW50cmllcy4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmFibGUKKwkgKiAgICAgICAgICAgIHRoZSBpdGVyYWJsZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gY291bnQKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgZHJvcHBlZC4KKwkgKiBAcmV0dXJuIGFuIGl0ZXJhYmxlIHdpdGhvdXQgdGhlIGZpcnN0IDxjb2RlPmNvdW50PC9jb2RlPiBlbGVtZW50cy4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiA8Y29kZT5jb3VudDwvY29kZT4gaXMgbmVnYXRpdmUuCisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxUPiBJdGVyYWJsZTxUPiBkcm9wKGZpbmFsIEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlLCBmaW5hbCBpbnQgY291bnQpIHsKKwkJaWYgKGl0ZXJhYmxlID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIml0ZXJhYmxlIik7CisJCWlmIChjb3VudCA9PSAwKQorCQkJcmV0dXJuIGl0ZXJhYmxlOworCQlpZiAoY291bnQgPCAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGRyb3AgYSBuZWdhdGl2ZSBudW1iZXIgb2YgZWxlbWVudHMuIEFyZ3VtZW50ICdjb3VudCcgd2FzOiAiCisJCQkJCSsgY291bnQpOworCQlyZXR1cm4gbmV3IEl0ZXJhYmxlPFQ+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8VD4gaXRlcmF0b3IoKSB7CisJCQkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5kcm9wKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGNvdW50KTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBvbmUgb3IgbW9yZSBlbGVtZW50cyBpbiB7QGNvZGUgaXRlcmFibGV9IHNhdGlzZnkgdGhlIHByZWRpY2F0ZS4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmFibGUKKwkgKiAgICAgICAgICAgIHRoZSBpdGVyYWJsZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcHJlZGljYXRlCisJICogICAgICAgICAgICB0aGUgcHJlZGljYXRlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgb25lIG9yIG1vcmUgZWxlbWVudHMgaW4ge0Bjb2RlIGl0ZXJhYmxlfSBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUuCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gYm9vbGVhbiBleGlzdHMoSXRlcmFibGU8VD4gaXRlcmFibGUsIEZ1bmN0aW9uMTw/IHN1cGVyIFQsIEJvb2xlYW4+IHByZWRpY2F0ZSkgeworCQlyZXR1cm4gSXRlcmF0b3JFeHRlbnNpb25zLmV4aXN0cyhpdGVyYWJsZS5pdGVyYXRvcigpLCBwcmVkaWNhdGUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGV2ZXJ5IGVsZW1lbnQgaW4ge0Bjb2RlIGl0ZXJhYmxlfSBzYXRpc2ZpZXMgdGhlIHByZWRpY2F0ZS4gSWYge0Bjb2RlIGl0ZXJhYmxlfSBpcyBlbXB0eSwKKwkgKiB7QGNvZGUgdHJ1ZX0gaXMgcmV0dXJuZWQuIEluIG90aGVyIHdvcmRzLCA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQgaWYgYXQgbGVhc3Qgb25lIGVsZW1lbnQgZmFpbHMgdG8gZnVsZmlsbAorCSAqIHRoZSBwcmVkaWNhdGUuCisJICogCisJICogQHBhcmFtIGl0ZXJhYmxlCisJICogICAgICAgICAgICB0aGUgaXRlcmFibGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHByZWRpY2F0ZQorCSAqICAgICAgICAgICAgdGhlIHByZWRpY2F0ZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGV2ZXJ5IGVsZW1lbnQgaW4ge0Bjb2RlIGl0ZXJhYmxlfSBzYXRpc2ZpZXMgdGhlIHByZWRpY2F0ZSBhbmQgYWxzbyBpZiB0aGVyZSBpcyBubyBlbGVtZW50LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IGJvb2xlYW4gZm9yYWxsKEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlLCBGdW5jdGlvbjE8PyBzdXBlciBULCBCb29sZWFuPiBwcmVkaWNhdGUpIHsKKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5mb3JhbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgcHJlZGljYXRlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyBvZiB7QGNvZGUgdW5maWx0ZXJlZH0gdGhhdCBzYXRpc2Z5IGEgcHJlZGljYXRlLiBUaGUgcmVzdWx0aW5nIGl0ZXJhYmxlJ3MgaXRlcmF0b3IgZG9lcyBub3QKKwkgKiBzdXBwb3J0IHtAY29kZSByZW1vdmUoKX0uIFRoZSByZXR1cm5lZCBpdGVyYWJsZSBpcyBhIHZpZXcgb24gdGhlIG9yaWdpbmFsIGVsZW1lbnRzLiBDaGFuZ2VzIGluIHRoZSB1bmZpbHRlcmVkCisJICogb3JpZ2luYWwgYXJlIHJlZmxlY3RlZCBpbiB0aGUgdmlldy4KKwkgKiAKKwkgKiBAcGFyYW0gdW5maWx0ZXJlZAorCSAqICAgICAgICAgICAgdGhlIHVuZmlsdGVyZWQgaXRlcmFibGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHByZWRpY2F0ZQorCSAqICAgICAgICAgICAgdGhlIHByZWRpY2F0ZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGFuIGl0ZXJhYmxlIHRoYXQgY29udGFpbnMgb25seSB0aGUgZWxlbWVudHMgdGhhdCBmdWxmaWxsIHRoZSBwcmVkaWNhdGUuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8VD4gSXRlcmFibGU8VD4gZmlsdGVyKEl0ZXJhYmxlPFQ+IHVuZmlsdGVyZWQsIEZ1bmN0aW9uMTw/IHN1cGVyIFQsIEJvb2xlYW4+IHByZWRpY2F0ZSkgeworCQlyZXR1cm4gSXRlcmFibGVzLmZpbHRlcih1bmZpbHRlcmVkLCBuZXcgQm9vbGVhbkZ1bmN0aW9uRGVsZWdhdGU8VD4ocHJlZGljYXRlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZWxlbWVudHMgb2Yge0Bjb2RlIHVuZmlsdGVyZWR9IHRoYXQgZG8gbm90IHNhdGlzZnkgYSBwcmVkaWNhdGUuIFRoZSByZXN1bHRpbmcgaXRlcmFibGUncyBpdGVyYXRvciBkb2VzIG5vdAorCSAqIHN1cHBvcnQge0Bjb2RlIHJlbW92ZSgpfS4gVGhlIHJldHVybmVkIGl0ZXJhYmxlIGlzIGEgdmlldyBvbiB0aGUgb3JpZ2luYWwgZWxlbWVudHMuIENoYW5nZXMgaW4gdGhlIHVuZmlsdGVyZWQKKwkgKiBvcmlnaW5hbCBhcmUgcmVmbGVjdGVkIGluIHRoZSB2aWV3LgorCSAqCisJICogQHBhcmFtIHVuZmlsdGVyZWQKKwkgKiAgICAgICAgICAgIHRoZSB1bmZpbHRlcmVkIGl0ZXJhYmxlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBwcmVkaWNhdGUKKwkgKiAgICAgICAgICAgIHRoZSBwcmVkaWNhdGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhbiBpdGVyYWJsZSB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIGVsZW1lbnRzIHRoYXQgZG8gbm90IGZ1bGZpbGwgdGhlIHByZWRpY2F0ZS4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICoKKwkgKiBAc2luY2UgMi4xMQorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8VD4gSXRlcmFibGU8VD4gcmVqZWN0KEl0ZXJhYmxlPFQ+IHVuZmlsdGVyZWQsIEZ1bmN0aW9uMTw/IHN1cGVyIFQsIEJvb2xlYW4+IHByZWRpY2F0ZSkgeworCQlyZXR1cm4gSXRlcmFibGVzLmZpbHRlcih1bmZpbHRlcmVkLCBQcmVkaWNhdGVzLm5vdChuZXcgQm9vbGVhbkZ1bmN0aW9uRGVsZWdhdGU8VD4ocHJlZGljYXRlKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIG9mIHtAY29kZSB1bmZpbHRlcmVkfSB0aGF0IGFyZSBub3QgaW5zdGFuY2VvZiB7QGNvZGUgdHlwZX0uIFRoZSByZXN1bHRpbmcgaXRlcmFibGUncyBpdGVyYXRvciBkb2VzIG5vdAorCSAqIHN1cHBvcnQge0Bjb2RlIHJlbW92ZSgpfS4gVGhlIHJldHVybmVkIGl0ZXJhYmxlIGlzIGEgdmlldyBvbiB0aGUgb3JpZ2luYWwgZWxlbWVudHMuIENoYW5nZXMgaW4gdGhlIHVuZmlsdGVyZWQKKwkgKiBvcmlnaW5hbCBhcmUgcmVmbGVjdGVkIGluIHRoZSB2aWV3LgorCSAqCisJICogQHBhcmFtIHVuZmlsdGVyZWQKKwkgKiAgICAgICAgICAgIHRoZSB1bmZpbHRlcmVkIGl0ZXJhYmxlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSogQHBhcmFtIHR5cGUKKwkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGVsZW1lbnRzIHVuZGVzaXJlZC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGFuIGl0ZXJhYmxlIHRoYXQgY29udGFpbnMgb25seSB0aGUgZWxlbWVudHMgdGhhdCBhcmUgbm90IGluc3RhbmNlcyBvZiB7QGNvZGUgdHlwZX0uIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqICAgICAgICAgTm90ZSB0aGF0IHRoZSBlbGVtZW50cyBvZiB0aGUgaXRlcmFibGUgY2FuIGJlIG51bGwgYXMgbnVsbCBpcyBhbiBpbnN0YW5jZSBvZiBub3RoaW5nLgorCSAqCisJICogQHNpbmNlIDIuMTUKKwkgKi8KKwlAR3d0SW5jb21wYXRpYmxlKCJDbGFzcy5pc0luc3RhbmNlIikKKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhYmxlPFQ+IHJlamVjdChJdGVyYWJsZTxUPiB1bmZpbHRlcmVkLCBDbGFzczw/PiB0eXBlKSB7CisJCXJldHVybiBmaWx0ZXIodW5maWx0ZXJlZCwgKHQpIC0+ICF0eXBlLmlzSW5zdGFuY2UodCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIGluc3RhbmNlcyBvZiBjbGFzcyB7QGNvZGUgdHlwZX0gaW4ge0Bjb2RlIHVuZmlsdGVyZWR9LiBUaGUgcmV0dXJuZWQgaXRlcmFibGUgaGFzIGVsZW1lbnRzIHdob3NlIGNsYXNzCisJICogaXMge0Bjb2RlIHR5cGV9IG9yIGEgc3ViY2xhc3Mgb2Yge0Bjb2RlIHR5cGV9LiBUaGUgcmV0dXJuZWQgaXRlcmFibGUncyBpdGVyYXRvciBkb2VzIG5vdCBzdXBwb3J0IHtAY29kZSByZW1vdmUoKX0KKwkgKiAuIFRoZSByZXR1cm5lZCBpdGVyYWJsZSBpcyBhIHZpZXcgb24gdGhlIG9yaWdpbmFsIGVsZW1lbnRzLiBDaGFuZ2VzIGluIHRoZSB1bmZpbHRlcmVkIG9yaWdpbmFsIGFyZSByZWZsZWN0ZWQgaW4KKwkgKiB0aGUgdmlldy4KKwkgKiAKKwkgKiBAcGFyYW0gdW5maWx0ZXJlZAorCSAqICAgICAgICAgICAgdGhlIHVuZmlsdGVyZWQgaXRlcmFibGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHR5cGUKKwkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGVsZW1lbnRzIGRlc2lyZWQKKwkgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBpdGVyYWJsZSBjb250YWluaW5nIGFsbCBlbGVtZW50cyBvZiB0aGUgb3JpZ2luYWwgaXRlcmFibGUgdGhhdCB3ZXJlIG9mIHRoZSByZXF1ZXN0ZWQKKwkgKiAgICAgICAgIHR5cGUuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBHd3RJbmNvbXBhdGlibGUoIkNsYXNzLmlzSW5zdGFuY2UiKQorCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMuJDRmaWx0ZXIoJDEsICQyKSIsIGltcG9ydGVkPUl0ZXJhYmxlcy5jbGFzcykKKwlwdWJsaWMgc3RhdGljIDxUPiBJdGVyYWJsZTxUPiBmaWx0ZXIoSXRlcmFibGU8Pz4gdW5maWx0ZXJlZCwgQ2xhc3M8VD4gdHlwZSkgeworCQlyZXR1cm4gSXRlcmFibGVzLmZpbHRlcih1bmZpbHRlcmVkLCB0eXBlKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBpdGVyYWJsZSBmaWx0ZXJpbmcgYW55IG51bGwgcmVmZXJlbmNlcy4KKwkgKiAKKwkgKiBAcGFyYW0gdW5maWx0ZXJlZAorCSAqICAgICAgICAgICAgdGhlIHVuZmlsdGVyZWQgaXRlcmFibGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgaXRlcmFibGUgY29udGFpbmluZyBhbGwgZWxlbWVudHMgb2YgdGhlIG9yaWdpbmFsIGl0ZXJhYmxlIHdpdGhvdXQgYW55IDxjb2RlPm51bGw8L2NvZGU+IHJlZmVyZW5jZXMuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8VD4gSXRlcmFibGU8VD4gZmlsdGVyTnVsbChJdGVyYWJsZTxUPiB1bmZpbHRlcmVkKSB7CisJCXJldHVybiBJdGVyYWJsZXMuZmlsdGVyKHVuZmlsdGVyZWQsIFByZWRpY2F0ZXMubm90TnVsbCgpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgcGVyZm9ybXMgdGhlIGdpdmVuIHtAY29kZSB0cmFuc2Zvcm1hdGlvbn0gZm9yIGVhY2ggZWxlbWVudCBvZiB7QGNvZGUgb3JpZ2luYWx9IHdoZW4KKwkgKiByZXF1ZXN0ZWQuIFRoZSBtYXBwaW5nIGlzIGRvbmUgbGF6aWx5LiBUaGF0IGlzLCBzdWJzZXF1ZW50IGl0ZXJhdGlvbnMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBpdGVyYWJsZSB3aWxsCisJICogcmVwZWF0ZWRseSBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24uCisJICogPHA+CisJICogVGhlIHJldHVybmVkIGl0ZXJhYmxlJ3MgaXRlcmF0b3Igc3VwcG9ydHMge0Bjb2RlIHJlbW92ZSgpfSBpZiB0aGUgcHJvdmlkZWQgaXRlcmF0b3IgZG9lcy4gQWZ0ZXIgYSBzdWNjZXNzZnVsCisJICoge0Bjb2RlIHJlbW92ZSgpfSBjYWxsLCB7QGNvZGUgb3JpZ2luYWx9IG5vIGxvbmdlciBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gb3JpZ2luYWwKKwkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBpdGVyYWJsZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gdHJhbnNmb3JtYXRpb24KKwkgKiAgICAgICAgICAgIHRoZSB0cmFuc2Zvcm1hdGlvbi4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGFuIGl0ZXJhYmxlIHRoYXQgcHJvdmlkZXMgdGhlIHJlc3VsdCBvZiB0aGUgdHJhbnNmb3JtYXRpb24uIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8VCwgUj4gSXRlcmFibGU8Uj4gbWFwKEl0ZXJhYmxlPFQ+IG9yaWdpbmFsLCBGdW5jdGlvbjE8PyBzdXBlciBULCA/IGV4dGVuZHMgUj4gdHJhbnNmb3JtYXRpb24pIHsKKwkJcmV0dXJuIEl0ZXJhYmxlcy50cmFuc2Zvcm0ob3JpZ2luYWwsIG5ldyBGdW5jdGlvbkRlbGVnYXRlPFQsIFI+KHRyYW5zZm9ybWF0aW9uKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHBlcmZvcm1zIHRoZSBnaXZlbiB7QGNvZGUgdHJhbnNmb3JtYXRpb259IGZvciBlYWNoIGVsZW1lbnQgb2Yge0Bjb2RlIG9yaWdpbmFsfSB3aGVuCisJICogcmVxdWVzdGVkLiBUaGUgbWFwcGluZyBpcyBkb25lIGxhemlseS4gVGhhdCBpcywgc3Vic2VxdWVudCBpdGVyYXRpb25zIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgaXRlcmFibGUgd2lsbAorCSAqIHJlcGVhdGVkbHkgYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uLgorCSAqIDxwPgorCSAqIFRoZSB0cmFuc2Zvcm1hdGlvbiBtYXBzIGVhY2ggZWxlbWVudCB0byBhbiBpdGVyYWJsZSwgYW5kIGFsbCByZXN1bHRpbmcgaXRlcmFibGVzIGFyZSBjb21iaW5lZCB0byBhIHNpbmdsZSBpdGVyYWJsZS4KKwkgKiBFZmZlY3RpdmVseSBhIGNvbWJpbmF0aW9uIG9mIHtAbGluayAjbWFwKEl0ZXJhYmxlLCBGdW5jdGlvbnMuRnVuY3Rpb24xKX0gYW5kIHtAbGluayAjZmxhdHRlbihJdGVyYWJsZSl9IGlzIHBlcmZvcm1lZC4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIHJldHVybmVkIGl0ZXJhYmxlJ3MgaXRlcmF0b3IgPGk+ZG9lcyBub3Qgc3VwcG9ydCB7QGNvZGUgcmVtb3ZlKCl9PC9pPiBpbiBjb250cmFzdCB0byB7QGxpbmsgI21hcChJdGVyYWJsZSwgRnVuY3Rpb25zLkZ1bmN0aW9uMSl9LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gb3JpZ2luYWwKKwkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBpdGVyYWJsZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gdHJhbnNmb3JtYXRpb24KKwkgKiAgICAgICAgICAgIHRoZSB0cmFuc2Zvcm1hdGlvbi4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBhbmQgbXVzdCBub3QgeWllbGQgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhbiBpdGVyYWJsZSB0aGF0IHByb3ZpZGVzIHRoZSByZXN1bHQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiAKKwkgKiBAc2luY2UgMi4xMworCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8VCwgUj4gSXRlcmFibGU8Uj4gZmxhdE1hcChJdGVyYWJsZTxUPiBvcmlnaW5hbCwgRnVuY3Rpb24xPD8gc3VwZXIgVCwgPyBleHRlbmRzIEl0ZXJhYmxlPFI+PiB0cmFuc2Zvcm1hdGlvbikgeworCQlyZXR1cm4gZmxhdHRlbihtYXAob3JpZ2luYWwsIHRyYW5zZm9ybWF0aW9uKSk7CisJfQorCisJLyoqCisJICogQ29tYmluZXMgbXVsdGlwbGUgaXRlcmFibGVzIGludG8gYSBzaW5nbGUgaXRlcmFibGUuIFRoZSByZXR1cm5lZCBpdGVyYWJsZSBoYXMgYW4gaXRlcmF0b3IgdGhhdCB0cmF2ZXJzZXMgdGhlCisJICogZWxlbWVudHMgb2YgZWFjaCBpdGVyYWJsZSBpbiB7QGNvZGUgaW5wdXRzfS4gVGhlIGlucHV0IGl0ZXJhdG9ycyBhcmUgbm90IHBvbGxlZCB1bnRpbCBuZWNlc3NhcnkuCisJICogCisJICogPHA+CisJICogVGhlIHJldHVybmVkIGl0ZXJhYmxlJ3MgaXRlcmF0b3Igc3VwcG9ydHMge0Bjb2RlIHJlbW92ZSgpfSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IGl0ZXJhdG9yIHN1cHBvcnRzIGl0LiBUaGUKKwkgKiBtZXRob2RzIG9mIHRoZSByZXR1cm5lZCBpdGVyYWJsZSBtYXkgdGhyb3cge0Bjb2RlIE51bGxQb2ludGVyRXhjZXB0aW9ufSBpZiBhbnkgb2YgdGhlIGlucHV0IGl0ZXJhdG9ycyBhcmUgbnVsbC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGlucHV0cworCSAqICAgICAgICAgICAgdGhlIHRvIGJlIGZsYXR0ZW5lZCBpdGVyYWJsZXMuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhbiBpdGVyYWJsZSB0aGF0IHByb3ZpZGVzIHRoZSBjb25jYXRlbmF0ZWQgdmFsdWVzIG9mIHRoZSBpbnB1dCBlbGVtZW50cy4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJQElubGluZSh2YWx1ZT0iJDIuJDNjb25jYXQoJDEpIiwgaW1wb3J0ZWQ9SXRlcmFibGVzLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhYmxlPFQ+IGZsYXR0ZW4oSXRlcmFibGU8PyBleHRlbmRzIEl0ZXJhYmxlPD8gZXh0ZW5kcyBUPj4gaW5wdXRzKSB7CisJCXJldHVybiBJdGVyYWJsZXMuY29uY2F0KGlucHV0cyk7CisJfQorCisJLyoqCisJICogQXBwbGllcyB7QGNvZGUgcHJvY2VkdXJlfSBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBnaXZlbiBpdGVyYWJsZS4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmFibGUKKwkgKiAgICAgICAgICAgIHRoZSBpdGVyYWJsZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcHJvY2VkdXJlCisJICogICAgICAgICAgICB0aGUgcHJvY2VkdXJlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgZm9yRWFjaChJdGVyYWJsZTxUPiBpdGVyYWJsZSwgUHJvY2VkdXJlMTw/IHN1cGVyIFQ+IHByb2NlZHVyZSkgeworCQlJdGVyYXRvckV4dGVuc2lvbnMuZm9yRWFjaChpdGVyYWJsZS5pdGVyYXRvcigpLCBwcm9jZWR1cmUpOworCX0KKwkKKwkvKioKKwkgKiBBcHBsaWVzIHtAY29kZSBwcm9jZWR1cmV9IGZvciBlYWNoIGVsZW1lbnQgb2YgdGhlIGdpdmVuIGl0ZXJhYmxlLgorCSAqIFRoZSBwcm9jZWR1cmUgdGFrZXMgdGhlIGVsZW1lbnQgYW5kIGEgbG9vcCBjb3VudGVyLiBJZiB0aGUgY291bnRlciB3b3VsZCBvdmVyZmxvdywge0BsaW5rIEludGVnZXIjTUFYX1ZBTFVFfQorCSAqIGlzIHJldHVybmVkIGZvciBhbGwgc3Vic2VxdWVudCBlbGVtZW50cy4gVGhlIGZpcnN0IGVsZW1lbnQgaXMgYXQgaW5kZXggemVyby4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmFibGUKKwkgKiAgICAgICAgICAgIHRoZSBpdGVyYWJsZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcHJvY2VkdXJlCisJICogICAgICAgICAgICB0aGUgcHJvY2VkdXJlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiB2b2lkIGZvckVhY2goSXRlcmFibGU8VD4gaXRlcmFibGUsIFByb2NlZHVyZTI8PyBzdXBlciBULCA/IHN1cGVyIEludGVnZXI+IHByb2NlZHVyZSkgeworCQlJdGVyYXRvckV4dGVuc2lvbnMuZm9yRWFjaChpdGVyYWJsZS5pdGVyYXRvcigpLCBwcm9jZWR1cmUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBpdGVyYWJsZS4gTm8gZGVsaW1pdGVyIGlzIHVzZWQuCisJICogCisJICogQHBhcmFtIGl0ZXJhYmxlCisJICogICAgICAgICAgICB0aGUgaXRlcmFibGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpdGVyYWJsZSdzIGVsZW1lbnRzLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAc2VlICNqb2luKEl0ZXJhYmxlLCBDaGFyU2VxdWVuY2UsIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5GdW5jdGlvbnMuRnVuY3Rpb24xKQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvaW4oSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5qb2luKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBpdGVyYWJsZS4gVGhlIHtAY29kZSBzZXBhcmF0b3J9IGlzCisJICogdXNlZCB0byBiZXR3ZWVuIGVhY2ggcGFpciBvZiBlbnRyaWVzIGluIHRoZSBpbnB1dC4gVGhlIHN0cmluZyA8Y29kZT5udWxsPC9jb2RlPiBpcyB1c2VkIGZvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIGVudHJpZXMgaW4gdGhlIGlucHV0LgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYWJsZQorCSAqICAgICAgICAgICAgdGhlIGl0ZXJhYmxlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBzZXBhcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBzZXBhcmF0b3IuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpdGVyYWJsZSdzIGVsZW1lbnRzLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAc2VlICNqb2luKEl0ZXJhYmxlLCBDaGFyU2VxdWVuY2UsIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5GdW5jdGlvbnMuRnVuY3Rpb24xKQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvaW4oSXRlcmFibGU8Pz4gaXRlcmFibGUsIENoYXJTZXF1ZW5jZSBzZXBhcmF0b3IpIHsKKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5qb2luKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNlcGFyYXRvcik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGl0ZXJhYmxlLiBUaGUge0Bjb2RlIGZ1bmN0aW9ufSBpcworCSAqIHVzZWQgdG8gY29tcHV0ZSB0aGUgc3RyaW5nIGZvciBlYWNoIGVsZW1lbnQuIFRoZSB7QGNvZGUgc2VwYXJhdG9yfSBpcyB1c2VkIHRvIGJldHdlZW4gZWFjaCBwYWlyIG9mIGVudHJpZXMgaW4gdGhlCisJICogaW5wdXQuIFRoZSBzdHJpbmcgPGNvZGU+bnVsbDwvY29kZT4gaXMgdXNlZCBpZiB0aGUgZnVuY3Rpb24geWllbGRzIDxjb2RlPm51bGw8L2NvZGU+IGFzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKwkgKiBmb3IgYW4gZW50cnkuCisJICogCisJICogQHBhcmFtIGl0ZXJhYmxlCisJICogICAgICAgICAgICB0aGUgaXRlcmFibGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHNlcGFyYXRvcgorCSAqICAgICAgICAgICAgdGhlIHNlcGFyYXRvci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gZnVuY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGVsZW1lbnQuIE1heSBub3QgYmUKKwkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaXRlcmFibGUncyBlbGVtZW50cy4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gU3RyaW5nIGpvaW4oSXRlcmFibGU8VD4gaXRlcmFibGUsIENoYXJTZXF1ZW5jZSBzZXBhcmF0b3IsCisJCQlGdW5jdGlvbnMuRnVuY3Rpb24xPD8gc3VwZXIgVCwgPyBleHRlbmRzIENoYXJTZXF1ZW5jZT4gZnVuY3Rpb24pIHsKKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5qb2luKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNlcGFyYXRvciwgZnVuY3Rpb24pOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb25jYXRlbmF0ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gaXRlcmFibGUuIFRoZSB7QGNvZGUgZnVuY3Rpb259IGlzCisJICogdXNlZCB0byBjb21wdXRlIHRoZSBzdHJpbmcgZm9yIGVhY2ggZWxlbWVudC4gVGhlIHtAY29kZSBzZXBhcmF0b3J9IGlzIHVzZWQgdG8gYmV0d2VlbiBlYWNoIHBhaXIgb2YgZW50cmllcyBpbiB0aGUKKwkgKiBpbnB1dC4gVGhlIHN0cmluZyA8Y29kZT5udWxsPC9jb2RlPiBpcyB1c2VkIGlmIHRoZSBmdW5jdGlvbiB5aWVsZHMgPGNvZGU+bnVsbDwvY29kZT4gYXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbgorCSAqIGZvciBhbiBlbnRyeS4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmFibGUKKwkgKiAgICAgICAgICAgIHRoZSBpdGVyYWJsZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gYmVmb3JlCisJICogICAgICAgICAgICBwcmVwZW5kcyB0aGUgcmVzdWx0aW5nIHN0cmluZyBpZiB0aGUgaXRlcmFibGUgY29udGFpbnMgYXQgbGVhc3Qgb25lIGVsZW1lbnQuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nLgorCSAqIEBwYXJhbSBzZXBhcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBzZXBhcmF0b3IuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nLgorCSAqIEBwYXJhbSBhZnRlcgorCSAqICAgICAgICAgICAgYXBwZW5kZWQgdG8gdGhlIHJlc3VsdGluZyBzdHJpbmcgaWYgdGhlIGl0ZXJhYmxlIGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVsZW1lbnQuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nLgorCSAqIEBwYXJhbSBmdW5jdGlvbgorCSAqICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZWxlbWVudC4gTWF5IG5vdCBiZQorCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpdGVyYWJsZSdzIGVsZW1lbnRzLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiBTdHJpbmcgam9pbihJdGVyYWJsZTxUPiBpdGVyYWJsZSwgQ2hhclNlcXVlbmNlIGJlZm9yZSwgQ2hhclNlcXVlbmNlIHNlcGFyYXRvciwgQ2hhclNlcXVlbmNlIGFmdGVyLAorCQkJRnVuY3Rpb25zLkZ1bmN0aW9uMTw/IHN1cGVyIFQsID8gZXh0ZW5kcyBDaGFyU2VxdWVuY2U+IGZ1bmN0aW9uKSB7CisJCXJldHVybiBJdGVyYXRvckV4dGVuc2lvbnMuam9pbihpdGVyYWJsZS5pdGVyYXRvcigpLCBiZWZvcmUsIHNlcGFyYXRvciwgYWZ0ZXIsIGZ1bmN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIGl0ZXJhYmxlcyBjb250YWluIGVxdWFsIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLiBNb3JlIHNwZWNpZmljYWxseSwgdGhpcyBtZXRob2QgcmV0dXJucworCSAqIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgaXRlcmFibGV9IGFuZCB7QGNvZGUgb3RoZXJ9IGNvbnRhaW4gdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzIGFuZCBldmVyeSBlbGVtZW50IG9mCisJICoge0Bjb2RlIGl0ZXJhYmxlfSBpcyBlcXVhbCB0byB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHtAY29kZSBvdGhlcn0uCisJICogCisJICogQHBhcmFtIGl0ZXJhYmxlCisJICogICAgICAgICAgICBhbiBpdGVyYWJsZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gb3RoZXIKKwkgKiAgICAgICAgICAgIGFuIGl0ZXJhYmxlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBpdGVyYWJsZXMgY29udGFpbiBlcXVhbCBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNFcXVhbChJdGVyYWJsZTw/PiBpdGVyYWJsZSwgSXRlcmFibGU8Pz4gb3RoZXIpIHsKKwkJcmV0dXJuIEl0ZXJhYmxlcy5lbGVtZW50c0VxdWFsKGl0ZXJhYmxlLCBvdGhlcik7CisJfQorCisJLyoqCisJICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gaXRlcmFibGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgbm8gZWxlbWVudHMuCisJICogCisJICogQHBhcmFtIGl0ZXJhYmxlCisJICogICAgICAgICAgICB0aGUgdG8tYmUtcXVlcmllZCBpdGVyYWJsZS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBpdGVyYWJsZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBjb250YWlucyBubyBlbGVtZW50cworCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc051bGxPckVtcHR5KEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7CisJCXJldHVybiBpdGVyYWJsZSA9PSBudWxsIHx8IGlzRW1wdHkoaXRlcmFibGUpOworCX0KKworCS8qKgorCSAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGl0ZXJhYmxlIGNvbnRhaW5zIG5vIGVsZW1lbnRzLgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYWJsZQorCSAqICAgICAgICAgICAgdGhlIHRvLWJlLXF1ZXJpZWQgaXRlcmFibGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGl0ZXJhYmxlIGNvbnRhaW5zIG5vIGVsZW1lbnRzCisJICogQHNlZSAjaXNOdWxsT3JFbXB0eShJdGVyYWJsZSkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShJdGVyYWJsZTw/PiBpdGVyYWJsZSkgeworCQlpZiAoaXRlcmFibGUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uPD8+KQorCQkJcmV0dXJuICgoQ29sbGVjdGlvbjw/PikgaXRlcmFibGUpLmlzRW1wdHkoKTsKKwkJcmV0dXJuICFpdGVyYWJsZS5pdGVyYXRvcigpLmhhc05leHQoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4ge0Bjb2RlIGl0ZXJhYmxlfS4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmFibGUKKwkgKiAgICAgICAgICAgIHRoZSBpdGVyYWJsZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4ge0Bjb2RlIGl0ZXJhYmxlfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBzaXplKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7CisJCXJldHVybiBJdGVyYWJsZXMuc2l6ZShpdGVyYWJsZSk7CisJfQorCisJLyoqCisJICogPHA+CisJICogQXBwbGllcyB0aGUgY29tYmluYXRvciB7QGNvZGUgZnVuY3Rpb259IHRvIGFsbCBlbGVtZW50cyBvZiB0aGUgaXRlcmFibGUgaW4gdHVybi4KKwkgKiA8L3A+CisJICogPHA+CisJICogT25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIGFuIGVsZW1lbnQgb2YgdGhlIGl0ZXJhYmxlLCBhbmQgdGhlIG90aGVyIGlzIHRoZSByZXN1bHQgb2YgcHJldmlvdXMgYXBwbGljYXRpb24KKwkgKiBvZiB0aGUgZnVuY3Rpb24uIFRoZSBzZWVkIG9mIHRoZSBvcGVyYXRpb24gaXMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhYmxlLiBUaGUgc2Vjb25kIHZhbHVlIGlzIGNvbXB1dGVkIGJ5CisJICogYXBwbHlpbmcgdGhlIGZ1bmN0aW9uIHRvIHRoZSBzZWVkIHRvZ2V0aGVyIHdpdGggdGhlIHNlY29uZCBlbGVtZW50IG9mIHRoZSBpdGVyYWJsZS4gVGhlIHRoaXJkIHZhbHVlIGlzIGNvbXB1dGVkCisJICogZnJvbSB0aGUgcHJldmlvdXMgcmVzdWx0IHRvZ2V0aGVyIHdpdGggdGhlIHRoaXJkIGVsZW1lbnQgYW5kIHNvIG9uLiBJbiBvdGhlciB3b3JkcywgdGhlIHByZXZpb3VzIHJlc3VsdCBvZiBlYWNoCisJICogc3RlcCBpcyB0YWtlbiBhbmQgcGFzc2VkIHRvZ2V0aGVyIHdpdGggdGhlIG5leHQgZWxlbWVudCB0byB0aGUgY29tYmluYXRvciBmdW5jdGlvbi4KKwkgKiA8L3A+CisJICogPHA+CisJICogSWYgdGhlIGl0ZXJhYmxlIGlzIGVtcHR5LCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KKwkgKiA8L3A+CisJICogPHA+CisJICogTW9yZSBmb3JtYWxseSwgZ2l2ZW4gYW4gaXRlcmFibGUge0Bjb2RlIFthLCBiLCBjLCBkXX0gYW5kIGEgZnVuY3Rpb24ge0Bjb2RlIGZ9LCB0aGUgcmVzdWx0IG9mIHtAY29kZSByZWR1Y2V9IGlzCisJICogPGNvZGU+ZihmKGYoYSwgYiksIGMpLCBkKTwvY29kZT4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGl0ZXJhYmxlCisJICogICAgICAgICAgICB0aGUgdG8tYmUtcmVkdWNlZCBpdGVyYWJsZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gZnVuY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSBjb21iaW5hdG9yIGZ1bmN0aW9uLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIGxhc3QgcmVzdWx0IG9mIHRoZSBhcHBsaWVkIGNvbWJpbmF0b3IgZnVuY3Rpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHRoZSBlbXB0eSBpbnB1dC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiBUIHJlZHVjZShJdGVyYWJsZTw/IGV4dGVuZHMgVD4gaXRlcmFibGUsIEZ1bmN0aW9uMjw/IHN1cGVyIFQsID8gc3VwZXIgVCwgPyBleHRlbmRzIFQ+IGZ1bmN0aW9uKSB7CisJCXJldHVybiBJdGVyYXRvckV4dGVuc2lvbnMucmVkdWNlKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGZ1bmN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiA8cD4KKwkgKiBBcHBsaWVzIHRoZSBjb21iaW5hdG9yIHtAY29kZSBmdW5jdGlvbn0gdG8gYWxsIGVsZW1lbnRzIG9mIHRoZSBpdGVyYWJsZSBpbiB0dXJuIGFuZCB1c2VzIHtAY29kZSBzZWVkfSBhcyB0aGUKKwkgKiBzdGFydCB2YWx1ZS4KKwkgKiA8L3A+CisJICogPHA+CisJICogT25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIGFuIGVsZW1lbnQgb2YgdGhlIGl0ZXJhYmxlLCBhbmQgdGhlIG90aGVyIGlzIHRoZSByZXN1bHQgb2YgcHJldmlvdXMgYXBwbGljYXRpb24KKwkgKiBvZiB0aGUgZnVuY3Rpb24uIFRoZSBzZWVkIG9mIHRoZSBvcGVyYXRpb24gaXMgZXhwbGljaXRseSBwYXNzZWQgdG8KKwkgKiB7QGxpbmsgI2ZvbGQoSXRlcmFibGUsIE9iamVjdCwgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjIpIGZvbGR9LiBUaGUgZmlyc3QgY29tcHV0ZWQgdmFsdWUKKwkgKiBpcyB0aGUgcmVzdWx0IG9mIHRoZSBhcHBsaWVkIGZ1bmN0aW9uIGZvciB7QGNvZGUgc2VlZH0gYW5kIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBpdGVyYWJsZS4gVGhpcyBpbnRlcm1lZGlhdGUKKwkgKiByZXN1bHQgdG9nZXRoZXIgd2l0aCB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgdGhlIGl0ZXJhYmxlIHByb2R1Y2VkIHRoZSBuZXh0IHJlc3VsdCBhbmQgc28gb24uCisJICogPC9wPgorCSAqIDxwPgorCSAqIHtAbGluayAjZm9sZChJdGVyYWJsZSwgT2JqZWN0LCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMikgZm9sZH0gaXMgc2ltaWxhciB0bworCSAqIHtAbGluayAjcmVkdWNlKEl0ZXJhYmxlLCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMikgcmVkdWNlfSBidXQgYWxsb3dzIGEge0Bjb2RlIHNlZWR9IHZhbHVlCisJICogYW5kIHRoZSBjb21iaW5hdG9yIHtAY29kZSBmdW5jdGlvbn0gbWF5IGJlIGFzeW1tZXRyaWMuIEl0IHRha2VzIHtAY29kZSBUIGFuZCBSfSBhbmQgcmV0dXJucyB7QGNvZGUgUn0uCisJICogPHA+CisJICogSWYgdGhlIGl0ZXJhYmxlIGlzIGVtcHR5LCA8Y29kZT5zZWVkPC9jb2RlPiBpcyByZXR1cm5lZC4KKwkgKiA8L3A+CisJICogPHA+CisJICogTW9yZSBmb3JtYWxseSwgZ2l2ZW4gYW4gaXRlcmFibGUge0Bjb2RlIFthLCBiLCBjLCBkXX0sIGEgc2VlZCB7QGNvZGUgaW5pdGlhbH0gYW5kIGEgZnVuY3Rpb24ge0Bjb2RlIGZ9LCB0aGUKKwkgKiByZXN1bHQgb2Yge0Bjb2RlIGZvbGR9IGlzIDxjb2RlPmYoZihmKGYoaW5pdGlhbCwgYSksIGIpLCBjKSwgZCk8L2NvZGU+CisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYWJsZQorCSAqICAgICAgICAgICAgdGhlIHRvLWJlLWZvbGRlZCBpdGVyYWJsZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gc2VlZAorCSAqICAgICAgICAgICAgdGhlIGluaXRpYWwgdmFsdWUuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gZnVuY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSBjb21iaW5hdG9yIGZ1bmN0aW9uLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIGxhc3QgcmVzdWx0IG9mIHRoZSBhcHBsaWVkIGNvbWJpbmF0b3IgZnVuY3Rpb24gb3IgPGNvZGU+c2VlZDwvY29kZT4gZm9yIHRoZSBlbXB0eSBpbnB1dC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxULCBSPiBSIGZvbGQoSXRlcmFibGU8VD4gaXRlcmFibGUsIFIgc2VlZCwgRnVuY3Rpb24yPD8gc3VwZXIgUiwgPyBzdXBlciBULCA/IGV4dGVuZHMgUj4gZnVuY3Rpb24pIHsKKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5mb2xkKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNlZWQsIGZ1bmN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbGlzdCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgZW50cmllcyBvZiB0aGUgZ2l2ZW4gaXRlcmFibGUgaW4gdGhlIHNhbWUgb3JkZXIuIElmIHRoZSBpdGVyYWJsZSBpcyBvZiB0eXBlCisJICoge0BsaW5rIExpc3R9LCBpdHNlbGYgaXMgcmV0dXJuZWQuIFRoZXJlZm9yZSBhbiB1bmNoZWNrZWQgY2FzdCBpcyBwZXJmb3JtZWQuIAorCSAqIEluIGFsbCBvdGhlciBjYXNlcywgdGhlIHJlc3VsdCBsaXN0IGlzIGEgY29weSBvZiB0aGUgaXRlcmFibGUuCisJICogCisJICogQHBhcmFtIGl0ZXJhYmxlCisJICogICAgICAgICAgICB0aGUgaXRlcmFibGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhIGxpc3Qgd2l0aCB0aGUgc2FtZSBlbnRyaWVzIGFzIHRoZSBnaXZlbiBpdGVyYWJsZS4gTWF5IGJlIHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBpdGVyYWJsZSBpZmYgaXQKKwkgKiAgICAgICAgIGltcGxlbWVudHMge0BsaW5rIExpc3R9LCBvdGhlcndpc2UgYSBjb3B5IGlzIHJldHVybmVkLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlAQmV0YQorCXB1YmxpYyBzdGF0aWMgPFQ+IExpc3Q8VD4gdG9MaXN0KEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlKSB7CisJCWlmIChpdGVyYWJsZSBpbnN0YW5jZW9mIExpc3Q8Pz4pIHsKKwkJCUxpc3Q8VD4gcmVzdWx0ID0gKExpc3Q8VD4pIGl0ZXJhYmxlOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlyZXR1cm4gTGlzdHMubmV3QXJyYXlMaXN0KGl0ZXJhYmxlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgc2V0IHRoYXQgY29udGFpbnMgYWxsIHRoZSB1bmlxdWUgZW50cmllcyBvZiB0aGUgZ2l2ZW4gaXRlcmFibGUgaW4gdGhlIG9yZGVyIG9mIHRoZWlyIGFwcGVhcmFuY2UuIElmIHRoZQorCSAqIGl0ZXJhYmxlIGlzIG9mIHR5cGUge0BsaW5rIFNldH0sIGl0c2VsZiBpcyByZXR1cm5lZC4gVGhlcmVmb3JlIGFuIHVuY2hlY2tlZCBjYXN0IGlzIHBlcmZvcm1lZC4KKwkgKiBJbiBhbGwgb3RoZXIgY2FzZXMsIHRoZSByZXN1bHQgc2V0IGlzIGEgY29weSBvZiB0aGUgaXRlcmFibGUgd2l0aCBzdGFibGUgb3JkZXIuCisJICogCisJICogQHBhcmFtIGl0ZXJhYmxlCisJICogICAgICAgICAgICB0aGUgaXRlcmFibGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhIHNldCB3aXRoIHRoZSB1bmlxdWUgZW50cmllcyBvZiB0aGUgZ2l2ZW4gaXRlcmFibGUuIE1heSBiZSB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gaXRlcmFibGUgaWZmIGl0CisJICogICAgICAgICBpbXBsZW1lbnRzIHtAbGluayBTZXR9LCBvdGhlcndpc2UgYSBjb3B5IGlzIHJldHVybmVkLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlAQmV0YQorCXB1YmxpYyBzdGF0aWMgPFQ+IFNldDxUPiB0b1NldChJdGVyYWJsZTxUPiBpdGVyYWJsZSkgeworCQlpZiAoaXRlcmFibGUgaW5zdGFuY2VvZiBTZXQ8Pz4pIHsKKwkJCVNldDxUPiByZXN1bHQgPSAoU2V0PFQ+KSBpdGVyYWJsZTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJcmV0dXJuIFNldHMubmV3TGlua2VkSGFzaFNldChpdGVyYWJsZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIG1hcCBmb3Igd2hpY2ggdGhlIHtAbGluayBNYXAjdmFsdWVzfSBhcmUgY29tcHV0ZWQgYnkgdGhlIGdpdmVuIGZ1bmN0aW9uLCBhbmQgZWFjaCBrZXkgaXMgYW4gZWxlbWVudCBpbgorCSAqIHRoZSBnaXZlbiB7QGNvZGUga2V5c30uIElmIHRoZSBpdGVyYWJsZSBjb250YWlucyBlcXVhbCBrZXlzIG1vcmUgdGhhbiBvbmNlLCB0aGUgbGFzdCBvbmUgd2lsbCBiZSBjb250YWluZWQgaW4gdGhlCisJICogbWFwLiBUaGUgbWFwIGlzIGNvbXB1dGVkIGVhZ2VybHkuIFRoYXQgaXMsIHN1YnNlcXVlbnQgY2hhbmdlcyBpbiB0aGUga2V5cyBhcmUgbm90IHJlZmxlY3RlZCBieSB0aGUgbWFwLgorCSAqIAorCSAqIEBwYXJhbSBrZXlzCisJICogICAgICAgICAgICB0aGUga2V5cyB0byB1c2Ugd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIHtAY29kZSBNYXB9LiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBjb21wdXRlVmFsdWVzCisJICogICAgICAgICAgICB0aGUgZnVuY3Rpb24gdXNlZCB0byBwcm9kdWNlIHRoZSB2YWx1ZXMgZm9yIGVhY2gga2V5LiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYSBtYXAgbWFwcGluZyBlYWNoIGVudHJ5IGluIHRoZSBnaXZlbiBpdGVyYWJsZSB0byB0aGUgY29ycmVzcG9uZGluZyByZXN1bHQgd2hlbiBldmFsdWF0aW5nIHRoZSBmdW5jdGlvbgorCSAqICAgICAgICAge0Bjb2RlIGNvbXB1dGVWYWx1ZXN9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLCBWPiB0b0ludmVydGVkTWFwKEl0ZXJhYmxlPD8gZXh0ZW5kcyBLPiBrZXlzLCBGdW5jdGlvbjE8PyBzdXBlciBLLCBWPiBjb21wdXRlVmFsdWVzKSB7CisJCXJldHVybiBJdGVyYXRvckV4dGVuc2lvbnMudG9JbnZlcnRlZE1hcChrZXlzLml0ZXJhdG9yKCksIGNvbXB1dGVWYWx1ZXMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBtYXAgZm9yIHdoaWNoIHRoZSB7QGxpbmsgTWFwI3ZhbHVlc30gYXJlIHRoZSBnaXZlbiBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gb3JkZXIsIGFuZCBlYWNoIGtleSBpcyB0aGUKKwkgKiBwcm9kdWN0IG9mIGludm9raW5nIGEgc3VwcGxpZWQgZnVuY3Rpb24ge0Bjb2RlIGNvbXB1dGVLZXlzfSBvbiBpdHMgY29ycmVzcG9uZGluZyB2YWx1ZS4gSWYgdGhlIGZ1bmN0aW9uIHByb2R1Y2VzCisJICogdGhlIHNhbWUga2V5IGZvciBkaWZmZXJlbnQgdmFsdWVzLCB0aGUgbGFzdCBvbmUgd2lsbCBiZSBjb250YWluZWQgaW4gdGhlIG1hcC4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWVzCisJICogICAgICAgICAgICB0aGUgdmFsdWVzIHRvIHVzZSB3aGVuIGNvbnN0cnVjdGluZyB0aGUge0Bjb2RlIE1hcH0uIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGNvbXB1dGVLZXlzCisJICogICAgICAgICAgICB0aGUgZnVuY3Rpb24gdXNlZCB0byBwcm9kdWNlIHRoZSBrZXkgZm9yIGVhY2ggdmFsdWUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhIG1hcCBtYXBwaW5nIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZnVuY3Rpb24ge0Bjb2RlIGtleUZ1bmN0aW9ufSBvbiBlYWNoIHZhbHVlIGluIHRoZSBpbnB1dAorCSAqICAgICAgICAgY29sbGVjdGlvbiB0byB0aGF0IHZhbHVlCisJICovCisJcHVibGljIHN0YXRpYyA8SywgVj4gTWFwPEssIFY+IHRvTWFwKEl0ZXJhYmxlPD8gZXh0ZW5kcyBWPiB2YWx1ZXMsIEZ1bmN0aW9uMTw/IHN1cGVyIFYsIEs+IGNvbXB1dGVLZXlzKSB7CisJCXJldHVybiBJdGVyYXRvckV4dGVuc2lvbnMudG9NYXAodmFsdWVzLml0ZXJhdG9yKCksIGNvbXB1dGVLZXlzKTsKKwl9CisJCisJCisJLyoqCisJICogUmV0dXJucyBhIG1hcCBmb3Igd2hpY2ggdGhlIHtAbGluayBNYXAjdmFsdWVzfSBhcmUgdGhlIHByb2R1Y3Qgb2YgaW52b2tpbmcgc3VwcGxpZWQgZnVuY3Rpb24ge0Bjb2RlIGNvbXB1dGVWYWx1ZXN9IAorCSAqIG9uIGlucHV0IGl0ZXJhYmxlIGVsZW1lbnRzLCBhbmQgZWFjaCBrZXkgaXMgdGhlIHByb2R1Y3Qgb2YgaW52b2tpbmcgYSBzdXBwbGllZCBmdW5jdGlvbiB7QGNvZGUgY29tcHV0ZUtleXN9IG9uIHNhbWUgZWxlbWVudHMuIAorCSAqIElmIHRoZSBmdW5jdGlvbiBwcm9kdWNlcyB0aGUgc2FtZSBrZXkgZm9yIGRpZmZlcmVudCB2YWx1ZXMsIHRoZSBsYXN0IG9uZSB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGUgbWFwLgorCSAqIAorCSAqIEBwYXJhbSBpbnB1dHMKKwkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byB1c2Ugd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIHtAY29kZSBNYXB9LiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBjb21wdXRlS2V5cworCSAqICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gcHJvZHVjZSB0aGUga2V5IGZvciBlYWNoIHZhbHVlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBjb21wdXRlVmFsdWVzCisJICogICAgICAgICAgICB0aGUgZnVuY3Rpb24gdXNlZCB0byBwcm9kdWNlIHRoZSB2YWx1ZXMgZm9yIGVhY2gga2V5LiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYSBtYXAgbWFwcGluZyB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGZ1bmN0aW9ucyB7QGNvZGUga2V5RnVuY3Rpb259IGFuZCB7QGNvZGUgY29tcHV0ZVZhbHVlc30gb24gZWFjaCB2YWx1ZSBpbiB0aGUgaW5wdXQKKwkgKiAgICAgICAgIGl0ZXJhdG9yIHRvIHRoYXQgdmFsdWUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxULCBLLCBWPiBNYXA8SywgVj4gdG9NYXAoSXRlcmFibGU8PyBleHRlbmRzIFQ+IGlucHV0cywgRnVuY3Rpb24xPD8gc3VwZXIgVCwgSz4gY29tcHV0ZUtleXMsIEZ1bmN0aW9uMTw/IHN1cGVyIFQsIFY+IGNvbXB1dGVWYWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy50b01hcChpbnB1dHMuaXRlcmF0b3IoKSxjb21wdXRlS2V5cyxjb21wdXRlVmFsdWVzKTsKKyAgICB9CisKKwkKKwkvKioKKwkgKiBSZXR1cm5zIGEgbWFwIGZvciB3aGljaCB0aGUge0BsaW5rIE1hcCN2YWx1ZXN9IGlzIGEgY29sbGVjdGlvbiBvZiBsaXN0cywgd2hlcmUgdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0IHdpbGwgCisJICogYXBwZWFyIGluIHRoZSBvcmRlciBhcyB0aGV5IGFwcGVhcmVkIGluIHRoZSBpdGVyYWJsZS4gRWFjaCBrZXkgaXMgdGhlIHByb2R1Y3Qgb2YgaW52b2tpbmcgdGhlIHN1cHBsaWVkIAorCSAqIGZ1bmN0aW9uIHtAY29kZSBjb21wdXRlS2V5c30gb24gaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUuIFNvIGEga2V5IG9mIHRoYXQgbWFwIGdyb3VwcyBhIGxpc3Qgb2YgdmFsdWVzIGZvciAKKwkgKiB3aGljaCB0aGUgZnVuY3Rpb24gcHJvZHVjZWQgZXhhY3RseSB0aGF0IGtleS4gIAorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZXMKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZXMgdG8gdXNlIHdoZW4gY29uc3RydWN0aW5nIHRoZSB7QGNvZGUgTWFwfS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gY29tcHV0ZUtleXMKKwkgKiAgICAgICAgICAgIHRoZSBmdW5jdGlvbiB1c2VkIHRvIHByb2R1Y2UgdGhlIGtleSBmb3IgZWFjaCB2YWx1ZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGEgbWFwIG1hcHBpbmcgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBmdW5jdGlvbiB7QGNvZGUga2V5RnVuY3Rpb259IG9uIGVhY2ggdmFsdWUgaW4gdGhlIGlucHV0CisJICogICAgICAgICBpdGVyYWJsZSB0byB0aGF0IHZhbHVlLiBBcyB0aGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSB2YWx1ZSBtYXBwZWQgYnkgYSBrZXksIHRoZSBtYXBwaW5nIHJlc3VsdCBpcyBpcyBhCisJICogICAgICAgICBsaXN0IG9mIHZhbHVlcy4KKwkgKiBAc2luY2UgMi43CisJICovCisJcHVibGljIHN0YXRpYyA8SywgVj4gTWFwPEssIExpc3Q8Vj4+IGdyb3VwQnkoSXRlcmFibGU8PyBleHRlbmRzIFY+IHZhbHVlcywKKwkJCUZ1bmN0aW9uMTw/IHN1cGVyIFYsID8gZXh0ZW5kcyBLPiBjb21wdXRlS2V5cykgeworCQlyZXR1cm4gSXRlcmF0b3JFeHRlbnNpb25zLmdyb3VwQnkodmFsdWVzLml0ZXJhdG9yKCksIGNvbXB1dGVLZXlzKTsKKyAgIH0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBzb3J0ZWQgbGlzdCB0aGF0IGNvbnRhaW5zIHRoZSBpdGVtcyBvZiB0aGUgZ2l2ZW4gaXRlcmFibGUuIFRoZSByZXN1bHRpbmcgbGlzdCBpcyBpbiBhc2NlbmRpbmcgb3JkZXIsCisJICogYWNjb3JkaW5nIHRvIHRoZSBuYXR1cmFsIG9yZGVyaW5nIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgaXRlcmFibGUuCisJICogCisJICogQHBhcmFtIGl0ZXJhYmxlCisJICogICAgICAgICAgICB0aGUgaXRlbXMgdG8gYmUgc29ydGVkLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYSBzb3J0ZWQgbGlzdCBhcyBhIHNoYWxsb3cgY29weSBvZiB0aGUgZ2l2ZW4gaXRlcmFibGUuCisJICogQHNlZSBDb2xsZWN0aW9ucyNzb3J0KExpc3QpCisJICogQHNlZSAjc29ydChJdGVyYWJsZSwgQ29tcGFyYXRvcikKKwkgKiBAc2VlICNzb3J0QnkoSXRlcmFibGUsIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5GdW5jdGlvbnMuRnVuY3Rpb24xKQorCSAqIEBzZWUgTGlzdEV4dGVuc2lvbnMjc29ydElucGxhY2UoTGlzdCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+PiBMaXN0PFQ+IHNvcnQoSXRlcmFibGU8VD4gaXRlcmFibGUpIHsKKwkJTGlzdDxUPiBhc0xpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoaXRlcmFibGUpOworCQlpZiAoaXRlcmFibGUgaW5zdGFuY2VvZiBTb3J0ZWRTZXQ8Pz4pIHsKKwkJCWlmICgoKFNvcnRlZFNldDxUPikgaXRlcmFibGUpLmNvbXBhcmF0b3IoKSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIGFzTGlzdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gTGlzdEV4dGVuc2lvbnMuc29ydElucGxhY2UoYXNMaXN0KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHtAbGluayAjc29ydFdpdGgoSXRlcmFibGUsIENvbXBhcmF0b3IpfS4KKwkgKiAKKwkgKiBDcmVhdGVzIGEgc29ydGVkIGxpc3QgdGhhdCBjb250YWlucyB0aGUgaXRlbXMgb2YgdGhlIGdpdmVuIGl0ZXJhYmxlLiBUaGUgcmVzdWx0aW5nIGxpc3QgaXMgc29ydGVkIGFjY29yZGluZyB0bworCSAqIHRoZSBvcmRlciBpbmR1Y2VkIGJ5IHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmFibGUKKwkgKiAgICAgICAgICAgIHRoZSBpdGVtcyB0byBiZSBzb3J0ZWQuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGNvbXBhcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBjb21wYXJhdG9yIHRvIGJlIHVzZWQuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBuYXR1cmFsIG9yZGVyaW5nIG9mIHRoZQorCSAqICAgICAgICAgICAgZWxlbWVudHMgc2hvdWxkIGJlIHVzZWQuCisJICogQHJldHVybiBhIHNvcnRlZCBsaXN0IGFzIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBnaXZlbiBpdGVyYWJsZS4KKwkgKiBAc2VlIEl0ZXJhYmxlRXh0ZW5zaW9ucyNzb3J0V2l0aChJdGVyYWJsZSwgQ29tcGFyYXRvcikKKwkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzb3J0V2l0aChJdGVyYWJsZSwgQ29tcGFyYXRvcil9IGluc3RlYWQuCisJICovCisJQERlcHJlY2F0ZWQKKwlASW5saW5lKHZhbHVlPSIkMy4kNHNvcnRXaXRoKCQxLCAkMikiLCBpbXBvcnRlZD1JdGVyYWJsZUV4dGVuc2lvbnMuY2xhc3MpCisJcHVibGljIHN0YXRpYyA8VD4gTGlzdDxUPiBzb3J0KEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlLCBDb21wYXJhdG9yPD8gc3VwZXIgVD4gY29tcGFyYXRvcikgeworCQlyZXR1cm4gc29ydFdpdGgoaXRlcmFibGUsIGNvbXBhcmF0b3IpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgc29ydGVkIGxpc3QgdGhhdCBjb250YWlucyB0aGUgaXRlbXMgb2YgdGhlIGdpdmVuIGl0ZXJhYmxlLiBUaGUgcmVzdWx0aW5nIGxpc3QgaXMgc29ydGVkIGFjY29yZGluZyB0bworCSAqIHRoZSBvcmRlciBpbmR1Y2VkIGJ5IHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmFibGUKKwkgKiAgICAgICAgICAgIHRoZSBpdGVtcyB0byBiZSBzb3J0ZWQuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGNvbXBhcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBjb21wYXJhdG9yIHRvIGJlIHVzZWQuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBuYXR1cmFsIG9yZGVyaW5nIG9mIHRoZQorCSAqICAgICAgICAgICAgZWxlbWVudHMgc2hvdWxkIGJlIHVzZWQuCisJICogQHJldHVybiBhIHNvcnRlZCBsaXN0IGFzIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBnaXZlbiBpdGVyYWJsZS4KKwkgKiBAc2VlIENvbGxlY3Rpb25zI3NvcnQoTGlzdCwgQ29tcGFyYXRvcikKKwkgKiBAc2VlICNzb3J0KEl0ZXJhYmxlKQorCSAqIEBzZWUgI3NvcnRCeShJdGVyYWJsZSwgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjEpCisJICogQHNlZSBMaXN0RXh0ZW5zaW9ucyNzb3J0SW5wbGFjZShMaXN0LCBDb21wYXJhdG9yKQorCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiBMaXN0PFQ+IHNvcnRXaXRoKEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlLCBDb21wYXJhdG9yPD8gc3VwZXIgVD4gY29tcGFyYXRvcikgeworCQlyZXR1cm4gTGlzdEV4dGVuc2lvbnMuc29ydElucGxhY2UoTGlzdHMubmV3QXJyYXlMaXN0KGl0ZXJhYmxlKSwgY29tcGFyYXRvcik7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIHNvcnRlZCBsaXN0IHRoYXQgY29udGFpbnMgdGhlIGl0ZW1zIG9mIHRoZSBnaXZlbiBpdGVyYWJsZS4gVGhlIHJlc3VsdGluZyBsaXN0IGlzIHNvcnRlZCBhY2NvcmRpbmcgdG8KKwkgKiB0aGUgb3JkZXIgaW5kdWNlZCBieSBhcHBseWluZyBhIGtleSBmdW5jdGlvbiB0byBlYWNoIGVsZW1lbnQgd2hpY2ggeWllbGRzIGEgY29tcGFyYWJsZSBjcml0ZXJpYS4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmFibGUKKwkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBiZSBzb3J0ZWQuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGtleQorCSAqICAgICAgICAgICAgdGhlIGtleSBmdW5jdGlvbiB0by1iZS11c2VkLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYSBzb3J0ZWQgbGlzdCBhcyBhIHNoYWxsb3cgY29weSBvZiB0aGUgZ2l2ZW4gaXRlcmFibGUuCisJICogQHNlZSAjc29ydChJdGVyYWJsZSkKKwkgKiBAc2VlICNzb3J0KEl0ZXJhYmxlLCBDb21wYXJhdG9yKQorCSAqIEBzZWUgTGlzdEV4dGVuc2lvbnMjc29ydElucGxhY2VCeShMaXN0LCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMSkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxULCBDIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEM+PiBMaXN0PFQ+IHNvcnRCeShJdGVyYWJsZTxUPiBpdGVyYWJsZSwKKwkJCWZpbmFsIEZ1bmN0aW9ucy5GdW5jdGlvbjE8PyBzdXBlciBULCBDPiBrZXkpIHsKKwkJcmV0dXJuIExpc3RFeHRlbnNpb25zLnNvcnRJbnBsYWNlQnkoTGlzdHMubmV3QXJyYXlMaXN0KGl0ZXJhYmxlKSwga2V5KTsKKwl9CisJCisKKworCS8qKgorCSAqIFJldHVybnMgYW4gSXRlcmFibGUgY29udGFpbmluZyBhbGwgZWxlbWVudHMgc3RhcnRpbmcgZnJvbSB0aGUgaGVhZCBvZiB0aGUgc291cmNlIHVwIHRvIGFuZCBleGNsdWRpbmcgdGhlIGZpcnN0CisJICogZWxlbWVudCB0aGF0IHZpb2xhdGVzIHRoZSBwcmVkaWNhdGUgVGhlIHJlc3VsdGluZyBJdGVyYWJsZSBpcyBhIGxhemlseSBjb21wdXRlZCB2aWV3LCBzbyBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGUKKwkgKiB1bmRlcmx5aW5nIEl0ZXJhYmxlcyB3aWxsIGJlIHJlZmxlY3RlZCBvbiBzdWJzZXF1ZW50IGl0ZXJhdGlvbnMuIFRoZSByZXN1bHQncyBJdGVyYXRvciBkb2VzIG5vdCBzdXBwb3J0CisJICoge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfQorCSAqIAorCSAqIEBwYXJhbSBpdGVyYWJsZQorCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIGZyb20gd2hpY2ggdG8gdGFrZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcHJlZGljYXRlCisJICogICAgICAgICAgICB0aGUgcHJlZGljYXRlIHdoaWNoIGRlY2lkZXMgd2hldGhlciB0byBrZWVwIHRha2luZyBlbGVtZW50cy4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHRoZSB0YWtlbiBlbGVtZW50cworCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiBJdGVyYWJsZTxUPiB0YWtlV2hpbGUoZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIFQ+IGl0ZXJhYmxlLCBmaW5hbCBGdW5jdGlvbjE8PyBzdXBlciBULCBCb29sZWFuPiBwcmVkaWNhdGUpIHsKKwkJaWYgKGl0ZXJhYmxlID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIml0ZXJhYmxlIik7CisJCWlmIChwcmVkaWNhdGUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicHJlZGljYXRlIik7CisJCXJldHVybiBuZXcgSXRlcmFibGU8VD4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxUPiBpdGVyYXRvcigpIHsKKwkJCQlyZXR1cm4gSXRlcmF0b3JFeHRlbnNpb25zLnRha2VXaGlsZShpdGVyYWJsZS5pdGVyYXRvcigpLCBwcmVkaWNhdGUpOworCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gSXRlcmFibGUgY29udGFpbmluZyBhbGwgZWxlbWVudHMgc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgZWxlbWVudCBmb3Igd2hpY2ggdGhlIGRyb3AtcHJlZGljYXRlIHJldHVybmVkCisJICogZmFsc2UuIFRoZSByZXN1bHRpbmcgSXRlcmFibGUgaXMgYSBsYXppbHkgY29tcHV0ZWQgdmlldywgc28gYW55IG1vZGlmaWNhdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgSXRlcmFibGVzIHdpbGwgYmUKKwkgKiByZWZsZWN0ZWQgb24gc3Vic2VxdWVudCBpdGVyYXRpb25zLiBUaGUgcmVzdWx0J3MgSXRlcmF0b3IgZG9lcyBub3Qgc3VwcG9ydCB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9CisJICogCisJICogQHBhcmFtIGl0ZXJhYmxlCisJICogICAgICAgICAgICB0aGUgZWxlbWVudHMgZnJvbSB3aGljaCB0byBkcm9wLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBwcmVkaWNhdGUKKwkgKiAgICAgICAgICAgIHRoZSBwcmVkaWNhdGUgd2hpY2ggZGVjaWRlcyB3aGV0aGVyIHRvIGtlZXAgZHJvcHBpbmcgZWxlbWVudHMuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGFmdGVyIGRyb3BwaW5nCisJICogQHNpbmNlIDIuNworCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhYmxlPFQ+IGRyb3BXaGlsZShmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgVD4gaXRlcmFibGUsIGZpbmFsIEZ1bmN0aW9uMTw/IHN1cGVyIFQsIEJvb2xlYW4+IHByZWRpY2F0ZSkgeworCQlpZiAoaXRlcmFibGUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaXRlcmFibGUiKTsKKwkJaWYgKHByZWRpY2F0ZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwcmVkaWNhdGUiKTsKKwkJcmV0dXJuIG5ldyBJdGVyYWJsZTxUPigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkgeworCQkJCXJldHVybiBJdGVyYXRvckV4dGVuc2lvbnMuZHJvcFdoaWxlKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHByZWRpY2F0ZSk7CisJCQl9CisJCX07CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBJdGVyYWJsZSBvZiBQYWlycyB3aGVyZSB0aGUgbnRoIHBhaXIgaXMgY3JlYXRlZCBieSB0YWtpbmcgdGhlIG50aCBlbGVtZW50IG9mIHRoZSBzb3VyY2UgYXMgdGhlIHZhbHVlCisJICogaXRzIDAtYmFzZWQgaW5kZXggYXMgdGhlIGtleS4gRS5nLiA8Y29kZT56aXBXaXRJbmRleCgjWyJhIiwgImIiLCAiYyJdKSA9PSAjWygwLCAiYSIpLCAoMSwgImIiKSwgKDIsICJjIildPC9jb2RlPgorCSAqIAorCSAqIElmIHRoZSBpbmRleCB3b3VsZCBvdmVyZmxvdywge0BsaW5rIEludGVnZXIjTUFYX1ZBTFVFfSBpcyByZXR1cm5lZCBmb3IgYWxsIHN1YnNlcXVlbnQgZWxlbWVudHMuCisJICogCisJICogVGhlIHJlc3VsdGluZyBJdGVyYWJsZSBpcyBhIGxhemlseSBjb21wdXRlZCB2aWV3LCBzbyBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGUgdW5kZXJseWluZyBJdGVyYWJsZSB3aWxsIGJlCisJICogcmVmbGVjdGVkIG9uIGl0ZXJhdGlvbi4gVGhlIHJlc3VsdCdzIEl0ZXJhdG9yIGRvZXMgbm90IHN1cHBvcnQge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfQorCSAqIAorCSAqIEBwYXJhbSBpdGVyYWJsZQorCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIHppcHBlZCByZXN1bHQKKwkgKiBAc2luY2UgMi43CisJICovCisJcHVibGljIHN0YXRpYyA8QT4gSXRlcmFibGU8UGFpcjxJbnRlZ2VyLCBBPj4gaW5kZXhlZChmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgQT4gaXRlcmFibGUpIHsKKwkJaWYgKGl0ZXJhYmxlID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIml0ZXJhYmxlIik7CisJCXJldHVybiBuZXcgSXRlcmFibGU8UGFpcjxJbnRlZ2VyLCBBPj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxQYWlyPEludGVnZXIsIEE+PiBpdGVyYXRvcigpIHsKKwkJCQlyZXR1cm4gSXRlcmF0b3JFeHRlbnNpb25zLmluZGV4ZWQoaXRlcmFibGUuaXRlcmF0b3IoKSk7CisJCQl9CisJCX07CisJfQorCisJLyoqCisJICogRmluZHMgdGhlIG1pbmltdW0gb2YgdGhlIGdpdmVuIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGVpciBuYXR1cmFsIG9yZGVyaW5nLiBJZiB0aGVyZSBhcmUgc2V2ZXJhbCBtaW1pbmEsIHRoZQorCSAqIGZpcnN0IG9uZSB3aWxsIGJlIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYWJsZQorCSAqICAgICAgICAgICAgdGhlIG11dHVhbGx5IGNvbXBhcmFibGUgZWxlbWVudHMuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgbWluaW11bQorCSAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBpdGVyYWJsZSBpcyBlbXB0eQorCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+PiBUIG1pbihmaW5hbCBJdGVyYWJsZTxUPiBpdGVyYWJsZSkgeworCQlpZiAoaXRlcmFibGUgaW5zdGFuY2VvZiBTb3J0ZWRTZXQ8Pz4pIHsKKwkJCVNvcnRlZFNldDxUPiBhc1NldCA9IChTb3J0ZWRTZXQ8VD4pIGl0ZXJhYmxlOworCQkJLy8gb25seSB1c2UgdGhlIHNldC1zZW1hbnRpYyBpZiB3ZSBjYW4gYmUgYWJzb2x1dGVseSBzdXJlIHRoYXQgdGhlIHNldCB1c2VzIHRoZSBuYXR1cmFsIG9yZGVyCisJCQlpZiAoYXNTZXQuY29tcGFyYXRvcigpID09IG51bGwpCisJCQkJcmV0dXJuIGFzU2V0LmZpcnN0KCk7CisJCX0KKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5taW4oaXRlcmFibGUuaXRlcmF0b3IoKSk7CisJfQorCisJLyoqCisJICogRmluZHMgdGhlIGVsZW1lbnQgdGhhdCB5aWVsZHMgdGhlIG1pbmltdW0gdmFsdWUgd2hlbiBwYXNzZWQgdG8gPGNvZGU+Y29tcGFyZUJ5PC9jb2RlPi4gSWYgdGhlcmUgYXJlIHNldmVyYWwKKwkgKiBtaW5pbWEsIHRoZSBmaXJzdCBvbmUgd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmFibGUKKwkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBmaW5kIHRoZSBtaW5pbXVtIG9mLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBjb21wYXJlQnkKKwkgKiAgICAgICAgICAgIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgY29tcGFyYWJsZSBjaGFyYWN0ZXJpc3RpYyB0byBjb21wYXJlIHRoZSBlbGVtZW50cyBieS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHRoZSBtaW5pbXVtCisJICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIGl0ZXJhYmxlIGlzIGVtcHR5CisJICogQHNpbmNlIDIuNworCSAqLworCXB1YmxpYyBzdGF0aWMgPFQsIEMgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgQz4+IFQgbWluQnkoZmluYWwgSXRlcmFibGU8VD4gaXRlcmFibGUsCisJCQlmaW5hbCBGdW5jdGlvbjE8PyBzdXBlciBULCBDPiBjb21wYXJlQnkpIHsKKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5taW5CeShpdGVyYWJsZS5pdGVyYXRvcigpLCBjb21wYXJlQnkpOworCX0KKworCS8qKgorCSAqIEZpbmRzIHRoZSBtaW5pbm11bSBlbGVtZW50IGFjY29yZGluZyB0byA8Y29kZT5jb21wYXJhdG9yPC9jb2RlPi4gSWYgdGhlcmUgYXJlIHNldmVyYWwgbWluaW1hLCB0aGUgZmlyc3Qgb25lIHdpbGwKKwkgKiBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmFibGUKKwkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBmaW5kIHRoZSBtaW5pbXVtIG9mLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBjb21wYXJhdG9yCisJICogICAgICAgICAgICB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbi4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHRoZSBtaW5pbXVtCisJICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIGl0ZXJhYmxlIGlzIGVtcHR5CisJICogQHNpbmNlIDIuNworCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbWluKGZpbmFsIEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlLCBDb21wYXJhdG9yPD8gc3VwZXIgVD4gY29tcGFyYXRvcikgeworCQlyZXR1cm4gSXRlcmF0b3JFeHRlbnNpb25zLm1pbihpdGVyYWJsZS5pdGVyYXRvcigpLCBjb21wYXJhdG9yKTsKKwl9CisKKwkvKioKKwkgKiBGaW5kcyB0aGUgbWF4aW11bSBvZiB0aGUgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHRoZWlyIG5hdHVyYWwgb3JkZXJpbmcuIElmIHRoZXJlIGFyZSBzZXZlcmFsIG1heGltYSwgdGhlIGZpcnN0IG9uZQorCSAqIHdpbGwgYmUgcmV0dXJuZWQuCisJICogCisJICogQHBhcmFtIGl0ZXJhYmxlCisJICogICAgICAgICAgICB0aGUgbXV0dWFsbHkgY29tcGFyYWJsZSBlbGVtZW50cy4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHRoZSBtYXhpbXVtCisJICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIGl0ZXJhYmxlIGlzIGVtcHR5CisJICogQHNpbmNlIDIuNworCSAqLworCXB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgVD4+IFQgbWF4KGZpbmFsIEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlKSB7CisJCS8vIGNhbm5vdCBzcGVjaWFsLWNhc2UgZm9yIFNvcnRlZFNldCBzaW5jZSB3ZSB3YW50IHRvIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzIGEgbWF4aW11bQorCQkvLyB3aGVyZSBTZXQubGFzdCB3b3VsZCByZXR1cm4gdGhlIGxhc3Qgb2YgdGhlIHNlZW1pbmdseSBlcXVhbCBtYXhpbXVtIGVsZW1lbnRzCisJCXJldHVybiBJdGVyYXRvckV4dGVuc2lvbnMubWF4KGl0ZXJhYmxlLml0ZXJhdG9yKCkpOworCX0KKworCS8qKgorCSAqIEZpbmRzIHRoZSBlbGVtZW50IHRoYXQgeWllbGRzIHRoZSBtYXhpbXVtIHZhbHVlIHdoZW4gcGFzc2VkIHRvIDxjb2RlPmNvbXBhcmVCeTwvY29kZT4gSWYgdGhlcmUgYXJlIHNldmVyYWwKKwkgKiBtYXhpbWEsIHRoZSBmaXJzdCBvbmUgd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmFibGUKKwkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBmaW5kIHRoZSBtYXhpbXVtIG9mLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBjb21wYXJlQnkKKwkgKiAgICAgICAgICAgIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgY29tcGFyYWJsZSBjaGFyYWN0ZXJpc3RpYyB0byBjb21wYXJlIHRoZSBlbGVtZW50cyBieS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHRoZSBtYXhpbXVtCisJICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIGl0ZXJhYmxlIGlzIGVtcHR5CisJICogQHNpbmNlIDIuNworCSAqLworCXB1YmxpYyBzdGF0aWMgPFQsIEMgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgQz4+IFQgbWF4QnkoZmluYWwgSXRlcmFibGU8VD4gaXRlcmFibGUsCisJCQlmaW5hbCBGdW5jdGlvbjE8PyBzdXBlciBULCBDPiBjb21wYXJlQnkpIHsKKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5tYXhCeShpdGVyYWJsZS5pdGVyYXRvcigpLCBjb21wYXJlQnkpOworCX0KKworCS8qKgorCSAqIEZpbmRzIHRoZSBtYXhpbXVtIGVsZW1lbnQgYWNjb3JkaW5nIHRvIDxjb2RlPmNvbXBhcmF0b3I8L2NvZGU+LiBJZiB0aGVyZSBhcmUgc2V2ZXJhbCBtYXhpbWEsIHRoZSBmaXJzdCBvbmUgd2lsbAorCSAqIGJlIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYWJsZQorCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIHRvIGZpbmQgdGhlIG1heGltdW0gb2YuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGNvbXBhcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIG1heGltdW0KKwkgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgaXRlcmFibGUgaXMgZW1wdHkKKwkgKiBAc2luY2UgMi43CisJICovCisJcHVibGljIHN0YXRpYyA8VD4gVCBtYXgoZmluYWwgSXRlcmFibGU8VD4gaXRlcmFibGUsIENvbXBhcmF0b3I8PyBzdXBlciBUPiBjb21wYXJhdG9yKSB7CisJCXJldHVybiBJdGVyYXRvckV4dGVuc2lvbnMubWF4KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGNvbXBhcmF0b3IpOworCX0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIEl0ZXJhYmxlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KKyAgICAgKiBNb3JlIGZvcm1hbGx5LCByZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgYW5kIG9ubHkgaWYgdGhpcyBJdGVyYWJsZSBjb250YWlucworICAgICAqIGF0IGxlYXN0IG9uZSBlbGVtZW50IDx0dD5lPC90dD4gc3VjaCB0aGF0CisgICAgICogPHR0PihvPT1udWxsJm5ic3A7PyZuYnNwO2U9PW51bGwmbmJzcDs6Jm5ic3A7by5lcXVhbHMoZSkpPC90dD4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlcmFibGUgCisgICAgICogCQkJdGhlIGVsZW1lbnRzIHRvIHRlc3QKKyAgICAgKiBAcGFyYW0gbyAKKyAgICAgKiAJCQllbGVtZW50IHdob3NlIHByZXNlbmNlIGluIHRoZSBJdGVyYWJsZSBpcyB0byBiZSB0ZXN0ZWQKKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBJdGVyYWJsZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKyAgICAgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoSXRlcmFibGU8Pz4gaXRlcmFibGUsIE9iamVjdCBvKSB7CisJCWlmIChpdGVyYWJsZSBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4pIHsKKwkJCXJldHVybiAoKENvbGxlY3Rpb248Pz4pIGl0ZXJhYmxlKS5jb250YWlucyhvKTsKKwkJfQorCQlyZXR1cm4gSXRlcmF0b3JFeHRlbnNpb25zLmNvbnRhaW5zKGl0ZXJhYmxlLml0ZXJhdG9yKCksIG8pOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0l0ZXJhdG9yRXh0ZW5zaW9ucy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvSXRlcmF0b3JFeHRlbnNpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhYzkzNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0l0ZXJhdG9yRXh0ZW5zaW9ucy5qYXZhCkBAIC0wLDAgKzEsMTA5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAyMCBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlcy5Qcm9jZWR1cmUxOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzLlByb2NlZHVyZTI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLmludGVybmFsLkJvb2xlYW5GdW5jdGlvbkRlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5pbnRlcm5hbC5GdW5jdGlvbkRlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5pbnRlcm5hbC5LZXlDb21wYXJhdG9yOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RJbmNvbXBhdGlibGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQWJzdHJhY3RJdGVyYXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhdG9yczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk9yZGVyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKKworLyoqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBsaWJyYXJ5IGZvciB7QGxpbmsgSXRlcmF0b3IgaXRlcmF0b3JzfS4KKyAqIAorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlIC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICogQGF1dGhvciBTZWJhc3RpYW4gWmFybmVrb3cKKyAqLworQEd3dENvbXBhdGlibGUgcHVibGljIGNsYXNzIEl0ZXJhdG9yRXh0ZW5zaW9ucyB7CisKKwkvKioKKwkgKiBXcmFwcyBhbiB7QGxpbmsgSXRlcmF0b3J9IGluIGFuIHtAbGluayBJdGVyYWJsZX0uIFdBUk5JTkc6IFRoZSByZXN1bHRpbmcKKwkgKiB7QGxpbmsgSXRlcmFibGV9IG1heSBiZSB1c2VkIChlLmcuIGNhbGxpbmcKKwkgKiB7QGxpbmsgSXRlcmFibGVFeHRlbnNpb25zI2lzRW1wdHkoSXRlcmFibGUpfSkgLyBpdGVyYXRlZCAoZS5nLiBpbiBhIGZvcgorCSAqIGxvb3ApIG9ubHkgb25jZS4gSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgcmV1c2FibGUge0BsaW5rIEl0ZXJhYmxlfSBjYWxsCisJICoge0BsaW5rIEl0ZXJhYmxlRXh0ZW5zaW9ucyN0b0xpc3QoSXRlcmFibGUpfSBvcgorCSAqIHtAbGluayBJdGVyYWJsZUV4dGVuc2lvbnMjdG9TZXQoSXRlcmFibGUpfSBvbiB0aGUgcmVzdWx0IGFuZCByZXVzZSB0aGUKKwkgKiByZXN1bHRpbmcge0BsaW5rIExpc3R9IC8ge0BsaW5rIFNldH0KKwkgKiBAcGFyYW0gaXRlcmF0b3IgdGhlIHtAbGluayBJdGVyYXRvcn0gdG8gd3JhcCBpbiBhbiB7QGxpbmsgSXRlcmFibGV9LiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYW4ge0BsaW5rIEl0ZXJhYmxlfSBwcm92aWRpbmcgdGhlIGdpdmVuIHtAbGluayBJdGVyYXRvcn0uIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8VD4gSXRlcmFibGU8VD4gdG9JdGVyYWJsZShmaW5hbCBJdGVyYXRvcjxUPiBpdGVyYXRvcikgeworCQlpZiAoaXRlcmF0b3IgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaXRlcmF0b3IiKTsKKwkJcmV0dXJuIG5ldyBJdGVyYWJsZTxUPigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkgeworCQkJCXJldHVybiBpdGVyYXRvcjsKKwkJCX0KKwkJfTsKKwl9CisJCisJLyoqCisJICogPHA+CisJICogQ29uY2F0ZW5hdGVzIHR3byBpdGVyYXRvcnMgaW50byBhIHNpbmdsZSBpdGVyYXRvci4gVGhlIHJldHVybmVkIGl0ZXJhdG9yIHRyYXZlcnNlcyB0aGUKKwkgKiBlbGVtZW50cyBpbiB7QGNvZGUgYX0sIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cyBpbiB7QGNvZGUgYn0uIFRoZSByZXN1bHRpbmcgaXRlcmF0b3IgaXMgZWZmZWN0aXZseSBhIHZpZXcgb24gdGhlCisJICogc291cmNlIGl0ZXJhdG9ycy4gVGhhdCBpcywgdGhlIHNvdXJjZSBpdGVyYXRvcnMgYXJlIG5vdCBwb2xsZWQgdW50aWwgbmVjZXNzYXJ5IGFuZCB0aGUgcmVzdWx0IHdpbGwgcmVmbGVjdAorCSAqIGNoYW5nZXMgaW4gdGhlIHNvdXJjZXMuCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSByZXR1cm5lZCBpdGVyYXRvciBzdXBwb3J0cyB7QGNvZGUgcmVtb3ZlKCl9IHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgaXRlcmF0b3Igc3VwcG9ydHMgaXQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICB0aGUgZmlyc3QgaXRlcmF0b3IuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGIKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgaXRlcmF0b3IuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhIGNvbWJpbmVkIGl0ZXJhdG9yLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLiQ0Y29uY2F0KCQxLCAkMikiLCBpbXBvcnRlZD1JdGVyYXRvcnMuY2xhc3MpCisJcHVibGljIHN0YXRpYyA8VD4gSXRlcmF0b3I8VD4gb3BlcmF0b3JfcGx1cyhJdGVyYXRvcjw/IGV4dGVuZHMgVD4gYSwgSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGIpIHsKKwkJcmV0dXJuIEl0ZXJhdG9ycy5jb25jYXQoYSwgYik7CisJfQorCisJLyoqCisJICogRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGdpdmVuIGl0ZXJhdG9yIHRoYXQgZnVsZmlsbHMgdGhlIHByZWRpY2F0ZS4gSWYgbm9uZSBpcyBmb3VuZCBvciB0aGUgaXRlcmF0b3IgaXMKKwkgKiBlbXB0eSwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCisJICogCisJICogQHBhcmFtIGl0ZXJhdG9yCisJICogICAgICAgICAgICB0aGUgaXRlcmF0b3IuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHByZWRpY2F0ZQorCSAqICAgICAgICAgICAgdGhlIHByZWRpY2F0ZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciBmb3Igd2hpY2ggdGhlIGdpdmVuIHByZWRpY2F0ZSByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCByZXR1cm5zCisJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlIHByZWRpY2F0ZSBvciB0aGUgaXRlcmF0b3IgaXMgZW1wdHkuCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gVCBmaW5kRmlyc3QoSXRlcmF0b3I8VD4gaXRlcmF0b3IsIEZ1bmN0aW9uMTw/IHN1cGVyIFQsIEJvb2xlYW4+IHByZWRpY2F0ZSkgeworCQlpZiAocHJlZGljYXRlID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInByZWRpY2F0ZSIpOworCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVQgdCA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChwcmVkaWNhdGUuYXBwbHkodCkpCisJCQkJcmV0dXJuIHQ7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogRmluZHMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gaXRlcmF0b3IgdGhhdCBmdWxmaWxscyB0aGUgcHJlZGljYXRlLiBJZiBub25lIGlzIGZvdW5kIG9yIHRoZSBpdGVyYXRvciBpcworCSAqIGVtcHR5LCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBpdGVyYXRvci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcHJlZGljYXRlCisJICogICAgICAgICAgICB0aGUgcHJlZGljYXRlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgZm9yIHdoaWNoIHRoZSBnaXZlbiBwcmVkaWNhdGUgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiwgcmV0dXJucworCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZWxlbWVudCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUgb3IgdGhlIGl0ZXJhdG9yIGlzIGVtcHR5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IFQgZmluZExhc3QoSXRlcmF0b3I8VD4gaXRlcmF0b3IsIEZ1bmN0aW9ucy5GdW5jdGlvbjE8PyBzdXBlciBULCBCb29sZWFuPiBwcmVkaWNhdGUpIHsKKwkJaWYgKHByZWRpY2F0ZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwcmVkaWNhdGUiKTsKKwkJVCByZXN1bHQgPSBudWxsOworCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVQgdCA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChwcmVkaWNhdGUuYXBwbHkodCkpCisJCQkJcmVzdWx0ID0gdDsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGdpdmVuIGl0ZXJhdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGVtcHR5LgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYXRvcgorCSAqICAgICAgICAgICAgdGhlIGl0ZXJhdG9yLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IFQgaGVhZChJdGVyYXRvcjxUPiBpdGVyYXRvcikgeworCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKQorCQkJcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIHZpZXcgb24gdGhpcyBpdGVyYXRvciB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgZXhjZXB0IHRoZSBmaXJzdC4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBpdGVyYXRvci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggYWxsIGVsZW1lbnRzIGV4Y2VwdCB0aGUgZmlyc3QuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBzZWUgI2Ryb3AoSXRlcmF0b3IsIGludCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiBJdGVyYXRvcjxUPiB0YWlsKGZpbmFsIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKSB7CisJCXJldHVybiBkcm9wKGl0ZXJhdG9yLCAxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGdpdmVuIGl0ZXJhdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGVtcHR5LgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYXRvcgorCSAqICAgICAgICAgICAgdGhlIGl0ZXJhdG9yLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gVCBsYXN0KEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKSB7CisJCVQgcmVzdWx0ID0gbnVsbDsKKwkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlyZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgdmlldyBvbiB0aGlzIGl0ZXJhdG9yIHRoYXQgcHJvdmlkZXMgYXQgbW9zdCB0aGUgZmlyc3QgPGNvZGU+Y291bnQ8L2NvZGU+IGVudHJpZXMuCisJICogCisJICogQHBhcmFtIGl0ZXJhdG9yCisJICogICAgICAgICAgICB0aGUgaXRlcmF0b3IuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGNvdW50CisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIGF0IG1vc3QuCisJICogQHJldHVybiBhbiBpdGVyYXRvciB3aXRoIDxjb2RlPmNvdW50PC9jb2RlPiBlbGVtZW50cy4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiA8Y29kZT5jb3VudDwvY29kZT4gaXMgbmVnYXRpdmUuCisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxUPiBJdGVyYXRvcjxUPiB0YWtlKGZpbmFsIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yLCBmaW5hbCBpbnQgY291bnQpIHsKKwkJaWYgKGl0ZXJhdG9yID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIml0ZXJhdG9yIik7CisJCWlmIChjb3VudCA8IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgdGFrZSBhIG5lZ2F0aXZlIG51bWJlciBvZiBlbGVtZW50cy4gQXJndW1lbnQgJ2NvdW50JyB3YXM6ICIKKwkJCQkJKyBjb3VudCk7CisJCWlmIChjb3VudCA9PSAwKQorCQkJcmV0dXJuIEltbXV0YWJsZVNldC48VD5vZigpLml0ZXJhdG9yKCk7CisJCXJldHVybiBuZXcgQWJzdHJhY3RJdGVyYXRvcjxUPigpIHsKKworCQkJcHJpdmF0ZSBpbnQgcmVtYWluaW5nID0gY291bnQ7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFQgY29tcHV0ZU5leHQoKSB7CisJCQkJaWYgKHJlbWFpbmluZyA8PSAwKQorCQkJCQlyZXR1cm4gZW5kT2ZEYXRhKCk7CisJCQkJaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpCisJCQkJCXJldHVybiBlbmRPZkRhdGEoKTsKKwkJCQlyZW1haW5pbmctLTsKKwkJCQlyZXR1cm4gaXRlcmF0b3IubmV4dCgpOworCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSB2aWV3IG9uIHRoaXMgaXRlcmF0b3IgdGhhdCBwcm92aWRlcyBhbGwgZWxlbWVudHMgZXhjZXB0IHRoZSBmaXJzdCA8Y29kZT5jb3VudDwvY29kZT4gZW50cmllcy4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBpdGVyYXRvci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gY291bnQKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgZHJvcHBlZC4KKwkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGhvdXQgdGhlIGZpcnN0IDxjb2RlPmNvdW50PC9jb2RlPiBlbGVtZW50cy4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiA8Y29kZT5jb3VudDwvY29kZT4gaXMgbmVnYXRpdmUuCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gSXRlcmF0b3I8VD4gZHJvcChmaW5hbCBJdGVyYXRvcjxUPiBpdGVyYXRvciwgZmluYWwgaW50IGNvdW50KSB7CisJCWlmIChpdGVyYXRvciA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJpdGVyYXRvciIpOworCQlpZiAoY291bnQgPT0gMCkKKwkJCXJldHVybiBpdGVyYXRvcjsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBkcm9wIGEgbmVnYXRpdmUgbnVtYmVyIG9mIGVsZW1lbnRzLiBBcmd1bWVudCAnY291bnQnIHdhczogIgorCQkJCQkrIGNvdW50KTsKKwkJcmV0dXJuIG5ldyBBYnN0cmFjdEl0ZXJhdG9yPFQ+KCkgeworCQkJeworCQkJCWludCBpID0gY291bnQ7CisJCQkJd2hpbGUgKGkgPiAwICYmIGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQlpdGVyYXRvci5uZXh0KCk7CisJCQkJCWktLTsKKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFQgY29tcHV0ZU5leHQoKSB7CisJCQkJaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpCisJCQkJCXJldHVybiBlbmRPZkRhdGEoKTsKKwkJCQlyZXR1cm4gaXRlcmF0b3IubmV4dCgpOworCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIG9uZSBvciBtb3JlIGVsZW1lbnRzIGluIHtAY29kZSBpdGVyYXRvcn0gc2F0aXNmeSB0aGUgcHJlZGljYXRlLgorCSAqIAorICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIHdpbGwgYWR2YW5jZSBvciBldmVuIGV4aGF1c3QgdGhlIGdpdmVuIGl0ZXJhdG9yLjwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBpdGVyYXRvci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcHJlZGljYXRlCisJICogICAgICAgICAgICB0aGUgcHJlZGljYXRlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgb25lIG9yIG1vcmUgZWxlbWVudHMgaW4ge0Bjb2RlIGl0ZXJhdG9yfSBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUuCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gYm9vbGVhbiBleGlzdHMoSXRlcmF0b3I8VD4gaXRlcmF0b3IsIEZ1bmN0aW9uMTw/IHN1cGVyIFQsIEJvb2xlYW4+IHByZWRpY2F0ZSkgeworCQlpZiAocHJlZGljYXRlID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInByZWRpY2F0ZSIpOworCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCWlmIChwcmVkaWNhdGUuYXBwbHkoaXRlcmF0b3IubmV4dCgpKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgZXZlcnkgZWxlbWVudCBpbiB7QGNvZGUgaXRlcmF0b3J9IHNhdGlzZmllcyB0aGUgcHJlZGljYXRlLiBJZiB7QGNvZGUgaXRlcmF0b3J9IGlzIGVtcHR5LAorCSAqIHtAY29kZSB0cnVlfSBpcyByZXR1cm5lZC4gSW4gb3RoZXIgd29yZHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZCBpZiBhdCBsZWFzdCBvbmUgZWxlbWVudCBmYWlscyB0byBmdWxmaWxsCisJICogdGhlIHByZWRpY2F0ZS4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBpdGVyYXRvci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcHJlZGljYXRlCisJICogICAgICAgICAgICB0aGUgcHJlZGljYXRlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZXZlcnkgZWxlbWVudCBpbiB7QGNvZGUgaXRlcmF0b3J9IHNhdGlzZmllcyB0aGUgcHJlZGljYXRlIGFuZCBhbHNvIGlmIHRoZXJlIGlzIG5vIGVsZW1lbnQuCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gYm9vbGVhbiBmb3JhbGwoSXRlcmF0b3I8VD4gaXRlcmF0b3IsIEZ1bmN0aW9uMTw/IHN1cGVyIFQsIEJvb2xlYW4+IHByZWRpY2F0ZSkgeworCQlpZiAocHJlZGljYXRlID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInByZWRpY2F0ZSIpOworCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCWlmICghcHJlZGljYXRlLmFwcGx5KGl0ZXJhdG9yLm5leHQoKSkpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIG9mIHtAY29kZSB1bmZpbHRlcmVkfSB0aGF0IHNhdGlzZnkgYSBwcmVkaWNhdGUuIFRoZSByZXN1bHRpbmcgaXRlcmF0b3IgZG9lcyBub3QKKwkgKiBzdXBwb3J0IHtAY29kZSByZW1vdmUoKX0uIFRoZSByZXR1cm5lZCBpdGVyYXRvciBpcyBhIHZpZXcgb24gdGhlIG9yaWdpbmFsIGVsZW1lbnRzLiBDaGFuZ2VzIGluIHRoZSB1bmZpbHRlcmVkCisJICogb3JpZ2luYWwgYXJlIHJlZmxlY3RlZCBpbiB0aGUgdmlldy4KKwkgKiAKKwkgKiBAcGFyYW0gdW5maWx0ZXJlZAorCSAqICAgICAgICAgICAgdGhlIHVuZmlsdGVyZWQgaXRlcmF0b3IuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHByZWRpY2F0ZQorCSAqICAgICAgICAgICAgdGhlIHByZWRpY2F0ZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgY29udGFpbnMgb25seSB0aGUgZWxlbWVudHMgdGhhdCBmdWxmaWxsIHRoZSBwcmVkaWNhdGUuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8VD4gSXRlcmF0b3I8VD4gZmlsdGVyKEl0ZXJhdG9yPFQ+IHVuZmlsdGVyZWQsIEZ1bmN0aW9uMTw/IHN1cGVyIFQsIEJvb2xlYW4+IHByZWRpY2F0ZSkgeworCQlyZXR1cm4gSXRlcmF0b3JzLmZpbHRlcih1bmZpbHRlcmVkLCBuZXcgQm9vbGVhbkZ1bmN0aW9uRGVsZWdhdGU8VD4ocHJlZGljYXRlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZWxlbWVudHMgb2Yge0Bjb2RlIHVuZmlsdGVyZWR9IHRoYXQgZG8gbm90IHNhdGlzZnkgYSBwcmVkaWNhdGUuIFRoZSByZXN1bHRpbmcgaXRlcmF0b3IgZG9lcyBub3QKKwkgKiBzdXBwb3J0IHtAY29kZSByZW1vdmUoKX0uIFRoZSByZXR1cm5lZCBpdGVyYXRvciBpcyBhIHZpZXcgb24gdGhlIG9yaWdpbmFsIGVsZW1lbnRzLiBDaGFuZ2VzIGluIHRoZSB1bmZpbHRlcmVkCisJICogb3JpZ2luYWwgYXJlIHJlZmxlY3RlZCBpbiB0aGUgdmlldy4KKwkgKgorCSAqIEBwYXJhbSB1bmZpbHRlcmVkCisJICogICAgICAgICAgICB0aGUgdW5maWx0ZXJlZCBpdGVyYXRvci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcHJlZGljYXRlCisJICogICAgICAgICAgICB0aGUgcHJlZGljYXRlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCBjb250YWlucyBvbmx5IHRoZSBlbGVtZW50cyB0aGF0IGRvIG5vdCBmdWxmaWxsIHRoZSBwcmVkaWNhdGUuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8VD4gSXRlcmF0b3I8VD4gcmVqZWN0KEl0ZXJhdG9yPFQ+IHVuZmlsdGVyZWQsIEZ1bmN0aW9uMTw/IHN1cGVyIFQsIEJvb2xlYW4+IHByZWRpY2F0ZSkgeworCQlyZXR1cm4gSXRlcmF0b3JzLmZpbHRlcih1bmZpbHRlcmVkLCBQcmVkaWNhdGVzLm5vdChuZXcgQm9vbGVhbkZ1bmN0aW9uRGVsZWdhdGU8VD4ocHJlZGljYXRlKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIGluc3RhbmNlcyBvZiBjbGFzcyB7QGNvZGUgdHlwZX0gaW4ge0Bjb2RlIHVuZmlsdGVyZWR9LiBUaGUgcmV0dXJuZWQgaXRlcmF0b3IgaGFzIGVsZW1lbnRzIHdob3NlIGNsYXNzCisJICogaXMge0Bjb2RlIHR5cGV9IG9yIGEgc3ViY2xhc3Mgb2Yge0Bjb2RlIHR5cGV9LiBUaGUgcmV0dXJuZWQgaXRlcmF0b3IgZG9lcyBub3Qgc3VwcG9ydCB7QGNvZGUgcmVtb3ZlKCl9LgorCSAqIFRoZSByZXR1cm5lZCBpdGVyYXRvciBpcyBhIHZpZXcgb24gdGhlIG9yaWdpbmFsIGVsZW1lbnRzLiBDaGFuZ2VzIGluIHRoZSB1bmZpbHRlcmVkIG9yaWdpbmFsIGFyZSByZWZsZWN0ZWQgaW4KKwkgKiB0aGUgdmlldy4KKwkgKiAKKwkgKiBAcGFyYW0gdW5maWx0ZXJlZAorCSAqICAgICAgICAgICAgdGhlIHVuZmlsdGVyZWQgaXRlcmF0b3IuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHR5cGUKKwkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGVsZW1lbnRzIGRlc2lyZWQKKwkgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBpdGVyYXRvciBjb250YWluaW5nIGFsbCBlbGVtZW50cyBvZiB0aGUgb3JpZ2luYWwgaXRlcmF0b3IgdGhhdCB3ZXJlIG9mIHRoZSByZXF1ZXN0ZWQKKwkgKiAgICAgICAgIHR5cGUuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJQEd3dEluY29tcGF0aWJsZSgiQ2xhc3MuaXNJbnN0YW5jZSIpCisJQElubGluZSh2YWx1ZT0iJDMuJDRmaWx0ZXIoJDEsICQyKSIsIGltcG9ydGVkPUl0ZXJhdG9ycy5jbGFzcykKKwlwdWJsaWMgc3RhdGljIDxUPiBJdGVyYXRvcjxUPiBmaWx0ZXIoSXRlcmF0b3I8Pz4gdW5maWx0ZXJlZCwgQ2xhc3M8VD4gdHlwZSkgeworCQlyZXR1cm4gSXRlcmF0b3JzLmZpbHRlcih1bmZpbHRlcmVkLCB0eXBlKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBpdGVyYXRvciBmaWx0ZXJpbmcgYW55IG51bGwgcmVmZXJlbmNlcy4KKwkgKiAKKwkgKiBAcGFyYW0gdW5maWx0ZXJlZAorCSAqICAgICAgICAgICAgdGhlIHVuZmlsdGVyZWQgaXRlcmF0b3IuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgaXRlcmF0b3IgY29udGFpbmluZyBhbGwgZWxlbWVudHMgb2YgdGhlIG9yaWdpbmFsIGl0ZXJhdG9yIHdpdGhvdXQgYW55IDxjb2RlPm51bGw8L2NvZGU+CisJICogICAgICAgICByZWZlcmVuY2VzLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhdG9yPFQ+IGZpbHRlck51bGwoSXRlcmF0b3I8VD4gdW5maWx0ZXJlZCkgeworCQlyZXR1cm4gSXRlcmF0b3JzLmZpbHRlcih1bmZpbHRlcmVkLCBQcmVkaWNhdGVzLm5vdE51bGwoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IHBlcmZvcm1zIHRoZSBnaXZlbiB7QGNvZGUgdHJhbnNmb3JtYXRpb259IGZvciBlYWNoIGVsZW1lbnQgb2Yge0Bjb2RlIG9yaWdpbmFsfSB3aGVuCisJICogcmVxdWVzdGVkLiBUaGUgbWFwcGluZyBpcyBkb25lIGxhemlseS4gCisJICogCisJICogVGhlIHJldHVybmVkIGl0ZXJhdG9yJ3MgaXRlcmF0b3Igc3VwcG9ydHMge0Bjb2RlIHJlbW92ZSgpfSBpZiB0aGUgcHJvdmlkZWQgaXRlcmF0b3IgZG9lcy4gQWZ0ZXIgYSBzdWNjZXNzZnVsCisJICoge0Bjb2RlIHJlbW92ZSgpfSBjYWxsLCB7QGNvZGUgb3JpZ2luYWx9IG5vIGxvbmdlciBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50LgorCSAqIAorCSAqIEBwYXJhbSBvcmlnaW5hbAorCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIGl0ZXJhdG9yLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbgorCSAqICAgICAgICAgICAgdGhlIHRyYW5zZm9ybWF0aW9uLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCBwcm92aWRlcyB0aGUgcmVzdWx0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbi4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxULCBSPiBJdGVyYXRvcjxSPiBtYXAoSXRlcmF0b3I8VD4gb3JpZ2luYWwsIEZ1bmN0aW9uMTw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPiB0cmFuc2Zvcm1hdGlvbikgeworCQlyZXR1cm4gSXRlcmF0b3JzLnRyYW5zZm9ybShvcmlnaW5hbCwgbmV3IEZ1bmN0aW9uRGVsZWdhdGU8VCwgUj4odHJhbnNmb3JtYXRpb24pKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgcGVyZm9ybXMgdGhlIGdpdmVuIHtAY29kZSB0cmFuc2Zvcm1hdGlvbn0gZm9yIGVhY2ggZWxlbWVudCBvZiB7QGNvZGUgb3JpZ2luYWx9IHdoZW4KKwkgKiByZXF1ZXN0ZWQuIFRoZSBtYXBwaW5nIGlzIGRvbmUgbGF6aWx5LiBUaGF0IGlzLCBzdWJzZXF1ZW50IGl0ZXJhdGlvbnMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBpdGVyYWJsZSB3aWxsCisJICogcmVwZWF0ZWRseSBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24uCisJICogPHA+CisJICogVGhlIHRyYW5zZm9ybWF0aW9uIG1hcHMgZWFjaCBlbGVtZW50IHRvIGFuIGl0ZXJhYmxlLCBhbmQgYWxsIHJlc3VsdGluZyBpdGVyYWJsZXMgYXJlIGNvbWJpbmVkIHRvIGEgc2luZ2xlIGl0ZXJhYmxlLgorCSAqIEVmZmVjdGl2ZWx5IGEgY29tYmluYXRpb24gb2Yge0BsaW5rICNtYXAoSXRlcmF0b3IsIEZ1bmN0aW9ucy5GdW5jdGlvbjEpfSBhbmQge0BsaW5rICNmbGF0dGVuKEl0ZXJhdG9yKX0gaXMgcGVyZm9ybWVkLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgcmV0dXJuZWQgaXRlcmFibGUncyBpdGVyYXRvciA8aT5kb2VzIG5vdCBzdXBwb3J0IHtAY29kZSByZW1vdmUoKX08L2k+IGluIGNvbnRyYXN0IHRvIHtAbGluayAjbWFwKEl0ZXJhdG9yLCBGdW5jdGlvbnMuRnVuY3Rpb24xKX0uCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBvcmlnaW5hbAorCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIGl0ZXJhYmxlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbgorCSAqICAgICAgICAgICAgdGhlIHRyYW5zZm9ybWF0aW9uLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBtdXN0IG5vdCB5aWVsZCA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGFuIGl0ZXJhYmxlIHRoYXQgcHJvdmlkZXMgdGhlIHJlc3VsdCBvZiB0aGUgdHJhbnNmb3JtYXRpb24uIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIAorCSAqIEBzaW5jZSAyLjEzCisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxULCBSPiBJdGVyYXRvcjxSPiBmbGF0TWFwKEl0ZXJhdG9yPFQ+IG9yaWdpbmFsLCBGdW5jdGlvbjE8PyBzdXBlciBULCA/IGV4dGVuZHMgSXRlcmF0b3I8Uj4+IHRyYW5zZm9ybWF0aW9uKSB7CisJCXJldHVybiBmbGF0dGVuKG1hcChvcmlnaW5hbCwgdHJhbnNmb3JtYXRpb24pKTsKKwl9CisKKworCS8qKgorCSAqIENvbWJpbmVzIG11bHRpcGxlIGl0ZXJhdG9ycyBpbnRvIGEgc2luZ2xlIGl0ZXJhdG9yLiBUaGUgcmV0dXJuZWQgaXRlcmF0b3IgdHJhdmVyc2VzIHRoZQorCSAqIGVsZW1lbnRzIG9mIGVhY2ggaXRlcmF0b3IgaW4ge0Bjb2RlIGlucHV0c30uIFRoZSBpbnB1dCBpdGVyYXRvcnMgYXJlIG5vdCBwb2xsZWQgdW50aWwgbmVjZXNzYXJ5LgorCSAqIAorCSAqIEBwYXJhbSBpbnB1dHMKKwkgKiAgICAgICAgICAgIHRoZSB0byBiZSBmbGF0dGVuZWQgaXRlcmF0b3JzLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCBwcm92aWRlcyB0aGUgY29uY2F0ZW5hdGVkIHZhbHVlcyBvZiB0aGUgaW5wdXQgZWxlbWVudHMuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIAorCSAqIEBzaW5jZSAyLjEzCisJICovCisJQElubGluZSh2YWx1ZT0iJDIuJDNjb25jYXQoJDEpIiwgaW1wb3J0ZWQ9SXRlcmF0b3JzLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhdG9yPFQ+IGZsYXR0ZW4oSXRlcmF0b3I8PyBleHRlbmRzIEl0ZXJhdG9yPD8gZXh0ZW5kcyBUPj4gaW5wdXRzKSB7CisJCXJldHVybiBJdGVyYXRvcnMuY29uY2F0KGlucHV0cyk7CisJfQorCisJLyoqCisJICogQXBwbGllcyB7QGNvZGUgcHJvY2VkdXJlfSBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBnaXZlbiBpdGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBpdGVyYXRvci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcHJvY2VkdXJlCisJICogICAgICAgICAgICB0aGUgcHJvY2VkdXJlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgZm9yRWFjaChJdGVyYXRvcjxUPiBpdGVyYXRvciwgUHJvY2VkdXJlMTw/IHN1cGVyIFQ+IHByb2NlZHVyZSkgeworCQlpZiAocHJvY2VkdXJlID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInByb2NlZHVyZSIpOworCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCXByb2NlZHVyZS5hcHBseShpdGVyYXRvci5uZXh0KCkpOworCQl9CisJfQorCQorCS8qKgorCSAqIEFwcGxpZXMge0Bjb2RlIHByb2NlZHVyZX0gZm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgZ2l2ZW4gaXRlcmF0b3IuCisJICogVGhlIHByb2NlZHVyZSB0YWtlcyB0aGUgZWxlbWVudCBhbmQgYSBsb29wIGNvdW50ZXIuIElmIHRoZSBjb3VudGVyIHdvdWxkIG92ZXJmbG93LCB7QGxpbmsgSW50ZWdlciNNQVhfVkFMVUV9CisJICogaXMgcmV0dXJuZWQgZm9yIGFsbCBzdWJzZXF1ZW50IGVsZW1lbnRzLiBUaGUgZmlyc3QgZWxlbWVudCBpcyBhdCBpbmRleCB6ZXJvLgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYXRvcgorCSAqICAgICAgICAgICAgdGhlIGl0ZXJhdG9yLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBwcm9jZWR1cmUKKwkgKiAgICAgICAgICAgIHRoZSBwcm9jZWR1cmUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gdm9pZCBmb3JFYWNoKEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yLCBQcm9jZWR1cmUyPD8gc3VwZXIgVCwgPyBzdXBlciBJbnRlZ2VyPiBwcm9jZWR1cmUpIHsKKwkJaWYgKHByb2NlZHVyZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwcm9jZWR1cmUiKTsKKwkJaW50IGkgPSAwOworCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCXByb2NlZHVyZS5hcHBseShpdGVyYXRvci5uZXh0KCksIGkpOworCQkJaWYgKGkgIT0gSW50ZWdlci5NQVhfVkFMVUUpCisJCQkJaSsrOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGl0ZXJhdG9yLiBObyBkZWxpbWl0ZXIgaXMgdXNlZC4KKwkgKiBUaGUgZ2l2ZW4gaXRlcmF0b3IgaXMgbGVmdCBleGhhdXN0ZWQuCisJICogCisJICogQHBhcmFtIGl0ZXJhdG9yCisJICogICAgICAgICAgICB0aGUgaXRlcmF0b3IuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpdGVyYXRvcidzIGVsZW1lbnRzLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAc2VlICNqb2luKEl0ZXJhdG9yLCBDaGFyU2VxdWVuY2UsIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5GdW5jdGlvbnMuRnVuY3Rpb24xKQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvaW4oSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKKwkJcmV0dXJuIGpvaW4oaXRlcmF0b3IsICIiKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb25jYXRlbmF0ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gaXRlcmF0b3IuIFRoZSB7QGNvZGUgc2VwYXJhdG9yfSBpcworCSAqIHVzZWQgdG8gYmV0d2VlbiBlYWNoIHBhaXIgb2YgZW50cmllcyBpbiB0aGUgaW5wdXQuIFRoZSBzdHJpbmcgPGNvZGU+bnVsbDwvY29kZT4gaXMgdXNlZCBmb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBlbnRyaWVzIGluIHRoZSBpbnB1dC4gVGhlIGdpdmVuIGl0ZXJhdG9yIGlzIGxlZnQgZXhoYXVzdGVkLgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYXRvcgorCSAqICAgICAgICAgICAgdGhlIGl0ZXJhdG9yLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBzZXBhcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBzZXBhcmF0b3IuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpdGVyYXRvcidzIGVsZW1lbnRzLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAc2VlICNqb2luKEl0ZXJhdG9yLCBDaGFyU2VxdWVuY2UsIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5GdW5jdGlvbnMuRnVuY3Rpb24xKQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvaW4oSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIENoYXJTZXF1ZW5jZSBzZXBhcmF0b3IpIHsKKwkJcmV0dXJuIEpvaW5lci5vbihzZXBhcmF0b3IudG9TdHJpbmcoKSkudXNlRm9yTnVsbCgibnVsbCIpLmpvaW4odG9JdGVyYWJsZShpdGVyYXRvcikpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBpdGVyYXRvci4gVGhlIHtAY29kZSBmdW5jdGlvbn0gaXMKKwkgKiB1c2VkIHRvIGNvbXB1dGUgdGhlIHN0cmluZyBmb3IgZWFjaCBlbGVtZW50LiBUaGUge0Bjb2RlIHNlcGFyYXRvcn0gaXMgdXNlZCB0byBiZXR3ZWVuIGVhY2ggcGFpciBvZiBlbnRyaWVzIGluIHRoZQorCSAqIGlucHV0LiBUaGUgc3RyaW5nIDxjb2RlPm51bGw8L2NvZGU+IGlzIHVzZWQgaWYgdGhlIGZ1bmN0aW9uIHlpZWxkcyA8Y29kZT5udWxsPC9jb2RlPiBhcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisJICogZm9yIGFuIGVudHJ5LiBUaGUgZ2l2ZW4gaXRlcmF0b3IgaXMgbGVmdCBleGhhdXN0ZWQuCisJICogCisJICogQHBhcmFtIGl0ZXJhdG9yCisJICogICAgICAgICAgICB0aGUgaXRlcmF0b3IuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHNlcGFyYXRvcgorCSAqICAgICAgICAgICAgdGhlIHNlcGFyYXRvci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gZnVuY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGVsZW1lbnQuIE1heSBub3QgYmUKKwkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaXRlcmF0b3IncyBlbGVtZW50cy4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gU3RyaW5nIGpvaW4oSXRlcmF0b3I8VD4gaXRlcmF0b3IsIENoYXJTZXF1ZW5jZSBzZXBhcmF0b3IsCisJCQlGdW5jdGlvbnMuRnVuY3Rpb24xPD8gc3VwZXIgVCwgPyBleHRlbmRzIENoYXJTZXF1ZW5jZT4gZnVuY3Rpb24pIHsKKwkJaWYgKHNlcGFyYXRvciA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJzZXBhcmF0b3IiKTsKKwkJaWYgKGZ1bmN0aW9uID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZ1bmN0aW9uIik7CisJCVN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJVCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOworCQkJQ2hhclNlcXVlbmNlIGVsZW1lbnRUb1N0cmluZyA9IGZ1bmN0aW9uLmFwcGx5KG5leHQpOworCQkJcmVzdWx0LmFwcGVuZChlbGVtZW50VG9TdHJpbmcpOworCQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkKKwkJCQlyZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7CisJCX0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb25jYXRlbmF0ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gaXRlcmF0b3IuIFRoZSB7QGNvZGUgZnVuY3Rpb259IGlzCisJICogdXNlZCB0byBjb21wdXRlIHRoZSBzdHJpbmcgZm9yIGVhY2ggZWxlbWVudC4gVGhlIHtAY29kZSBzZXBhcmF0b3J9IGlzIHVzZWQgdG8gYmV0d2VlbiBlYWNoIHBhaXIgb2YgZW50cmllcyBpbiB0aGUKKwkgKiBpbnB1dC4gVGhlIHN0cmluZyA8Y29kZT5udWxsPC9jb2RlPiBpcyB1c2VkIGlmIHRoZSBmdW5jdGlvbiB5aWVsZHMgPGNvZGU+bnVsbDwvY29kZT4gYXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbgorCSAqIGZvciBhbiBlbnRyeS4gVGhlIGdpdmVuIGl0ZXJhdG9yIGlzIGxlZnQgZXhoYXVzdGVkLgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYXRvcgorCSAqICAgICAgICAgICAgdGhlIGl0ZXJhdG9yLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBiZWZvcmUKKwkgKiAgICAgICAgICAgIHByZXBlbmRzIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlmIHRoZSBpdGVyYXRvciBjb250YWlucyBhdCBsZWFzdCBvbmUgZWxlbWVudC4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gcGFzc2luZyBhbiBlbXB0eSBzdHJpbmcuCisJICogQHBhcmFtIHNlcGFyYXRvcgorCSAqICAgICAgICAgICAgdGhlIHNlcGFyYXRvci4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gcGFzc2luZyBhbiBlbXB0eSBzdHJpbmcuCisJICogQHBhcmFtIGFmdGVyCisJICogICAgICAgICAgICBhcHBlbmRlZCB0byB0aGUgcmVzdWx0aW5nIHN0cmluZyBpZiB0aGUgaXRlcmF0b3IgY29udGFpbiBhdCBsZWFzdCBvbmUgZWxlbWVudC4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gcGFzc2luZyBhbiBlbXB0eSBzdHJpbmcuCisJICogQHBhcmFtIGZ1bmN0aW9uCisJICogICAgICAgICAgICB0aGUgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBlbGVtZW50LiBNYXkgbm90IGJlCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGl0ZXJhdG9yJ3MgZWxlbWVudHMuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IFN0cmluZyBqb2luKEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yLCBDaGFyU2VxdWVuY2UgYmVmb3JlLCBDaGFyU2VxdWVuY2Ugc2VwYXJhdG9yLCBDaGFyU2VxdWVuY2UgYWZ0ZXIsCisJCQlGdW5jdGlvbnMuRnVuY3Rpb24xPD8gc3VwZXIgVCwgPyBleHRlbmRzIENoYXJTZXF1ZW5jZT4gZnVuY3Rpb24pIHsKKwkJaWYgKGZ1bmN0aW9uID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZ1bmN0aW9uIik7CisJCVN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJYm9vbGVhbiBub3RFbXB0eSA9IGl0ZXJhdG9yLmhhc05leHQoKTsgCisJCWlmIChub3RFbXB0eSAmJiBiZWZvcmUgIT0gbnVsbCkKKwkJCXJlc3VsdC5hcHBlbmQoYmVmb3JlKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJVCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOworCQkJQ2hhclNlcXVlbmNlIGVsZW1lbnRUb1N0cmluZyA9IGZ1bmN0aW9uLmFwcGx5KG5leHQpOworCQkJcmVzdWx0LmFwcGVuZChlbGVtZW50VG9TdHJpbmcpOworCQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSAmJiBzZXBhcmF0b3IgIT0gbnVsbCkKKwkJCQlyZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7CisJCX0KKwkJaWYgKG5vdEVtcHR5ICYmIGFmdGVyICE9IG51bGwpCisJCQlyZXN1bHQuYXBwZW5kKGFmdGVyKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIERldGVybWluZXMgd2hldGhlciB0d28gaXRlcmF0b3JzIGNvbnRhaW4gZXF1YWwgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGlzIG1ldGhvZCByZXR1cm5zCisJICoge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBpdGVyYXRvcn0gYW5kIHtAY29kZSBvdGhlcn0gY29udGFpbiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMgYW5kIGV2ZXJ5IGVsZW1lbnQgb2YKKwkgKiB7QGNvZGUgaXRlcmF0b3J9IGlzIGVxdWFsIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2Yge0Bjb2RlIG90aGVyfS4KKwkgKiAKKwkgKiA8cD5Ob3RlIHRoYXQgdGhpcyB3aWxsIGFkdmFuY2Ugb3IgZXZlbiBleGhhdXN0IHRoZSBnaXZlbiBpdGVyYXRvcnMuPC9wPgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYXRvcgorCSAqICAgICAgICAgICAgYW4gaXRlcmF0b3IuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIG90aGVyCisJICogICAgICAgICAgICBhbiBpdGVyYXRvci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0d28gaXRlcmF0b3JzIGNvbnRhaW4gZXF1YWwgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGVsZW1lbnRzRXF1YWwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIEl0ZXJhdG9yPD8+IG90aGVyKSB7CisJCXJldHVybiBJdGVyYXRvcnMuZWxlbWVudHNFcXVhbChpdGVyYXRvciwgb3RoZXIpOworCX0KKwkKKwkvKioKKwkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIGl0ZXJhdG9ycyBjb250YWluIGVxdWFsIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLiBNb3JlIHNwZWNpZmljYWxseSwgdGhpcyBtZXRob2QgcmV0dXJucworCSAqIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgaXRlcmF0b3J9IGFuZCB7QGNvZGUgaXRlcmFibGV9IGNvbnRhaW4gdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzIGFuZCBldmVyeSBlbGVtZW50IG9mCisJICoge0Bjb2RlIGl0ZXJhdG9yfSBpcyBlcXVhbCB0byB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHtAY29kZSBpdGVyYWJsZX0uCisJICogCisJICogPHA+Tm90ZSB0aGF0IHRoaXMgd2lsbCBhZHZhbmNlIG9yIGV2ZW4gZXhoYXVzdCB0aGUgZ2l2ZW4gaXRlcmF0b3JzLjwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmF0b3IKKwkgKiAgICAgICAgICAgIGFuIGl0ZXJhdG9yLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBpdGVyYWJsZQorCSAqICAgICAgICAgICAgYW4gaXRlcmFibGUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdHdvIGl0ZXJhdG9ycyBjb250YWluIGVxdWFsIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0VxdWFsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgeworCQlyZXR1cm4gSXRlcmF0b3JzLmVsZW1lbnRzRXF1YWwoaXRlcmF0b3IsIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOworCX0KKworCS8qKgorCSAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGl0ZXJhdG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGNvbnRhaW5zIG5vIGVsZW1lbnRzLgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYXRvcgorCSAqICAgICAgICAgICAgdGhlIHRvLWJlLXF1ZXJpZWQgaXRlcmF0b3IuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgaXRlcmF0b3IgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgbm8gZWxlbWVudHMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOdWxsT3JFbXB0eShJdGVyYXRvcjw/PiBpdGVyYXRvcikgeworCQlyZXR1cm4gaXRlcmF0b3IgPT0gbnVsbCB8fCBpc0VtcHR5KGl0ZXJhdG9yKTsKKwl9CisKKwkvKioKKwkgKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBpdGVyYXRvciBjb250YWlucyBubyBlbGVtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSB0by1iZS1xdWVyaWVkIGl0ZXJhdG9yLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBpdGVyYXRvciBjb250YWlucyBubyBlbGVtZW50cworCSAqIEBzZWUgI2lzTnVsbE9yRW1wdHkoSXRlcmF0b3IpCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKKwkJcmV0dXJuICFpdGVyYXRvci5oYXNOZXh0KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHtAY29kZSBpdGVyYXRvcn0uCisJICogVGhlIGdpdmVuIGl0ZXJhdG9yIGlzIGxlZnQgZXhoYXVzdGVkLgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYXRvcgorCSAqICAgICAgICAgICAgdGhlIGl0ZXJhdG9yLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB7QGNvZGUgaXRlcmF0b3J9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IHNpemUoSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKKwkJcmV0dXJuIEl0ZXJhdG9ycy5zaXplKGl0ZXJhdG9yKTsKKwl9CisKKwkvKioKKwkgKiA8cD4KKwkgKiBBcHBsaWVzIHRoZSBjb21iaW5hdG9yIHtAY29kZSBmdW5jdGlvbn0gdG8gYWxsIGVsZW1lbnRzIG9mIHRoZSBpdGVyYXRvciBpbiB0dXJuLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBPbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgYW4gZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IsIGFuZCB0aGUgb3RoZXIgaXMgdGhlIHJlc3VsdCBvZiBwcmV2aW91cyBhcHBsaWNhdGlvbgorCSAqIG9mIHRoZSBmdW5jdGlvbi4gVGhlIHNlZWQgb2YgdGhlIG9wZXJhdGlvbiBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBzZWNvbmQgdmFsdWUgaXMgY29tcHV0ZWQgYnkKKwkgKiBhcHBseWluZyB0aGUgZnVuY3Rpb24gdG8gdGhlIHNlZWQgdG9nZXRoZXIgd2l0aCB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yLiBUaGUgdGhpcmQgdmFsdWUgaXMgY29tcHV0ZWQKKwkgKiBmcm9tIHRoZSBwcmV2aW91cyByZXN1bHQgdG9nZXRoZXIgd2l0aCB0aGUgdGhpcmQgZWxlbWVudCBhbmQgc28gb24uIEluIG90aGVyIHdvcmRzLCB0aGUgcHJldmlvdXMgcmVzdWx0IG9mIGVhY2gKKwkgKiBzdGVwIGlzIHRha2VuIGFuZCBwYXNzZWQgdG9nZXRoZXIgd2l0aCB0aGUgbmV4dCBlbGVtZW50IHRvIHRoZSBjb21iaW5hdG9yIGZ1bmN0aW9uLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgaXRlcmF0b3IgaXMgZW1wdHksIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBNb3JlIGZvcm1hbGx5LCBnaXZlbiBhbiBpdGVyYXRvciB7QGNvZGUgW2EsIGIsIGMsIGRdfSBhbmQgYSBmdW5jdGlvbiB7QGNvZGUgZn0sIHRoZSByZXN1bHQgb2Yge0Bjb2RlIHJlZHVjZX0gaXMKKwkgKiA8Y29kZT5mKGYoZihhLCBiKSwgYyksIGQpPC9jb2RlPgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSB0by1iZS1yZWR1Y2VkIGl0ZXJhdG9yLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBmdW5jdGlvbgorCSAqICAgICAgICAgICAgdGhlIGNvbWJpbmF0b3IgZnVuY3Rpb24uIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgbGFzdCByZXN1bHQgb2YgdGhlIGFwcGxpZWQgY29tYmluYXRvciBmdW5jdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgdGhlIGVtcHR5IGlucHV0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IFQgcmVkdWNlKEl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBpdGVyYXRvciwgRnVuY3Rpb24yPD8gc3VwZXIgVCwgPyBzdXBlciBULCA/IGV4dGVuZHMgVD4gZnVuY3Rpb24pIHsKKwkJaWYgKGZ1bmN0aW9uID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZ1bmN0aW9uIik7CisJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVQgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCXJlc3VsdCA9IGZ1bmN0aW9uLmFwcGx5KHJlc3VsdCwgaXRlcmF0b3IubmV4dCgpKTsKKwkJCX0KKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIDxwPgorCSAqIEFwcGxpZXMgdGhlIGNvbWJpbmF0b3Ige0Bjb2RlIGZ1bmN0aW9ufSB0byBhbGwgZWxlbWVudHMgb2YgdGhlIGl0ZXJhdG9yIGluIHR1cm4gYW5kIHVzZXMge0Bjb2RlIHNlZWR9IGFzIHRoZQorCSAqIHN0YXJ0IHZhbHVlLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBPbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgYW4gZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IsIGFuZCB0aGUgb3RoZXIgaXMgdGhlIHJlc3VsdCBvZiBwcmV2aW91cyBhcHBsaWNhdGlvbgorCSAqIG9mIHRoZSBmdW5jdGlvbi4gVGhlIHNlZWQgb2YgdGhlIG9wZXJhdGlvbiBpcyBleHBsaWNpdGx5IHBhc3NlZCB0byB7QGxpbmsgI2ZvbGQoSXRlcmF0b3IsIE9iamVjdCwgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjIpCisJICogZm9sZH0uIFRoZSBmaXJzdCBjb21wdXRlZCB2YWx1ZSBpcyB0aGUgcmVzdWx0IG9mIHRoZSBhcHBsaWVkIGZ1bmN0aW9uIGZvciB7QGNvZGUgc2VlZH0gYW5kIHRoZSBmaXJzdCBlbGVtZW50IG9mCisJICogdGhlIGl0ZXJhdG9yLiBUaGlzIGludGVybWVkaWF0ZSByZXN1bHQgdG9nZXRoZXIgd2l0aCB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yIHByb2R1Y2VkIHRoZSBuZXh0IHJlc3VsdAorCSAqIGFuZCBzbyBvbi4KKwkgKiA8L3A+CisJICogPHA+CisJICoge0BsaW5rICNmb2xkKEl0ZXJhdG9yLCBPYmplY3QsIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5GdW5jdGlvbnMuRnVuY3Rpb24yKSBmb2xkfSBpcyBzaW1pbGFyIHRvIHtAbGluayAjcmVkdWNlKEl0ZXJhdG9yLCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMikgcmVkdWNlfSBidXQKKwkgKiBhbGxvd3MgYSB7QGNvZGUgc2VlZH0gdmFsdWUgYW5kIHRoZSBjb21iaW5hdG9yIHtAY29kZSBmdW5jdGlvbn0gbWF5IGJlIGFzeW1tZXRyaWMuIEl0IHRha2VzIHtAY29kZSBUIGFuZCBSfSBhbmQKKwkgKiByZXR1cm5zIHtAY29kZSBSfS4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgaXRlcmF0b3IgaXMgZW1wdHksIDxjb2RlPnNlZWQ8L2NvZGU+IGlzIHJldHVybmVkLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBNb3JlIGZvcm1hbGx5LCBnaXZlbiBhbiBpdGVyYXRvciB7QGNvZGUgW2EsIGIsIGMsIGRdfSwgYSBzZWVkIHtAY29kZSBpbml0aWFsfSBhbmQgYSBmdW5jdGlvbiB7QGNvZGUgZn0sIHRoZQorCSAqIHJlc3VsdCBvZiB7QGNvZGUgZm9sZH0gaXMgPGNvZGU+ZihmKGYoZihpbml0aWFsLCBhKSwgYiksIGMpLCBkKTwvY29kZT4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGl0ZXJhdG9yCisJICogICAgICAgICAgICB0aGUgdG8tYmUtZm9sZGVkIGl0ZXJhdG9yLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBzZWVkCisJICogICAgICAgICAgICB0aGUgaW5pdGlhbCB2YWx1ZS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBmdW5jdGlvbgorCSAqICAgICAgICAgICAgdGhlIGNvbWJpbmF0b3IgZnVuY3Rpb24uIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgbGFzdCByZXN1bHQgb2YgdGhlIGFwcGxpZWQgY29tYmluYXRvciBmdW5jdGlvbiBvciA8Y29kZT5zZWVkPC9jb2RlPiBmb3IgdGhlIGVtcHR5IGlucHV0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQsIFI+IFIgZm9sZChJdGVyYXRvcjxUPiBpdGVyYXRvciwgUiBzZWVkLCBGdW5jdGlvbjI8PyBzdXBlciBSLCA/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPiBmdW5jdGlvbikgeworCQlSIHJlc3VsdCA9IHNlZWQ7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCXJlc3VsdCA9IGZ1bmN0aW9uLmFwcGx5KHJlc3VsdCwgaXRlcmF0b3IubmV4dCgpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBsaXN0IHRoYXQgY29udGFpbnMgYWxsIHRoZSBlbnRyaWVzIG9mIHRoZSBnaXZlbiBpdGVyYXRvciBpbiB0aGUgc2FtZSBvcmRlci4gCisJICogCisJICogQHBhcmFtIGl0ZXJhdG9yCisJICogICAgICAgICAgICB0aGUgaXRlcmF0b3IuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhIGxpc3Qgd2l0aCB0aGUgc2FtZSBlbnRyaWVzIGFzIHRoZSBnaXZlbiBpdGVyYXRvci4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gTGlzdDxUPiB0b0xpc3QoSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGl0ZXJhdG9yKSB7CisJCXJldHVybiBMaXN0cy5uZXdBcnJheUxpc3QoaXRlcmF0b3IpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBzZXQgdGhhdCBjb250YWlucyBhbGwgdGhlIHVuaXF1ZSBlbnRyaWVzIG9mIHRoZSBnaXZlbiBpdGVyYXRvciBpbiB0aGUgb3JkZXIgb2YgdGhlaXIgYXBwZWFyYW5jZS4gCisJICogVGhlIHJlc3VsdCBzZXQgaXMgYSBjb3B5IG9mIHRoZSBpdGVyYXRvciB3aXRoIHN0YWJsZSBvcmRlci4KKwkgKiAKKwkgKiBAcGFyYW0gaXRlcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBpdGVyYXRvci4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGEgc2V0IHdpdGggdGhlIHVuaXF1ZSBlbnRyaWVzIG9mIHRoZSBnaXZlbiBpdGVyYXRvci4gTmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gU2V0PFQ+IHRvU2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBpdGVyYXRvcikgeworCQlyZXR1cm4gU2V0cy5uZXdMaW5rZWRIYXNoU2V0KHRvSXRlcmFibGUoaXRlcmF0b3IpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbWFwIGZvciB3aGljaCB0aGUge0BsaW5rIE1hcCN2YWx1ZXN9IGFyZSBjb21wdXRlZCBieSB0aGUgZ2l2ZW4gZnVuY3Rpb24sIGFuZCBlYWNoIGtleSBpcyBhbiBlbGVtZW50IGluCisJICogdGhlIGdpdmVuIHtAY29kZSBrZXlzfS4gSWYgdGhlIGl0ZXJhdG9yIGNvbnRhaW5zIGVxdWFsIGtleXMgbW9yZSB0aGFuIG9uY2UsIHRoZSBsYXN0IG9uZSB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGUKKwkgKiBtYXAuIFRoZSBtYXAgaXMgY29tcHV0ZWQgZWFnZXJseS4gVGhhdCBpcywgc3Vic2VxdWVudCBjaGFuZ2VzIGluIHRoZSBrZXlzIGFyZSBub3QgcmVmbGVjdGVkIGJ5IHRoZSBtYXAuCisJICogVGhlIGtleSBpdGVyYXRvciBpcyBsZWZ0IGV4aGF1c3RlZC4KKwkgKiAKKwkgKiBAcGFyYW0ga2V5cworCSAqICAgICAgICAgICAgdGhlIGtleXMgdG8gdXNlIHdoZW4gY29uc3RydWN0aW5nIHRoZSB7QGNvZGUgTWFwfS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gY29tcHV0ZVZhbHVlcworCSAqICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gcHJvZHVjZSB0aGUgdmFsdWVzIGZvciBlYWNoIGtleS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGEgbWFwIG1hcHBpbmcgZWFjaCBlbnRyeSBpbiB0aGUgZ2l2ZW4gaXRlcmF0b3IgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmVzdWx0IHdoZW4gZXZhbHVhdGluZyB0aGUgZnVuY3Rpb24KKwkgKiAgICAgICAgIHtAY29kZSBjb21wdXRlVmFsdWVzfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxLLCBWPiBNYXA8SywgVj4gdG9JbnZlcnRlZE1hcChJdGVyYXRvcjw/IGV4dGVuZHMgSz4ga2V5cywgRnVuY3Rpb24xPD8gc3VwZXIgSywgVj4gY29tcHV0ZVZhbHVlcykgeworCQlNYXA8SywgVj4gcmVzdWx0ID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7CisJCXdoaWxlKGtleXMuaGFzTmV4dCgpKSB7CisJCQlLIGsgPSBrZXlzLm5leHQoKTsKKwkJCXJlc3VsdC5wdXQoaywgY29tcHV0ZVZhbHVlcy5hcHBseShrKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbWFwIGZvciB3aGljaCB0aGUge0BsaW5rIE1hcCN2YWx1ZXN9IGFyZSB0aGUgZ2l2ZW4gZWxlbWVudHMgaW4gdGhlIGdpdmVuIG9yZGVyLCBhbmQgZWFjaCBrZXkgaXMgdGhlCisJICogcHJvZHVjdCBvZiBpbnZva2luZyBhIHN1cHBsaWVkIGZ1bmN0aW9uIHtAY29kZSBjb21wdXRlS2V5c30gb24gaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUuIElmIHRoZSBmdW5jdGlvbiBwcm9kdWNlcworCSAqIHRoZSBzYW1lIGtleSBmb3IgZGlmZmVyZW50IHZhbHVlcywgdGhlIGxhc3Qgb25lIHdpbGwgYmUgY29udGFpbmVkIGluIHRoZSBtYXAuIFRoZSB2YWx1ZSBpdGVyYXRvciBpcyBsZWZ0IGV4aGF1c3RlZC4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWVzCisJICogICAgICAgICAgICB0aGUgdmFsdWVzIHRvIHVzZSB3aGVuIGNvbnN0cnVjdGluZyB0aGUge0Bjb2RlIE1hcH0uIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGNvbXB1dGVLZXlzCisJICogICAgICAgICAgICB0aGUgZnVuY3Rpb24gdXNlZCB0byBwcm9kdWNlIHRoZSBrZXkgZm9yIGVhY2ggdmFsdWUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhIG1hcCBtYXBwaW5nIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZnVuY3Rpb24ge0Bjb2RlIGtleUZ1bmN0aW9ufSBvbiBlYWNoIHZhbHVlIGluIHRoZSBpbnB1dAorCSAqICAgICAgICAgaXRlcmF0b3IgdG8gdGhhdCB2YWx1ZQorCSAqLworCXB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLCBWPiB0b01hcChJdGVyYXRvcjw/IGV4dGVuZHMgVj4gdmFsdWVzLCBGdW5jdGlvbjE8PyBzdXBlciBWLCBLPiBjb21wdXRlS2V5cykgeworCQlpZiAoY29tcHV0ZUtleXMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiY29tcHV0ZUtleXMiKTsKKwkJTWFwPEssIFY+IHJlc3VsdCA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworCQl3aGlsZSh2YWx1ZXMuaGFzTmV4dCgpKSB7CisJCQlWIHYgPSB2YWx1ZXMubmV4dCgpOworCQkJcmVzdWx0LnB1dChjb21wdXRlS2V5cy5hcHBseSh2KSwgdik7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyBhIG1hcCBmb3Igd2hpY2ggdGhlIHtAbGluayBNYXAjdmFsdWVzfSBhcmUgdGhlIHByb2R1Y3Qgb2YgaW52b2tpbmcgc3VwcGxpZWQgZnVuY3Rpb24ge0Bjb2RlIGNvbXB1dGVWYWx1ZXN9IAorCSAqIG9uIGlucHV0IGl0ZXJhYmxlIGVsZW1lbnRzLCBhbmQgZWFjaCBrZXkgaXMgdGhlIHByb2R1Y3Qgb2YgaW52b2tpbmcgYSBzdXBwbGllZCBmdW5jdGlvbiB7QGNvZGUgY29tcHV0ZUtleXN9IG9uIHNhbWUgZWxlbWVudHMuIAorCSAqIElmIHRoZSBmdW5jdGlvbiBwcm9kdWNlcyB0aGUgc2FtZSBrZXkgZm9yIGRpZmZlcmVudCB2YWx1ZXMsIHRoZSBsYXN0IG9uZSB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGUgbWFwLiBUaGUgaW5wdXQgaXRlcmF0b3IgaXMgbGVmdCBleGhhdXN0ZWQuCisJICogCisJICogQHBhcmFtIGlucHV0cworCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIHRvIHVzZSB3aGVuIGNvbnN0cnVjdGluZyB0aGUge0Bjb2RlIE1hcH0uIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGNvbXB1dGVLZXlzCisJICogICAgICAgICAgICB0aGUgZnVuY3Rpb24gdXNlZCB0byBwcm9kdWNlIHRoZSBrZXkgZm9yIGVhY2ggdmFsdWUuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGNvbXB1dGVWYWx1ZXMKKwkgKiAgICAgICAgICAgIHRoZSBmdW5jdGlvbiB1c2VkIHRvIHByb2R1Y2UgdGhlIHZhbHVlcyBmb3IgZWFjaCBrZXkuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhIG1hcCBtYXBwaW5nIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZnVuY3Rpb25zIHtAY29kZSBrZXlGdW5jdGlvbn0gYW5kIHtAY29kZSBjb21wdXRlVmFsdWVzfSBvbiBlYWNoIHZhbHVlIGluIHRoZSBpbnB1dAorCSAqICAgICAgICAgaXRlcmF0b3IgdG8gdGhhdCB2YWx1ZQorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQsIEssIFY+IE1hcDxLLCBWPiB0b01hcChJdGVyYXRvcjw/IGV4dGVuZHMgVD4gaW5wdXRzLCBGdW5jdGlvbjE8PyBzdXBlciBULCBLPiBjb21wdXRlS2V5cywgRnVuY3Rpb24xPD8gc3VwZXIgVCwgVj4gY29tcHV0ZVZhbHVlcykgeworICAgICAgICBpZiAoY29tcHV0ZUtleXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiY29tcHV0ZUtleXMiKTsKKyAgICAgICAgaWYgKGNvbXB1dGVWYWx1ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiY29tcHV0ZVZhbHVlcyIpOworICAgICAgICBNYXA8SywgVj4gcmVzdWx0ID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIHdoaWxlKGlucHV0cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFQgdCA9IGlucHV0cy5uZXh0KCk7CisgICAgICAgICAgICByZXN1bHQucHV0KGNvbXB1dGVLZXlzLmFwcGx5KHQpLCBjb21wdXRlVmFsdWVzLmFwcGx5KHQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwkKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm5zIGEgbWFwIGZvciB3aGljaCB0aGUge0BsaW5rIE1hcCN2YWx1ZXN9IGlzIGEgY29sbGVjdGlvbiBvZiBsaXN0cywgd2hlcmUgdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0IHdpbGwgCisJICogYXBwZWFyIGluIHRoZSBvcmRlciBhcyB0aGV5IGFwcGVhcmVkIGluIHRoZSBpdGVyYXRvci4gRWFjaCBrZXkgaXMgdGhlIHByb2R1Y3Qgb2YgaW52b2tpbmcgdGhlIHN1cHBsaWVkIAorCSAqIGZ1bmN0aW9uIHtAY29kZSBjb21wdXRlS2V5c30gb24gaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUuIFNvIGEga2V5IG9mIHRoYXQgbWFwIGdyb3VwcyBhIGxpc3Qgb2YgdmFsdWVzIGZvciAKKwkgKiB3aGljaCB0aGUgZnVuY3Rpb24gcHJvZHVjZWQgZXhhY3RseSB0aGF0IGtleS4gVGhlIHZhbHVlIGl0ZXJhdG9yIGlzIGxlZnQgZXhoYXVzdGVkLgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZXMKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZXMgdG8gdXNlIHdoZW4gY29uc3RydWN0aW5nIHRoZSB7QGNvZGUgTWFwfS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gY29tcHV0ZUtleXMKKwkgKiAgICAgICAgICAgIHRoZSBmdW5jdGlvbiB1c2VkIHRvIHByb2R1Y2UgdGhlIGtleSBmb3IgZWFjaCB2YWx1ZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGEgbWFwIG1hcHBpbmcgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBmdW5jdGlvbiB7QGNvZGUga2V5RnVuY3Rpb259IG9uIGVhY2ggdmFsdWUgaW4gdGhlIGlucHV0CisJICogICAgICAgICBpdGVyYXRvciB0byB0aGF0IHZhbHVlLiBBcyB0aGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSB2YWx1ZSBtYXBwZWQgYnkgYSBrZXksIHRoZSBtYXBwaW5nIHJlc3VsdCBpcyBpcyBhCisJICogICAgICAgICBsaXN0IG9mIHZhbHVlcy4KKwkgKiBAc2luY2UgMi43CisJICovCisJcHVibGljIHN0YXRpYyA8SywgVj4gTWFwPEssIExpc3Q8Vj4+IGdyb3VwQnkoSXRlcmF0b3I8PyBleHRlbmRzIFY+IHZhbHVlcywKKwkJCUZ1bmN0aW9uMTw/IHN1cGVyIFYsID8gZXh0ZW5kcyBLPiBjb21wdXRlS2V5cykgeworCQlpZiAoY29tcHV0ZUtleXMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiY29tcHV0ZUtleXMiKTsKKwkJTWFwPEssIExpc3Q8Vj4+IHJlc3VsdCA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworCQl3aGlsZSh2YWx1ZXMuaGFzTmV4dCgpKSB7CisJCQlWIHYgPSB2YWx1ZXMubmV4dCgpOworCQkJSyBrZXkgPSBjb21wdXRlS2V5cy5hcHBseSh2KTsKKwkJCUxpc3Q8Vj4gZ3JvdXBlZCA9IHJlc3VsdC5nZXQoa2V5KTsKKwkJCWlmIChncm91cGVkID09IG51bGwpIHsKKwkJCQlncm91cGVkID0gbmV3IEFycmF5TGlzdDxWPigpOworCQkJCXJlc3VsdC5wdXQoa2V5LCBncm91cGVkKTsKKwkJCX0KKwkJCWdyb3VwZWQuYWRkKHYpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQkKKworCS8qKgorCSAqIFJldHVybnMgYW4gSXRlcmF0b3IgY29udGFpbmluZyBhbGwgZWxlbWVudHMgc3RhcnRpbmcgZnJvbSB0aGUgaGVhZCBvZiB0aGUgc291cmNlIHVwIHRvIGFuZCBleGNsdWRpbmcgdGhlIGZpcnN0CisJICogZWxlbWVudCB0aGF0IHZpb2xhdGVzIHRoZSBwcmVkaWNhdGUuIFRoZSByZXN1bHRpbmcgSXRlcmF0b3IgaXMgYSBsYXppbHkgY29tcHV0ZWQgdmlldywgc28gYW55IG1vZGlmaWNhdGlvbnMgdG8gdGhlCisJICogdW5kZXJseWluZyBJdGVyYXRvcnMgd2lsbCBiZSByZWZsZWN0ZWQgb24gaXRlcmF0aW9uLiBUaGUgcmVzdWx0IGRvZXMgbm90IHN1cHBvcnQge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfQorCSAqIAorCSAqIEBwYXJhbSBpdGVyYXRvcgorCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIGZyb20gd2hpY2ggdG8gdGFrZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcHJlZGljYXRlCisJICogICAgICAgICAgICB0aGUgcHJlZGljYXRlIHdoaWNoIGRlY2lkZXMgd2hldGhlciB0byBrZWVwIHRha2luZyBlbGVtZW50cy4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHRoZSB0YWtlbiBlbGVtZW50cworCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiBJdGVyYXRvcjxUPiB0YWtlV2hpbGUoZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGl0ZXJhdG9yLCBmaW5hbCBGdW5jdGlvbjE8PyBzdXBlciBULCBCb29sZWFuPiBwcmVkaWNhdGUpIHsKKwkJaWYgKGl0ZXJhdG9yID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIml0ZXJhdG9yIik7CisJCWlmIChwcmVkaWNhdGUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicHJlZGljYXRlIik7CisJCXJldHVybiBuZXcgQWJzdHJhY3RJdGVyYXRvcjxUPigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFQgY29tcHV0ZU5leHQoKSB7CisJCQkJaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpCisJCQkJCXJldHVybiBlbmRPZkRhdGEoKTsKKwkJCQlUIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CisJCQkJaWYgKHByZWRpY2F0ZS5hcHBseShuZXh0KSkgeworCQkJCQlyZXR1cm4gbmV4dDsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gZW5kT2ZEYXRhKCk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gSXRlcmF0b3IgY29udGFpbmluZyBhbGwgZWxlbWVudHMgc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgZWxlbWVudCBmb3Igd2hpY2ggdGhlIGRyb3AtcHJlZGljYXRlIHJldHVybmVkCisJICogZmFsc2UuIFRoZSByZXN1bHRpbmcgSXRlcmF0b3IgaXMgYSBsYXppbHkgY29tcHV0ZWQgdmlldywgc28gYW55IG1vZGlmaWNhdGlvbnMgdG8gdGhlCisJICogdW5kZXJseWluZyBJdGVyYXRvcnMgd2lsbCBiZSByZWZsZWN0ZWQgb24gaXRlcmF0aW9uLiBUaGUgcmVzdWx0IGRvZXMgbm90IHN1cHBvcnQge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfQorCSAqIAorCSAqIEBwYXJhbSBpdGVyYXRvcgorCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIGZyb20gd2hpY2ggdG8gZHJvcC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcHJlZGljYXRlCisJICogICAgICAgICAgICB0aGUgcHJlZGljYXRlIHdoaWNoIGRlY2lkZXMgd2hldGhlciB0byBrZWVwIGRyb3BwaW5nIGVsZW1lbnRzLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIHJlbWFpbmluZyBlbGVtZW50cyBhZnRlciBkcm9wcGluZworCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiBJdGVyYXRvcjxUPiBkcm9wV2hpbGUoZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGl0ZXJhdG9yLCBmaW5hbCBGdW5jdGlvbjE8PyBzdXBlciBULCBCb29sZWFuPiBwcmVkaWNhdGUpIHsKKwkJaWYgKGl0ZXJhdG9yID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIml0ZXJhdG9yIik7CisJCWlmIChwcmVkaWNhdGUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicHJlZGljYXRlIik7CisJCXJldHVybiBuZXcgQWJzdHJhY3RJdGVyYXRvcjxUPigpIHsKKwkJCXByaXZhdGUgYm9vbGVhbiBoZWFkRm91bmQgPSBmYWxzZTsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgVCBjb21wdXRlTmV4dCgpIHsKKwkJCQl3aGlsZSAoIWhlYWRGb3VuZCkgeworCQkJCQlpZiAoIWl0ZXJhdG9yLmhhc05leHQoKSkKKwkJCQkJCXJldHVybiBlbmRPZkRhdGEoKTsKKwkJCQkJVCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOworCQkJCQlpZiAoIXByZWRpY2F0ZS5hcHBseShuZXh0KSkgeworCQkJCQkJaGVhZEZvdW5kID0gdHJ1ZTsKKwkJCQkJCXJldHVybiBuZXh0OworCQkJCQl9CisJCQkJfQorCQkJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gZW5kT2ZEYXRhKCk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gSXRlcmF0b3Igb2YgUGFpcnMgd2hlcmUgdGhlIG50aCBwYWlyIGlzIGNyZWF0ZWQgYnkgdGFraW5nIHRoZSBudGggZWxlbWVudCBvZiB0aGUgc291cmNlIGFzIHRoZSB2YWx1ZQorCSAqIGFuZCBpdHMgMC1iYXNlZCBpbmRleCBhcyB0aGUga2V5LiBFLmcuCisJICogPGNvZGU+emlwV2l0SW5kZXgoI1siYSIsICJiIiwgImMiXSkgPT0gI1soMCwgImEiKSwgKDEsICJiIiksICgyLCAiYyIpXTwvY29kZT4KKwkgKiAKKwkgKiBJZiB0aGUgaW5kZXggd291bGQgb3ZlcmZsb3csIHtAbGluayBJbnRlZ2VyI01BWF9WQUxVRX0gaXMgcmV0dXJuZWQgZm9yIGFsbCBzdWJzZXF1ZW50IGVsZW1lbnRzLgorCSAqIAorCSAqIFRoZSByZXN1bHRpbmcgSXRlcmF0b3IgaXMgYSBsYXppbHkgY29tcHV0ZWQgdmlldywgc28gYW55IG1vZGlmaWNhdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgSXRlcmF0b3Igd2lsbCBiZQorCSAqIHJlZmxlY3RlZCBvbiBpdGVyYXRpb24uIFRoZSByZXN1bHQgZG9lcyBub3Qgc3VwcG9ydCB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9CisJICogCisJICogQHBhcmFtIGl0ZXJhdG9yCisJICogICAgICAgICAgICB0aGUgZWxlbWVudHMuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgemlwcGVkIHJlc3VsdAorCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxBPiBJdGVyYXRvcjxQYWlyPEludGVnZXIsIEE+PiBpbmRleGVkKGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBBPiBpdGVyYXRvcikgeworCQlpZiAoaXRlcmF0b3IgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaXRlcmF0b3IiKTsKKwkJcmV0dXJuIG5ldyBBYnN0cmFjdEl0ZXJhdG9yPFBhaXI8SW50ZWdlciwgQT4+KCkgeworCQkJaW50IGkgPSAwOworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgUGFpcjxJbnRlZ2VyLCBBPiBjb21wdXRlTmV4dCgpIHsKKwkJCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCVBhaXI8SW50ZWdlciwgQT4gbmV4dCA9IG5ldyBQYWlyPEludGVnZXIsIEE+KGksIGl0ZXJhdG9yLm5leHQoKSk7CisJCQkJCWlmIChpICE9IEludGVnZXIuTUFYX1ZBTFVFKQorCQkJCQkJaSsrOworCQkJCQlyZXR1cm4gbmV4dDsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gZW5kT2ZEYXRhKCk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIEZpbmRzIHRoZSBtaW5pbXVtIG9mIHRoZSBnaXZlbiBlbGVtZW50cyBhY2NvcmRpbmcgdG8gdGhlaXIgbmF0dXJhbCBvcmRlcmluZy4gSWYgdGhlcmUgYXJlIHNldmVyYWwgbWltaW5hLCB0aGUKKwkgKiBmaXJzdCBvbmUgd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiA8cD5Ob3RlIHRoYXQgdGhpcyB3aWxsIGFkdmFuY2Ugb3IgZXZlbiBleGhhdXN0IHRoZSBnaXZlbiBpdGVyYXRvci48L3A+CisJICogCisJICogQHBhcmFtIGl0ZXJhdG9yCisJICogICAgICAgICAgICB0aGUgbXV0dWFsbHkgY29tcGFyYWJsZSBlbGVtZW50cy4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHRoZSBtaW5pbXVtCisJICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIGl0ZXJhdG9yIGlzIGVtcHR5CisJICogQHNpbmNlIDIuNworCSAqLworCXB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgVD4+IFQgbWluKGZpbmFsIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKSB7CisJCXJldHVybiBtaW4oaXRlcmF0b3IsIE9yZGVyaW5nLm5hdHVyYWwoKSk7CisJfQorCisJLyoqCisJICogRmluZHMgdGhlIGVsZW1lbnQgdGhhdCB5aWVsZHMgdGhlIG1pbmltdW0gdmFsdWUgd2hlbiBwYXNzZWQgdG8gPGNvZGU+Y29tcGFyZUJ5PC9jb2RlPi4gSWYgdGhlcmUgYXJlIHNldmVyYWwKKwkgKiBtYXhpbWEsIHRoZSBmaXJzdCBvbmUgd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiA8cD5Ob3RlIHRoYXQgdGhpcyB3aWxsIGFkdmFuY2Ugb3IgZXZlbiBleGhhdXN0IHRoZSBnaXZlbiBpdGVyYXRvci48L3A+CisJICogCisJICogQHBhcmFtIGl0ZXJhdG9yCisJICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gZmluZCB0aGUgbWluaW11bSBvZi4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gY29tcGFyZUJ5CisJICogICAgICAgICAgICBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNvbXBhcmFibGUgY2hhcmFjdGVyaXN0aWMgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMgYnkuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgbWluaW11bQorCSAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBpdGVyYXRvciBpcyBlbXB0eQorCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxULCBDIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEM+PiBUIG1pbkJ5KGZpbmFsIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yLCBmaW5hbCBGdW5jdGlvbjE8PyBzdXBlciBULCBDPiBjb21wYXJlQnkpIHsKKwkJaWYgKGNvbXBhcmVCeSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJjb21wYXJlQnkiKTsKKwkJcmV0dXJuIG1pbihpdGVyYXRvciwgbmV3IEtleUNvbXBhcmF0b3I8VCwgQz4oY29tcGFyZUJ5KSk7CisJfQorCQorCS8qKgorCSAqIEZpbmRzIHRoZSBtaW5pbm11bSBlbGVtZW50IGFjY29yZGluZyB0byA8Y29kZT5jb21wYXJhdG9yPC9jb2RlPi4gSWYgdGhlcmUgYXJlIHNldmVyYWwgbWluaW1hLCB0aGUgZmlyc3Qgb25lIHdpbGwKKwkgKiBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiA8cD5Ob3RlIHRoYXQgdGhpcyB3aWxsIGFkdmFuY2Ugb3IgZXZlbiBleGhhdXN0IHRoZSBnaXZlbiBpdGVyYXRvci48L3A+CisJICogCisJICogQHBhcmFtIGl0ZXJhdG9yCisJICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gZmluZCB0aGUgbWluaW11bSBvZi4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gY29tcGFyYXRvcgorCSAqICAgICAgICAgICAgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24uIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgbWluaW11bQorCSAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBpdGVyYXRvciBpcyBlbXB0eQorCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiBUIG1pbihmaW5hbCBJdGVyYXRvcjxUPiBpdGVyYXRvciwgQ29tcGFyYXRvcjw/IHN1cGVyIFQ+IGNvbXBhcmF0b3IpIHsKKwkJaWYgKGNvbXBhcmF0b3IgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiY29tcGFyYXRvciIpOworCQlUIG1pbiA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJVCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOworCQkJbWluID0gY29tcGFyYXRvci5jb21wYXJlKG1pbiwgZWxlbWVudCkgPD0gMCA/IG1pbiA6IGVsZW1lbnQ7CisJCX0KKwkJcmV0dXJuIG1pbjsKKwl9CisKKwkvKioKKwkgKiBGaW5kcyB0aGUgbWF4aW11bSBvZiB0aGUgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHRoZWlyIG5hdHVyYWwgb3JkZXJpbmcuIElmIHRoZXJlIGFyZSBzZXZlcmFsIG1heGltYSwgdGhlIGZpcnN0IG9uZQorCSAqIHdpbGwgYmUgcmV0dXJuZWQuCisJICogCisgICAgICogPHA+Tm90ZSB0aGF0IHRoaXMgd2lsbCBhZHZhbmNlIG9yIGV2ZW4gZXhoYXVzdCB0aGUgZ2l2ZW4gaXRlcmF0b3IuPC9wPgorICAgICAqIAorCSAqIEBwYXJhbSBpdGVyYXRvcgorCSAqICAgICAgICAgICAgdGhlIG11dHVhbGx5IGNvbXBhcmFibGUgZWxlbWVudHMuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgbWF4aW11bQorCSAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBpdGVyYXRvciBpcyBlbXB0eQorCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+PiBUIG1heChmaW5hbCBJdGVyYXRvcjxUPiBpdGVyYXRvcikgeworCQlyZXR1cm4gbWF4KGl0ZXJhdG9yLCBPcmRlcmluZy5uYXR1cmFsKCkpOworCX0KKworCS8qKgorCSAqIEZpbmRzIHRoZSBlbGVtZW50IHRoYXQgeWllbGRzIHRoZSBtYXhpbXVtIHZhbHVlIHdoZW4gcGFzc2VkIHRvIDxjb2RlPmNvbXBhcmVCeTwvY29kZT4gSWYgdGhlcmUgYXJlIHNldmVyYWwKKwkgKiBtYXhpbWEsIHRoZSBmaXJzdCBvbmUgd2lsbCBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiA8cD5Ob3RlIHRoYXQgdGhpcyB3aWxsIGFkdmFuY2Ugb3IgZXZlbiBleGhhdXN0IHRoZSBnaXZlbiBpdGVyYXRvci48L3A+CisJICogCisJICogQHBhcmFtIGl0ZXJhdG9yCisJICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gZmluZCB0aGUgbWF4aW11bSBvZi4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gY29tcGFyZUJ5CisJICogICAgICAgICAgICBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNvbXBhcmFibGUgY2hhcmFjdGVyaXN0aWMgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMgYnkuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgbWF4aW11bQorCSAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBpdGVyYXRvciBpcyBlbXB0eQorCSAqIEBzaW5jZSAyLjcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxULCBDIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEM+PiBUIG1heEJ5KGZpbmFsIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yLCBmaW5hbCBGdW5jdGlvbjE8PyBzdXBlciBULCBDPiBjb21wYXJlQnkpIHsKKwkJaWYgKGNvbXBhcmVCeSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJjb21wYXJlQnkiKTsKKwkJcmV0dXJuIG1heChpdGVyYXRvciwgbmV3IEtleUNvbXBhcmF0b3I8VCwgQz4oY29tcGFyZUJ5KSk7CisJfQorCisJLyoqCisJICogRmluZHMgdGhlIG1heGltdW0gZWxlbWVudCBhY2NvcmRpbmcgdG8gPGNvZGU+Y29tcGFyYXRvcjwvY29kZT4uIElmIHRoZXJlIGFyZSBzZXZlcmFsIG1heGltYSwgdGhlIGZpcnN0IG9uZSB3aWxsCisJICogYmUgcmV0dXJuZWQuCisJICogCisJICogPHA+Tm90ZSB0aGF0IHRoaXMgd2lsbCBhZHZhbmNlIG9yIGV2ZW4gZXhoYXVzdCB0aGUgZ2l2ZW4gaXRlcmF0b3IuPC9wPgorCSAqIAorCSAqIEBwYXJhbSBpdGVyYXRvcgorCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIHRvIGZpbmQgdGhlIG1heGltdW0gb2YuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGNvbXBhcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIG1heGltdW0KKwkgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgaXRlcmF0b3IgaXMgZW1wdHkKKwkgKiBAc2luY2UgMi43CisJICovCisJcHVibGljIHN0YXRpYyA8VD4gVCBtYXgoZmluYWwgSXRlcmF0b3I8VD4gaXRlcmF0b3IsIENvbXBhcmF0b3I8PyBzdXBlciBUPiBjb21wYXJhdG9yKSB7CisJCWlmIChjb21wYXJhdG9yID09IG51bGwpCisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImNvbXBhcmF0b3IiKTsKKwkJVCBtYXggPSBpdGVyYXRvci5uZXh0KCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVQgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCW1heCA9IGNvbXBhcmF0b3IuY29tcGFyZShtYXgsIGVsZW1lbnQpID49IDAgPyBtYXggOiBlbGVtZW50OworCQl9CisJCXJldHVybiBtYXg7CisJfQorCisJLyoqCisJICogUmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgSXRlcmF0b3IgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LgorCSAqIE1vcmUgZm9ybWFsbHksIHJldHVybnMgPHR0PnRydWU8L3R0PiBpZiBhbmQgb25seSBpZiB0aGlzIEl0ZXJhdG9yCisJICogY29udGFpbnMgYXQgbGVhc3Qgb25lIGVsZW1lbnQgPHR0PmU8L3R0PiBzdWNoIHRoYXQKKwkgKiA8dHQ+KG89PW51bGwmbmJzcDs/Jm5ic3A7ZT09bnVsbCZuYnNwOzombmJzcDtvLmVxdWFscyhlKSk8L3R0Pi4KKwkgKiAKKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhpcyB3aWxsIGFkdmFuY2Ugb3IgZXZlbiBleGhhdXN0IHRoZSBnaXZlbiBpdGVyYXRvci4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gaXRlcmF0b3IgCisJICogCQkJdGhlIGVsZW1lbnRzIHRvIHRlc3QKKwkgKiBAcGFyYW0gbyAKKwkgKiAJCQllbGVtZW50IHdob3NlIHByZXNlbmNlIGluIHRoaXMgSXRlcmF0b3IgaXMgdG8gYmUgdGVzdGVkCisJICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgSXRlcmF0b3IgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50CisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBPYmplY3QgbykgeworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlpZiAoT2JqZWN0cy5lcXVhbHMobywgaXRlcmF0b3IubmV4dCgpKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9MaWIuZ3d0LnhtbCBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0xpYi5nd3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjhlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9MaWIuZ3d0LnhtbApAQCAtMCwwICsxLDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgbW9kdWxlIFBVQkxJQyAiLS8vR29vZ2xlIEluYy4vL0RURCBHb29nbGUgV2ViIFRvb2xraXQgMi40LjAvL0VOIiAiaHR0cDovL2dvb2dsZS13ZWItdG9vbGtpdC5nb29nbGVjb2RlLmNvbS9zdm4vdGFncy8yLjQuMC9kaXN0cm8tc291cmNlL2NvcmUvc3JjL2d3dC1tb2R1bGUuZHRkIj4KKzxtb2R1bGU+CisJPGluaGVyaXRzIG5hbWU9ImNvbS5nb29nbGUuZ3d0LnVzZXIuVXNlciIgLz4KKwk8aW5oZXJpdHMgbmFtZT0iY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5Db2xsZWN0IiAvPgorCTxpbmhlcml0cyBuYW1lPSJvcmcuZWNsaXBzZS54dGVuZDIubGliLkxpYiIgLz4KKwk8c291cmNlIHBhdGg9IiIvPgorCTxzdXBlci1zb3VyY2UgcGF0aD0ic3VwZXIiLz4KKzwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL0xpc3RFeHRlbnNpb25zLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9MaXN0RXh0ZW5zaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMWZmM2IKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9MaXN0RXh0ZW5zaW9ucy5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5GdW5jdGlvbnMuRnVuY3Rpb24xOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5pbnRlcm5hbC5GdW5jdGlvbkRlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5pbnRlcm5hbC5LZXlDb21wYXJhdG9yOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCisvKioKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIGxpYnJhcnkgZm9yIHtAbGluayBMaXN0IGxpc3RzfS4KKyAqIAorICogQGF1dGhvciBTZWJhc3RpYW4gWmFybmVrb3cgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKi8KKy8qIFRvIGJlIGRpc2N1c3NlZDoKKyAqIExpc3QjYmluYXJ5U2VhcmNoKENvbXBhcmF0b3I8VD4pCisgKiBMaXN0I2JpbmFyeVNlYXJjaEJ5KFQtPkNvbXBhcmFibGU8Pz4pCisgKiBMaXN0I3JldmVyc2VWaWV3IHNob3VsZCByZXR1cm4gYSBsaXN0IGFuZCBub3QgYW4gaXRlcmFibGUKKyAqIExpc3QjdGFpbCAtPiBMaXN0CisgKiBMaXN0I3Rha2UgLT4gTGlzdAorICogTGlzdCNkcm9wIC0+IExpc3QKKyAqLworQEd3dENvbXBhdGlibGUgcHVibGljIGNsYXNzIExpc3RFeHRlbnNpb25zIHsKKworCS8qKgorCSAqIFNvcnRzIHRoZSBzcGVjaWZpZWQgbGlzdCBpdHNlbGYgaW50byBhc2NlbmRpbmcgb3JkZXIsIGFjY29yZGluZyB0byB0aGUgbmF0dXJhbCBvcmRlcmluZyBvZiBpdHMgZWxlbWVudHMuCisJICogCisJICogQHBhcmFtIGxpc3QKKwkgKiAgICAgICAgICAgIHRoZSBsaXN0IHRvIGJlIHNvcnRlZC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHRoZSBzb3J0ZWQgbGlzdCBpdHNlbGYuCisJICogQHNlZSBDb2xsZWN0aW9ucyNzb3J0KExpc3QpCisJICovCisJcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBUPj4gTGlzdDxUPiBzb3J0SW5wbGFjZShMaXN0PFQ+IGxpc3QpIHsKKwkJQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKKwkJcmV0dXJuIGxpc3Q7CisJfQorCisJLyoqCisJICogU29ydHMgdGhlIHNwZWNpZmllZCBsaXN0IGl0c2VsZiBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyIGluZHVjZWQgYnkgdGhlIHNwZWNpZmllZCBjb21wYXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBsaXN0CisJICogICAgICAgICAgICB0aGUgbGlzdCB0byBiZSBzb3J0ZWQuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGNvbXBhcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSBjb21wYXJhdG9yIHRvIGJlIHVzZWQuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBuYXR1cmFsIG9yZGVyaW5nIG9mIHRoZQorCSAqICAgICAgICAgICAgZWxlbWVudHMgc2hvdWxkIGJlIHVzZWQuCisJICogQHJldHVybiB0aGUgc29ydGVkIGxpc3QgaXRzZWxmLgorCSAqIEBzZWUgQ29sbGVjdGlvbnMjc29ydChMaXN0LCBDb21wYXJhdG9yKQorCSAqIEBzZWUgI3NvcnRJbnBsYWNlKExpc3QpCisJICogQHNlZSAjc29ydElucGxhY2VCeShMaXN0LCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMSkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiBMaXN0PFQ+IHNvcnRJbnBsYWNlKExpc3Q8VD4gbGlzdCwgQ29tcGFyYXRvcjw/IHN1cGVyIFQ+IGNvbXBhcmF0b3IpIHsKKwkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBjb21wYXJhdG9yKTsKKwkJcmV0dXJuIGxpc3Q7CisJfQorCisJLyoqCisJICogU29ydHMgdGhlIHNwZWNpZmllZCBsaXN0IGl0c2VsZiBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyIGluZHVjZWQgYnkgYXBwbHlpbmcgYSBrZXkgZnVuY3Rpb24gdG8gZWFjaCBlbGVtZW50IHdoaWNoCisJICogeWllbGRzIGEgY29tcGFyYWJsZSBjcml0ZXJpYS4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdAorCSAqICAgICAgICAgICAgdGhlIGxpc3QgdG8gYmUgc29ydGVkLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBrZXkKKwkgKiAgICAgICAgICAgIHRoZSBrZXkgZnVuY3Rpb24gdG8tYmUtdXNlZC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIHRoZSBzb3J0ZWQgbGlzdCBpdHNlbGYuCisJICogQHNlZSBDb2xsZWN0aW9ucyNzb3J0KExpc3QpCisJICovCisJcHVibGljIHN0YXRpYyA8VCwgQyBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBDPj4gTGlzdDxUPiBzb3J0SW5wbGFjZUJ5KExpc3Q8VD4gbGlzdCwKKwkJCWZpbmFsIEZ1bmN0aW9ucy5GdW5jdGlvbjE8PyBzdXBlciBULCBDPiBrZXkpIHsKKwkJaWYgKGtleSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJrZXkiKTsKKwkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBuZXcgS2V5Q29tcGFyYXRvcjxULCBDPihrZXkpKTsKKwkJcmV0dXJuIGxpc3Q7CisJfQorCisJLyoqCisJICogUHJvdmlkZXMgYSByZXZlcnNlIHZpZXcgb24gdGhlIGdpdmVuIGxpc3Qgd2hpY2ggaXMgZXNwZWNpYWxseSB1c2VmdWwgdG8gdHJhdmVyc2UgYSBsaXN0IGJhY2t3YXJkcyBpbiBhIGZvci1lYWNoCisJICogbG9vcC4gVGhlIGxpc3QgaXRzZWxmIGlzIG5vdCBtb2RpZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kLgorCSAqIAorCSAqIEBwYXJhbSBsaXN0CisJICogICAgICAgICAgICB0aGUgbGlzdCB3aG9zZSBlbGVtZW50cyBzaG91bGQgYmUgdHJhdmVyc2VkIGluIHJldmVyc2UuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhIGxpc3Qgd2l0aCB0aGUgc2FtZSBlbGVtZW50cyBhcyB0aGUgZ2l2ZW4gbGlzdCwgaW4gcmV2ZXJzZQorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8VD4gTGlzdDxUPiByZXZlcnNlVmlldyhMaXN0PFQ+IGxpc3QpIHsKKwkJcmV0dXJuIExpc3RzLnJldmVyc2UobGlzdCk7CisJfQorCisJLyoqCisJICogUmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGxpc3QuIFRoZSBsaXN0IGl0c2VsZiB3aWxsIGJlIG1vZGlmaWVkLgorCSAqIAorCSAqIEBwYXJhbSBsaXN0CisJICogICAgICAgICAgICB0aGUgbGlzdCB3aG9zZSBlbGVtZW50cyBhcmUgdG8gYmUgcmV2ZXJzZWQuCisJICogQHJldHVybiB0aGUgbGlzdCBpdHNlbGYKKwkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBsaXN0IG9yIGl0cyBsaXN0LWl0ZXJhdG9yIGRvZXMgbm90IHN1cHBvcnQgdGhlIDx0dD5zZXQ8L3R0PiBtZXRob2QuCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gTGlzdDxUPiByZXZlcnNlKExpc3Q8VD4gbGlzdCkgeworCQlDb2xsZWN0aW9ucy5yZXZlcnNlKGxpc3QpOworCQlyZXR1cm4gbGlzdDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbGlzdCB0aGF0IHBlcmZvcm1zIHRoZSBnaXZlbiB7QGNvZGUgdHJhbnNmb3JtYXRpb259IGZvciBlYWNoIGVsZW1lbnQgb2Yge0Bjb2RlIG9yaWdpbmFsfSB3aGVuCisJICogcmVxdWVzdGVkLiBUaGUgbWFwcGluZyBpcyBkb25lIGxhemlseS4gVGhhdCBpcywgc3Vic2VxdWVudCBpdGVyYXRpb25zIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgbGlzdCB3aWxsCisJICogcmVwZWF0ZWRseSBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24uIFRoZSByZXR1cm5lZCBsaXN0IGlzIGEgdHJhbnNmb3JtZWQgdmlldyBvZiB7QGNvZGUgb3JpZ2luYWx9OyBjaGFuZ2VzIHRvCisJICoge0Bjb2RlIG9yaWdpbmFsfSB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgcmV0dXJuZWQgbGlzdCBhbmQgdmljZSB2ZXJzYSAoZS5nLiBpbnZvY2F0aW9ucyBvZiB7QGxpbmsgTGlzdCNyZW1vdmUoaW50KX0pLgorCSAqIAorCSAqIAorCSAqIEBwYXJhbSBvcmlnaW5hbAorCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIGxpc3QuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uCisJICogICAgICAgICAgICB0aGUgdHJhbnNmb3JtYXRpb24uIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiBhIGxpc3QgdGhhdCBlZmZlY3RpdmVseSBjb250YWlucyB0aGUgcmVzdWx0cyBvZiB0aGUgdHJhbnNmb3JtYXRpb24uIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8VCwgUj4gTGlzdDxSPiBtYXAoTGlzdDxUPiBvcmlnaW5hbCwgRnVuY3Rpb24xPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+IHRyYW5zZm9ybWF0aW9uKSB7CisJCXJldHVybiBMaXN0cy50cmFuc2Zvcm0ob3JpZ2luYWwsIG5ldyBGdW5jdGlvbkRlbGVnYXRlPFQsIFI+KHRyYW5zZm9ybWF0aW9uKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9Mb25nRXh0ZW5zaW9ucy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvTG9uZ0V4dGVuc2lvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzI5MzM1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvTG9uZ0V4dGVuc2lvbnMuamF2YQpAQCAtMCwwICsxLDE2MzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKKworCisvKioKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIGxpYnJhcnkgZm9yIHtAbGluayBMb25nfSBudW1iZXJzLgorICogCisgKiBAYXV0aG9yIEphbiBLb2VobmxlaW4gLSBDb2RlIGdlbmVyYXRvcgorICogQHNpbmNlIDIuMworICovCitAR3d0Q29tcGF0aWJsZSBwdWJsaWMgY2xhc3MgTG9uZ0V4dGVuc2lvbnMgeworCQorCS8qKgorCSAqIFRoZSBiaXR3aXNlIGluY2x1c2l2ZSA8Y29kZT5vcjwvY29kZT4gb3BlcmF0aW9uLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBqYXZhIDxjb2RlPnw8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhIGxvbmcuCisJICogQHBhcmFtIGIKKwkgKiAgICAgICAgICAgIGEgbG9uZworCSAqIEByZXR1cm4gPGNvZGU+YXxiPC9jb2RlPgorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIHwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIGJpdHdpc2VPcihsb25nIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSB8IGI7CisJfQorCisJLyoqCisJICogVGhlIGJpdHdpc2UgZXhjbHVzaXZlIDxjb2RlPm9yPC9jb2RlPiBvcGVyYXRpb24uIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIGphdmEgPGNvZGU+XjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgYSBsb25nLgorCSAqIEByZXR1cm4gPGNvZGU+YV5iPC9jb2RlPgorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIF4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIGJpdHdpc2VYb3IobG9uZyBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgXiBiOworCX0KKworCS8qKgorCSAqIFRoZSBiaXR3aXNlIDxjb2RlPmFuZDwvY29kZT4gb3BlcmF0aW9uLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBqYXZhIDxjb2RlPiZhbXA7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgYSBsb25nLgorCSAqIEBwYXJhbSBiCisJICogICAgICAgICAgICBhIGxvbmcuCisJICogQHJldHVybiA8Y29kZT5hJmFtcDtiPC9jb2RlPgorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICYgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIGJpdHdpc2VBbmQobG9uZyBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgJiBiOworCX0KKworCS8qKgorCSAqIFRoZSBiaXR3aXNlIGNvbXBsZW1lbnQgb3BlcmF0aW9uLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBqYXZhIDxjb2RlPn48L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhIGxvbmcuCisJICogQHJldHVybiB0aGUgYml0d2lzZSBjb21wbGVtZW50IG9mIDxjb2RlPmE8L2NvZGU+LgorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKH4kMSkiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgYml0d2lzZU5vdChsb25nIGEpIHsKKwkJcmV0dXJuIH5hOworCX0KKworCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+c2lnbmVkIGxlZnQgc2hpZnQ8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBqYXZhIDxjb2RlPiZsdDsmbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiBGaWxscyBpbiBhIHplcm8gYXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4KKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgYSBsb25nLgorCSAqIEBwYXJhbSBkaXN0YW5jZSAKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gc2hpZnQuCisJICogQHJldHVybiA8Y29kZT5hJmx0OyZsdDtkaXN0YW5jZTwvY29kZT4KKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNvcGVyYXRvcl9kb3VibGVMZXNzVGhhbihsb25nLCBpbnQpfSBpbnN0ZWFkLgorCSAqLworCUBEZXByZWNhdGVkCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIHNoaWZ0TGVmdChsb25nIGEsIGludCBkaXN0YW5jZSkgeworCQlyZXR1cm4gYSA8PCBkaXN0YW5jZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnNpZ25lZCBsZWZ0IHNoaWZ0PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgamF2YSA8Y29kZT4mbHQ7Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogRmlsbHMgaW4gYSB6ZXJvIGFzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgbG9uZy4KKwkgKiBAcGFyYW0gZGlzdGFuY2UgCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIHNoaWZ0LgorCSAqIEByZXR1cm4gPGNvZGU+YSZsdDsmbHQ7ZGlzdGFuY2U8L2NvZGU+CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX2RvdWJsZUxlc3NUaGFuKGxvbmcgYSwgaW50IGRpc3RhbmNlKSB7CisJCXJldHVybiBhIDw8IGRpc3RhbmNlOworCX0KKworCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+c2lnbmVkIHJpZ2h0IHNpZnQ8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBqYXZhIDxjb2RlPiZndDsmZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiBTaGlmdHMgaW4gdGhlIHZhbHVlIG9mIHRoZSBzaWduIGJpdCBhcyB0aGUgbGVmdG1vc3QgYml0LCB0aHVzIHByZXNlcnZpbmcgdGhlIHNpZ24gb2YgdGhlIGluaXRpYWwgdmFsdWUuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgbG9uZy4KKwkgKiBAcGFyYW0gZGlzdGFuY2UgCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIHNoaWZ0LgorCSAqIEByZXR1cm4gPGNvZGU+YSZndDsmZ3Q7ZGlzdGFuY2U8L2NvZGU+CisJICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjb3BlcmF0b3JfZG91YmxlR3JlYXRlclRoYW4obG9uZywgaW50KX0gaW5zdGVhZC4KKwkgKi8KKwlARGVwcmVjYXRlZAorCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgbG9uZyBzaGlmdFJpZ2h0KGxvbmcgYSwgaW50IGRpc3RhbmNlKSB7CisJCXJldHVybiBhID4+IGRpc3RhbmNlOworCX0KKworCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+c2lnbmVkIHJpZ2h0IHNpZnQ8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBqYXZhIDxjb2RlPiZndDsmZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiBTaGlmdHMgaW4gdGhlIHZhbHVlIG9mIHRoZSBzaWduIGJpdCBhcyB0aGUgbGVmdG1vc3QgYml0LCB0aHVzIHByZXNlcnZpbmcgdGhlIHNpZ24gb2YgdGhlIGluaXRpYWwgdmFsdWUuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgbG9uZy4KKwkgKiBAcGFyYW0gZGlzdGFuY2UgCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIHNoaWZ0LgorCSAqIEByZXR1cm4gPGNvZGU+YSZndDsmZ3Q7ZGlzdGFuY2U8L2NvZGU+CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX2RvdWJsZUdyZWF0ZXJUaGFuKGxvbmcgYSwgaW50IGRpc3RhbmNlKSB7CisJCXJldHVybiBhID4+IGRpc3RhbmNlOworCX0KKworCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+dW5zaWduZWQgcmlnaHQgc2hpZnQ8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBqYXZhIDxjb2RlPiZndDsmZ3Q7Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogU2hpZnRzIGluIHplcm9zIGludG8gYXMgbGVmdG1vc3QgYml0cywgdGh1cyBhbHdheXMgeWllbGRpbmcgYSBwb3NpdGl2ZSBpbnRlZ2VyLgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhIGxvbmcuCisJICogQHBhcmFtIGRpc3RhbmNlCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIHNoaWZ0LgorCSAqIEByZXR1cm4gPGNvZGU+YSZndDsmZ3Q7Jmd0O2Rpc3RhbmNlPC9jb2RlPgorCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI29wZXJhdG9yX3RyaXBsZUdyZWF0ZXJUaGFuKGxvbmcsIGludCl9IGluc3RlYWQuCisJICovCisJQERlcHJlY2F0ZWQKKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+Pj4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIHNoaWZ0UmlnaHRVbnNpZ25lZChsb25nIGEsIGludCBkaXN0YW5jZSkgeworCQlyZXR1cm4gYSA+Pj4gZGlzdGFuY2U7CisJfQorCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT51bnNpZ25lZCByaWdodCBzaGlmdDwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIGphdmEgPGNvZGU+Jmd0OyZndDsmZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiBTaGlmdHMgaW4gemVyb3MgaW50byBhcyBsZWZ0bW9zdCBiaXRzLCB0aHVzIGFsd2F5cyB5aWVsZGluZyBhIHBvc2l0aXZlIGludGVnZXIuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgbG9uZy4KKwkgKiBAcGFyYW0gZGlzdGFuY2UKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gc2hpZnQuCisJICogQHJldHVybiA8Y29kZT5hJmd0OyZndDsmZ3Q7ZGlzdGFuY2U8L2NvZGU+CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj4+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgbG9uZyBvcGVyYXRvcl90cmlwbGVHcmVhdGVyVGhhbihsb25nIGEsIGludCBkaXN0YW5jZSkgeworCQlyZXR1cm4gYSA+Pj4gZGlzdGFuY2U7CisJfQorCisJLy8gQkVHSU4gZ2VuZXJhdGVkIGNvZGUKKwkvKioKKwkgKiBUaGUgdW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+LTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGwgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+LWw8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKC0kMSkiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfbWludXMobG9uZyBsKSB7CisJCXJldHVybiAtbDsKKwl9CisJCisJLyoqCisJICogVGhlIHBvc3RmaXggPGNvZGU+ZGVjcmVtZW50PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPi0tPC9jb2RlPiBwb3N0Zml4IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBsICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmwtLTwvY29kZT4KKwkgKiBAc2luY2UgMi42CisJICovCisJQElubGluZSh2YWx1ZT0iJDEtLSIpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX21pbnVzTWludXMobG9uZyBsKSB7CisJCXRocm93IG5ldyBIYXJkY29kZWRJbkludGVycHJldGVyRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIFRoZSBwb3N0Zml4IDxjb2RlPmRlY3JlbWVudDwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT4tLTwvY29kZT4gcG9zdGZpeCBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gbCAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5sLS08L2NvZGU+CisJICogQHNpbmNlIDIuNgorCSAqLworCUBJbmxpbmUodmFsdWU9IiQxLS0iKQorCXB1YmxpYyBzdGF0aWMgTG9uZyBvcGVyYXRvcl9taW51c01pbnVzKExvbmcgbCkgeworCQl0aHJvdyBuZXcgSGFyZGNvZGVkSW5JbnRlcnByZXRlckV4Y2VwdGlvbigpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgcG9zdGZpeCA8Y29kZT5pbmNyZW1lbnQ8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+Kys8L2NvZGU+IHBvc3RmaXggZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGwgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+bCsrPC9jb2RlPgorCSAqIEBzaW5jZSAyLjYKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMSsrIikKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfcGx1c1BsdXMobG9uZyBsKSB7CisJCXRocm93IG5ldyBIYXJkY29kZWRJbkludGVycHJldGVyRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIFRoZSBwb3N0Zml4IDxjb2RlPmluY3JlbWVudDwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT4rKzwvY29kZT4gcG9zdGZpeCBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gbCAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5sKys8L2NvZGU+CisJICogQHNpbmNlIDIuNgorCSAqLworCUBJbmxpbmUodmFsdWU9IiQxKysiKQorCXB1YmxpYyBzdGF0aWMgTG9uZyBvcGVyYXRvcl9wbHVzUGx1cyhMb25nIGwpIHsKKwkJdGhyb3cgbmV3IEhhcmRjb2RlZEluSW50ZXJwcmV0ZXJFeGNlcHRpb24oKTsKKwl9CisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wbHVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YStiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3BsdXMobG9uZyBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbWludXMobG9uZyBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbXVsdGlwbHkobG9uZyBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAqIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZGl2aWRlPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4vPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS9iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAvICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX2RpdmlkZShsb25nIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfbW9kdWxvKGxvbmcgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihsb25nIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhIDwgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4obG9uZyBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihsb25nIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4obG9uZyBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSA+PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+PT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKGxvbmcgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhsb25nIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihsb25nIGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBNYXRoLnBvdyhhLCBiKTsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPj09PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMobG9uZyBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMobG9uZyBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX3BsdXMobG9uZyBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbWludXMobG9uZyBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhIC0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tdWx0aXBseTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbXVsdGlwbHkobG9uZyBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGZsb2F0IG9wZXJhdG9yX2RpdmlkZShsb25nIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbW9kdWxvKGxvbmcgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAlIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4obG9uZyBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhIDwgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihsb25nIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgPD0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihsb25nIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgPiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKGxvbmcgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA+PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+PT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMobG9uZyBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bm90RXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4hPTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhsb25nIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wb3dlcjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT5NYXRoLnBvdygpPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIobG9uZyBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBNYXRoLnBvdyhhLCBiKTsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPj09PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhsb25nIGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IG5vdCBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT4hPTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMobG9uZyBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cGx1czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX3BsdXMobG9uZyBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfbWludXMobG9uZyBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgLSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm11bHRpcGx5PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfbXVsdGlwbHkobG9uZyBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgKiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmRpdmlkZTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX2RpdmlkZShsb25nIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmElYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfbW9kdWxvKGxvbmcgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhICUgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKGxvbmcgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhIDwgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGxvbmcgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihsb25nIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSA+IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlckVxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihsb25nIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSA+PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+PT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhsb25nIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhsb25nIGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPk1hdGgucG93KCk8L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKGxvbmcgYSwgbG9uZyBiKSB7CisJCXJldHVybiBNYXRoLnBvdyhhLCBiKTsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPj09PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGxvbmcgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMobG9uZyBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wbHVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX3BsdXMobG9uZyBhLCBpbnQgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfbWludXMobG9uZyBhLCBpbnQgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfbXVsdGlwbHkobG9uZyBhLCBpbnQgYikgeworCQlyZXR1cm4gYSAqIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZGl2aWRlPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4vPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX2RpdmlkZShsb25nIGEsIGludCBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmElYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfbW9kdWxvKGxvbmcgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKGxvbmcgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGxvbmcgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPD0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihsb25nIGEsIGludCBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihsb25nIGEsIGludCBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhsb25nIGEsIGludCBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bm90RXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4hPTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhsb25nIGEsIGludCBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKGxvbmcgYSwgaW50IGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGxvbmcgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IG5vdCBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT4hPTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMobG9uZyBhLCBpbnQgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX3BsdXMobG9uZyBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgbG9uZyBvcGVyYXRvcl9taW51cyhsb25nIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX211bHRpcGx5KGxvbmcgYSwgY2hhciBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX2RpdmlkZShsb25nIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgbG9uZyBvcGVyYXRvcl9tb2R1bG8obG9uZyBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihsb25nIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKGxvbmcgYSwgY2hhciBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKGxvbmcgYSwgY2hhciBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4obG9uZyBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhsb25nIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKGxvbmcgYSwgY2hhciBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihsb25nIGEsIGNoYXIgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKGxvbmcgYSwgY2hhciBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhsb25nIGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfcGx1cyhsb25nIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX21pbnVzKGxvbmcgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfbXVsdGlwbHkobG9uZyBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfZGl2aWRlKGxvbmcgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX21vZHVsbyhsb25nIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKGxvbmcgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4obG9uZyBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlclRoYW4obG9uZyBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihsb25nIGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKGxvbmcgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEhPWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ub3RFcXVhbHMobG9uZyBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKGxvbmcgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMobG9uZyBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSAhPSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlTm90RXF1YWxzKGxvbmcgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YStiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgbG9uZyBvcGVyYXRvcl9wbHVzKGxvbmcgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX21pbnVzKGxvbmcgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhIC0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tdWx0aXBseTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX211bHRpcGx5KGxvbmcgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS9iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAvICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgbG9uZyBvcGVyYXRvcl9kaXZpZGUobG9uZyBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX21vZHVsbyhsb25nIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSAlIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihsb25nIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihsb25nIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlclRoYW4obG9uZyBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgPiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgbG9uZy4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4obG9uZyBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMobG9uZyBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEhPWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ub3RFcXVhbHMobG9uZyBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wb3dlcjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT5NYXRoLnBvdygpPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihsb25nIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBsb25nLgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhsb25nIGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIGxvbmcuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSAhPSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlTm90RXF1YWxzKGxvbmcgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8vIEVORCBnZW5lcmF0ZWQgY29kZQorCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9NYXBFeHRlbnNpb25zLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9NYXBFeHRlbnNpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY4MDlkOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL01hcEV4dGVuc2lvbnMuamF2YQpAQCAtMCwwICsxLDQyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjE7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXMuUHJvY2VkdXJlMjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlcy5Qcm9jZWR1cmUzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5pbnRlcm5hbC5GdW5jdGlvbkRlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5pbnRlcm5hbC5Vbm1vZGlmaWFibGVNZXJnaW5nTWFwVmlldzsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKKworCisvKioKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIGxpYnJhcnkgZm9yIHtAbGluayBNYXAgbWFwc30uCisgKiAKKyAqIEBhdXRob3IgU2ViYXN0aWFuIFphcm5la293IC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICogQGF1dGhvciBTdGVwaGFuZSBHYWxsYW5kIC0gQWRkIG9wZXJhdG9ycyBvbiBtYXAgc3RydWN0dXJlcy4KKyAqLworQEd3dENvbXBhdGlibGUgcHVibGljIGNsYXNzIE1hcEV4dGVuc2lvbnMgeworCisJLyoqCisJICogQXBwbGllcyB0aGUgZ2l2ZW4ge0Bjb2RlIHByb2NlZHVyZX0gZm9yIGVhY2gge0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnkga2V5IHZhbHVlIHBhaXJ9IG9mIHRoZSBnaXZlbiB7QGNvZGUgbWFwfS4gCisJICogCisJICogQHBhcmFtIG1hcAorCSAqICAgICAgICAgICAgdGhlIG1hcC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcHJvY2VkdXJlCisJICogICAgICAgICAgICB0aGUgcHJvY2VkdXJlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPEssIFY+IHZvaWQgZm9yRWFjaChNYXA8SywgVj4gbWFwLCBQcm9jZWR1cmUyPD8gc3VwZXIgSywgPyBzdXBlciBWPiBwcm9jZWR1cmUpIHsKKwkJaWYgKHByb2NlZHVyZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwcm9jZWR1cmUiKTsKKwkJZm9yIChNYXAuRW50cnk8SywgVj4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgeworCQkJcHJvY2VkdXJlLmFwcGx5KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBBcHBsaWVzIHRoZSBnaXZlbiB7QGNvZGUgcHJvY2VkdXJlfSBmb3IgZWFjaCB7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeSBrZXkgdmFsdWUgcGFpcn0gb2YgdGhlIGdpdmVuIHtAY29kZSBtYXB9LiAKKwkgKiBUaGUgcHJvY2VkdXJlIHRha2VzIHRoZSBrZXksIHRoZSB2YWx1ZSBhbmQgYSBsb29wIGNvdW50ZXIuIElmIHRoZSBjb3VudGVyIHdvdWxkIG92ZXJmbG93LCB7QGxpbmsgSW50ZWdlciNNQVhfVkFMVUV9CisJICogaXMgcmV0dXJuZWQgZm9yIGFsbCBzdWJzZXF1ZW50IHBhaXJzLiBUaGUgZmlyc3QgcGFpciBpcyBhdCBpbmRleCB6ZXJvLgorCSAqIAorCSAqIEBwYXJhbSBtYXAKKwkgKiAgICAgICAgICAgIHRoZSBtYXAuIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHByb2NlZHVyZQorCSAqICAgICAgICAgICAgdGhlIHByb2NlZHVyZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxLLCBWPiB2b2lkIGZvckVhY2goTWFwPEssIFY+IG1hcCwgUHJvY2VkdXJlMzw/IHN1cGVyIEssID8gc3VwZXIgViwgPyBzdXBlciBJbnRlZ2VyPiBwcm9jZWR1cmUpIHsKKwkJaWYgKHByb2NlZHVyZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwcm9jZWR1cmUiKTsKKwkJaW50IGkgPSAwOworCQlmb3IgKE1hcC5FbnRyeTxLLCBWPiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CisJCQlwcm9jZWR1cmUuYXBwbHkoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCksIGkpOworCQkJaWYgKGkgIT0gSW50ZWdlci5NQVhfVkFMVUUpCisJCQkJaSsrOworCQl9CisJfQorCQorCS8qKgorCSAqIDxwPgorCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXZlIHZpZXcgb24gdG9wIG9mIHRoZSBvcmlnaW5hbCBtYXAuIENoYW5nZXMgdG8gb25lIGFmZmVjdCB0aGUgb3RoZXIuCisJICogPC9wPgorCSAqIAorCSAqIDxwPgorCSAqIFRoZSBtYXBwaW5nIGlzIGRvbmUgbGF6aWx5LiBUaGF0IGlzLCBzdWJzZXF1ZW50IGFjY2VzcyBvZiB0aGUgdmFsdWVzIGluIHRoZSBtYXAgd2lsbCByZXBlYXRlZGx5IGFwcGx5IHRoZQorCSAqIHRyYW5zZm9ybWF0aW9uLiBDaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIG9yaWdpbmFsIG1hcCwgc3VjaCBhcyBpdGVyYXRpb24gb3JkZXIsIGFyZSBsZWZ0IGludGFjdC4gQ2hhbmdlcyBpbiB0aGUKKwkgKiBvcmlnaW5hbCBtYXAgYXJlIHJlZmxlY3RlZCBpbiB0aGUgcmVzdWx0IG1hcC4gVGhlIHJlc3VsdHMgc3VwcG9ydHMgcmVtb3ZhbCBpZiB0aGUgb3JpZ2luYWwgbWFwIHN1cHBvcnRzIHJlbW92YWwuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBvcmlnaW5hbAorCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIG1hcC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gcHJlZGljYXRlCisJICogICAgICAgICAgICB0aGUgcHJlZGljYXRlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gYSBmaWx0ZXJlZCB2aWV3IG9uIHRvcCBvZiB0aGUgb3JpZ2luYWwgbWFwLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxLLCBWPiBNYXA8SywgVj4gZmlsdGVyKE1hcDxLLCBWPiBvcmlnaW5hbCwgZmluYWwgRnVuY3Rpb24yPD8gc3VwZXIgSywgPyBzdXBlciBWLCBCb29sZWFuPiBwcmVkaWNhdGUpIHsKKwkJaWYgKHByZWRpY2F0ZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwcmVkaWNhdGUiKTsKKwkJcmV0dXJuIE1hcHMuZmlsdGVyRW50cmllcyhvcmlnaW5hbCwgbmV3IFByZWRpY2F0ZTxNYXAuRW50cnk8SywgVj4+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBhcHBseShNYXAuRW50cnk8SywgVj4gaW5wdXQpIHsKKwkJCQlCb29sZWFuIHJlc3VsdCA9IHByZWRpY2F0ZS5hcHBseShpbnB1dC5nZXRLZXkoKSwgaW5wdXQuZ2V0VmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdC5ib29sZWFuVmFsdWUoKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCS8qKgorCSAqIEFkZCB0aGUgZ2l2ZW4gcGFpciBpbnRvIHRoZSBtYXAuCisJICoKKwkgKiA8cD4KKwkgKiBJZiB0aGUgcGFpciBrZXkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIG1hcCwgaXRzIHZhbHVlIGlzIHJlcGxhY2VkCisJICogYnkgdGhlIHZhbHVlIGluIHRoZSBwYWlyLCBhbmQgdGhlIG9sZCB2YWx1ZSBpbiB0aGUgbWFwIGlzIHJldHVybmVkLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSA8Sz4gdHlwZSBvZiB0aGUgbWFwIGtleXMuCisJICogQHBhcmFtIDxWPiB0eXBlIG9mIHRoZSBtYXAgdmFsdWVzLgorCSAqIEBwYXJhbSBtYXAgdGhlIG1hcCB0byB1cGRhdGUuCisJICogQHBhcmFtIGVudHJ5IHRoZSBlbnRyeSAoa2V5LCB2YWx1ZSkgdG8gYWRkIGludG8gdGhlIG1hcC4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBwcmV2aW91c2x5IGFzc29jaWF0ZWQgdG8gdGhlIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiAgICAgaWYgdGhlIGtleSB3YXMgbm90IHByZXNlbnQgaW4gdGhlIG1hcCBiZWZvcmUgdGhlIGFkZGl0aW9uLgorCSAqIEBzaW5jZSAyLjE1CisJICovCisJQElubGluZSh2YWx1ZSA9ICIkMS5wdXQoJDIuZ2V0S2V5KCksICQyLmdldFZhbHVlKCkpIiwgc3RhdGVtZW50RXhwcmVzc2lvbiA9IHRydWUpCisJcHVibGljIHN0YXRpYyA8SywgVj4gViBvcGVyYXRvcl9hZGQoTWFwPEssIFY+IG1hcCwgUGFpcjw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IGVudHJ5KSB7CisJCXJldHVybiBtYXAucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKwl9CisKKwkvKioKKwkgKiBBZGQgdGhlIGdpdmVuIGVudHJpZXMgb2YgdGhlIGlucHV0IG1hcCBpbnRvIHRoZSBvdXRwdXQgbWFwLgorCSAqCisJICogPHA+CisJICogSWYgYSBrZXkgaW4gdGhlIGlucHV0TWFwIGFscmVhZHkgZXhpc3RzIGluIHRoZSBvdXRwdXRNYXAsIGl0cyB2YWx1ZSBpcworCSAqIHJlcGxhY2VkIGluIHRoZSBvdXRwdXRNYXAgYnkgdGhlIHZhbHVlIGZyb20gdGhlIGlucHV0TWFwLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSA8Sz4gdHlwZSBvZiB0aGUgbWFwIGtleXMuCisJICogQHBhcmFtIDxWPiB0eXBlIG9mIHRoZSBtYXAgdmFsdWVzLgorCSAqIEBwYXJhbSBvdXRwdXRNYXAgdGhlIG1hcCB0byB1cGRhdGUuCisJICogQHBhcmFtIGlucHV0TWFwIHRoZSBlbnRyaWVzIHRvIGFkZC4KKwkgKiBAc2luY2UgMi4xNQorCSAqLworCUBJbmxpbmUodmFsdWUgPSAiJDEucHV0QWxsKCQyKSIsIHN0YXRlbWVudEV4cHJlc3Npb24gPSB0cnVlKQorCXB1YmxpYyBzdGF0aWMgPEssIFY+IHZvaWQgb3BlcmF0b3JfYWRkKE1hcDxLLCBWPiBvdXRwdXRNYXAsIE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IGlucHV0TWFwKSB7CisJCW91dHB1dE1hcC5wdXRBbGwoaW5wdXRNYXApOworCX0KKworCS8qKgorCSAqIEFkZCB0aGUgZ2l2ZW4gcGFpciB0byBhIGdpdmVuIG1hcCBmb3Igb2J0YWluaW5nIGEgbmV3IG1hcC4KKwkgKgorCSAqIDxwPgorCSAqIFRoZSByZXBsaWVkIG1hcCBpcyBhIHZpZXcgb24gdGhlIGdpdmVuIG1hcC4gSXQgbWVhbnMgdGhhdCBhbnkgY2hhbmdlCisJICogaW4gdGhlIG9yaWdpbmFsIG1hcCBpcyByZWZsZWN0ZWQgdG8gdGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbi4KKwkgKiA8L3A+CisJICoKKwkgKiA8cD4KKwkgKiBFdmVuIGlmIHRoZSBrZXkgb2YgdGhlIHJpZ2h0IG9wZXJhbmQgZXhpc3RzIGluIHRoZSBsZWZ0IG9wZXJhbmQsIHRoZSB2YWx1ZSBpbiB0aGUgcmlnaHQgb3BlcmFuZCBpcyBwcmVmZXJyZWQuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIDxLPiB0eXBlIG9mIHRoZSBtYXAga2V5cy4KKwkgKiBAcGFyYW0gPFY+IHR5cGUgb2YgdGhlIG1hcCB2YWx1ZXMuCisJICogQHBhcmFtIGxlZnQgdGhlIG1hcCB0byBjb25zaWRlci4KKwkgKiBAcGFyYW0gcmlnaHQgdGhlIGVudHJ5IChrZXksIHZhbHVlKSB0byBhZGQgaW50byB0aGUgbWFwLgorCSAqIEByZXR1cm4gYW4gaW1tdXRhYmxlIG1hcCB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSBtYXAgYW5kIHdpdGggdGhlIGdpdmVuIGVudHJ5LgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIC0gd2hlbiB0aGUgcmlnaHQgb3BlcmFuZCBrZXkgZXhpc3RzIGluIHRoZSBsZWZ0IG9wZXJhbmQuCisJICogQHNpbmNlIDIuMTUKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWUgPSAiJDMudW5pb24oJDEsICQ0LnNpbmdsZXRvbk1hcCgkMi5nZXRLZXkoKSwgJDIuZ2V0VmFsdWUoKSkpIiwKKwkJCWltcG9ydGVkID0geyBNYXBFeHRlbnNpb25zLmNsYXNzLCBDb2xsZWN0aW9ucy5jbGFzcyB9KQorCXB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLCBWPiBvcGVyYXRvcl9wbHVzKE1hcDxLLCBWPiBsZWZ0LCBmaW5hbCBQYWlyPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gcmlnaHQpIHsKKwkJcmV0dXJuIHVuaW9uKGxlZnQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcChyaWdodC5nZXRLZXkoKSwgcmlnaHQuZ2V0VmFsdWUoKSkpOworCX0KKworCS8qKgorCSAqIE1lcmdlIHRoZSB0d28gbWFwcy4KKwkgKgorCSAqIDxwPgorCSAqIFRoZSByZXBsaWVkIG1hcCBpcyBhIHZpZXcgb24gdGhlIGdpdmVuIG1hcC4gSXQgbWVhbnMgdGhhdCBhbnkgY2hhbmdlCisJICogaW4gdGhlIG9yaWdpbmFsIG1hcCBpcyByZWZsZWN0ZWQgdG8gdGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbi4KKwkgKiA8L3A+CisJICoKKwkgKiA8cD4KKwkgKiBJZiBhIGtleSBleGlzdHMgaW4gdGhlIGxlZnQgYW5kIHJpZ2h0IG9wZXJhbmRzLCB0aGUgdmFsdWUgaW4gdGhlIHJpZ2h0IG9wZXJhbmQgaXMgcHJlZmVycmVkLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSA8Sz4gdHlwZSBvZiB0aGUgbWFwIGtleXMuCisJICogQHBhcmFtIDxWPiB0eXBlIG9mIHRoZSBtYXAgdmFsdWVzLgorCSAqIEBwYXJhbSBsZWZ0IHRoZSBsZWZ0IG1hcC4KKwkgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IG1hcC4KKwkgKiBAcmV0dXJuIGEgbWFwIHdpdGggdGhlIG1lcmdlZCBjb250ZW50cyBmcm9tIHRoZSB0d28gbWFwcy4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAtIHdoZW4gYSByaWdodCBvcGVyYW5kIGtleSBleGlzdHMgaW4gdGhlIGxlZnQgb3BlcmFuZC4KKwkgKiBAc2luY2UgMi4xNQorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZSA9ICIkMy51bmlvbigkMSwgJDIpIiwgaW1wb3J0ZWQgPSBNYXBFeHRlbnNpb25zLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLCBWPiBvcGVyYXRvcl9wbHVzKE1hcDxLLCBWPiBsZWZ0LCBNYXA8PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWPiByaWdodCkgeworCQlyZXR1cm4gdW5pb24obGVmdCwgcmlnaHQpOworCX0KKworCS8qKgorCSAqIFJlbW92ZSBhIGtleSBmcm9tIHRoZSBnaXZlbiBtYXAuCisJICoKKwkgKiBAcGFyYW0gPEs+IHR5cGUgb2YgdGhlIG1hcCBrZXlzLgorCSAqIEBwYXJhbSA8Vj4gdHlwZSBvZiB0aGUgbWFwIHZhbHVlcy4KKwkgKiBAcGFyYW0gbWFwIHRoZSBtYXAgdG8gdXBkYXRlLgorCSAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byByZW1vdmUuCisJICogQHJldHVybiB0aGUgcmVtb3ZlZCB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGtleSB3YXMgbm90CisJICogICAgIHByZXNlbnQgaW4gdGhlIG1hcC4KKwkgKiBAc2luY2UgMi4xNQorCSAqLworCUBJbmxpbmUodmFsdWUgPSAiJDEucmVtb3ZlKCQyKSIsIHN0YXRlbWVudEV4cHJlc3Npb24gPSB0cnVlKQorCXB1YmxpYyBzdGF0aWMgPEssIFY+IFYgb3BlcmF0b3JfcmVtb3ZlKE1hcDxLLCBWPiBtYXAsIEsga2V5KSB7CisJCXJldHVybiBtYXAucmVtb3ZlKGtleSk7CisJfQorCisJLyoqCisJICogUmVtb3ZlIHRoZSBnaXZlbiBwYWlyIGludG8gdGhlIG1hcC4KKwkgKgorCSAqIDxwPgorCSAqIElmIHRoZSBnaXZlbiBrZXkgaXMgaW5zaWRlIHRoZSBtYXAsIGJ1dCBpcyBub3QgbWFwcGVkIHRvIHRoZSBnaXZlbiB2YWx1ZSwgdGhlCisJICogbWFwIHdpbGwgbm90IGJlIGNoYW5nZWQuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIDxLPiB0eXBlIG9mIHRoZSBtYXAga2V5cy4KKwkgKiBAcGFyYW0gPFY+IHR5cGUgb2YgdGhlIG1hcCB2YWx1ZXMuCisJICogQHBhcmFtIG1hcCB0aGUgbWFwIHRvIHVwZGF0ZS4KKwkgKiBAcGFyYW0gZW50cnkgdGhlIGVudHJ5IChrZXksIHZhbHVlKSB0byByZW1vdmUgZnJvbSB0aGUgbWFwLgorCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwYWlyIHdhcyByZW1vdmVkLgorCSAqIEBzaW5jZSAyLjE1CisJICovCisJQElubGluZSh2YWx1ZSA9ICIkMS5yZW1vdmUoJDIuZ2V0S2V5KCksICQyLmdldFZhbHVlKCkpIiwgc3RhdGVtZW50RXhwcmVzc2lvbiA9IHRydWUpCisJcHVibGljIHN0YXRpYyA8SywgVj4gYm9vbGVhbiBvcGVyYXRvcl9yZW1vdmUoTWFwPEssIFY+IG1hcCwgUGFpcjw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IGVudHJ5KSB7CisJCS8vVE9ETyB1c2UgdGhlIEpSRSAxLjggQVBJOiBtYXAucmVtb3ZlKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJZmluYWwgSyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKwkJZmluYWwgViBzdG9yZWRWYWx1ZSA9IG1hcC5nZXQoZW50cnkuZ2V0S2V5KCkpOworCSAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFsKHN0b3JlZFZhbHVlLCBlbnRyeS5nZXRWYWx1ZSgpKQorCQkJfHwgKHN0b3JlZFZhbHVlID09IG51bGwgJiYgIW1hcC5jb250YWluc0tleShrZXkpKSkgeworCSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCX0KKyAgICAgICAgCW1hcC5yZW1vdmUoa2V5KTsKKwkgICAgICAgIHJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFJlbW92ZSBwYWlycyB3aXRoIHRoZSBnaXZlbiBrZXlzIGZyb20gdGhlIG1hcC4KKwkgKgorCSAqIEBwYXJhbSA8Sz4gdHlwZSBvZiB0aGUgbWFwIGtleXMuCisJICogQHBhcmFtIDxWPiB0eXBlIG9mIHRoZSBtYXAgdmFsdWVzLgorCSAqIEBwYXJhbSBtYXAgdGhlIG1hcCB0byB1cGRhdGUuCisJICogQHBhcmFtIGtleXNUb1JlbW92ZSB0aGUga2V5cyBvZiB0aGUgcGFpcnMgdG8gcmVtb3ZlLgorCSAqIEBzaW5jZSAyLjE1CisJICovCisJcHVibGljIHN0YXRpYyA8SywgVj4gdm9pZCBvcGVyYXRvcl9yZW1vdmUoTWFwPEssIFY+IG1hcCwgSXRlcmFibGU8PyBzdXBlciBLPiBrZXlzVG9SZW1vdmUpIHsKKwkJZm9yIChmaW5hbCBPYmplY3Qga2V5IDoga2V5c1RvUmVtb3ZlKSB7CisJCQltYXAucmVtb3ZlKGtleSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIGdpdmVuIHBhaXIgZnJvbSBhIGdpdmVuIG1hcCBmb3Igb2J0YWluaW5nIGEgbmV3IG1hcC4KKwkgKgorCSAqIDxwPgorCSAqIElmIHRoZSBnaXZlbiBrZXkgaXMgaW5zaWRlIHRoZSBtYXAsIGJ1dCBpcyBub3QgbWFwcGVkIHRvIHRoZSBnaXZlbiB2YWx1ZSwgdGhlCisJICogbWFwIHdpbGwgbm90IGJlIGNoYW5nZWQuCisJICogPC9wPgorCSAqCisJICogPHA+CisJICogVGhlIHJlcGxpZWQgbWFwIGlzIGEgdmlldyBvbiB0aGUgZ2l2ZW4gbWFwLiBJdCBtZWFucyB0aGF0IGFueSBjaGFuZ2UKKwkgKiBpbiB0aGUgb3JpZ2luYWwgbWFwIGlzIHJlZmxlY3RlZCB0byB0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSA8Sz4gdHlwZSBvZiB0aGUgbWFwIGtleXMuCisJICogQHBhcmFtIDxWPiB0eXBlIG9mIHRoZSBtYXAgdmFsdWVzLgorCSAqIEBwYXJhbSBsZWZ0IHRoZSBtYXAgdG8gY29uc2lkZXIuCisJICogQHBhcmFtIHJpZ2h0IHRoZSBlbnRyeSAoa2V5LCB2YWx1ZSkgdG8gcmVtb3ZlIGZyb20gdGhlIG1hcC4KKwkgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBtYXAgd2l0aCB0aGUgY29udGVudCBvZiB0aGUgbWFwIGFuZCB3aXRoIHRoZSBnaXZlbiBlbnRyeS4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAtIHdoZW4gdGhlIHJpZ2h0IG9wZXJhbmQga2V5IGV4aXN0cyBpbiB0aGUgbGVmdCBvcGVyYW5kLgorCSAqIEBzaW5jZSAyLjE1CisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxLLCBWPiBNYXA8SywgVj4gb3BlcmF0b3JfbWludXMoTWFwPEssIFY+IGxlZnQsIGZpbmFsIFBhaXI8PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWPiByaWdodCkgeworCQlyZXR1cm4gTWFwcy5maWx0ZXJFbnRyaWVzKGxlZnQsIG5ldyBQcmVkaWNhdGU8RW50cnk8SywgVj4+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBhcHBseShFbnRyeTxLLCBWPiBpbnB1dCkgeworCQkJCXJldHVybiAhT2JqZWN0cy5lcXVhbChpbnB1dC5nZXRLZXkoKSwgcmlnaHQuZ2V0S2V5KCkpIHx8ICFPYmplY3RzLmVxdWFsKGlucHV0LmdldFZhbHVlKCksIHJpZ2h0LmdldFZhbHVlKCkpOworCQkJfQorCQl9KTsKKwl9CisKKwkvKioKKwkgKiBSZXBsaWVzIHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbWFwIGV4Y2VwdCB0aGUgcGFpciB3aXRoIHRoZSBnaXZlbiBrZXkuCisJICoKKwkgKiA8cD4KKwkgKiBUaGUgcmVwbGllZCBtYXAgaXMgYSB2aWV3IG9uIHRoZSBnaXZlbiBtYXAuIEl0IG1lYW5zIHRoYXQgYW55IGNoYW5nZQorCSAqIGluIHRoZSBvcmlnaW5hbCBtYXAgaXMgcmVmbGVjdGVkIHRvIHRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24uCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIDxLPiB0eXBlIG9mIHRoZSBtYXAga2V5cy4KKwkgKiBAcGFyYW0gPFY+IHR5cGUgb2YgdGhlIG1hcCB2YWx1ZXMuCisJICogQHBhcmFtIG1hcCB0aGUgbWFwIHRvIHVwZGF0ZS4KKwkgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gcmVtb3ZlLgorCSAqIEByZXR1cm4gdGhlIG1hcCB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSBtYXAgZXhjZXB0IHRoZSBrZXkuCisJICogQHNpbmNlIDIuMTUKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLCBWPiBvcGVyYXRvcl9taW51cyhNYXA8SywgVj4gbWFwLCBmaW5hbCBLIGtleSkgeworCQlyZXR1cm4gTWFwcy5maWx0ZXJLZXlzKG1hcCwgbmV3IFByZWRpY2F0ZTxLPigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gYXBwbHkoSyBpbnB1dCkgeworCQkJCXJldHVybiAhT2JqZWN0cy5lcXVhbChpbnB1dCwga2V5KTsKKwkJCX0KKwkJfSk7CisJfQorCisJLyoqCisJICogUmVwbGllcyB0aGUgZWxlbWVudHMgb2YgdGhlIGxlZnQgbWFwIHdpdGhvdXQgdGhlIHBhaXJzIGluIHRoZSByaWdodCBtYXAuCisJICogSWYgdGhlIHBhaXIncyB2YWx1ZXMgZGlmZmVyIGZyb20KKwkgKiB0aGUgdmFsdWUgd2l0aGluIHRoZSBtYXAsIHRoZSBtYXAgZW50cnkgaXMgbm90IHJlbW92ZWQuCisJICoKKwkgKiA8cD4KKwkgKiBUaGUgZGlmZmVyZW5jZSBpcyBhbiBpbW11dGFibGUKKwkgKiBzbmFwc2hvdCBvZiB0aGUgc3RhdGUgb2YgdGhlIG1hcHMgYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLiBJdAorCSAqIHdpbGwgbmV2ZXIgY2hhbmdlLCBldmVuIGlmIHRoZSBtYXBzIGNoYW5nZSBhdCBhIGxhdGVyIHRpbWUuCisJICogPC9wPgorCSAqCisJICogPHA+CisJICogU2luY2UgdGhpcyBtZXRob2QgdXNlcyB7QGNvZGUgSGFzaE1hcH0gaW5zdGFuY2VzIGludGVybmFsbHksIHRoZSBrZXlzIG9mCisJICogdGhlIHN1cHBsaWVkIG1hcHMgbXVzdCBiZSB3ZWxsLWJlaGF2ZWQgd2l0aCByZXNwZWN0IHRvCisJICoge0BsaW5rIE9iamVjdCNlcXVhbHN9IGFuZCB7QGxpbmsgT2JqZWN0I2hhc2hDb2RlfS4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gPEs+IHR5cGUgb2YgdGhlIG1hcCBrZXlzLgorCSAqIEBwYXJhbSA8Vj4gdHlwZSBvZiB0aGUgbWFwIHZhbHVlcy4KKwkgKiBAcGFyYW0gbGVmdCB0aGUgbWFwIHRvIHVwZGF0ZS4KKwkgKiBAcGFyYW0gcmlnaHQgdGhlIHBhaXJzIHRvIHJlbW92ZS4KKwkgKiBAcmV0dXJuIHRoZSBtYXAgd2l0aCB0aGUgY29udGVudCBvZiB0aGUgbGVmdCBtYXAgZXhjZXB0IHRoZSBwYWlycyBvZiB0aGUgcmlnaHQgbWFwLgorCSAqIEBzaW5jZSAyLjE1CisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxLLCBWPiBNYXA8SywgVj4gb3BlcmF0b3JfbWludXMoTWFwPEssIFY+IGxlZnQsIGZpbmFsIE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IHJpZ2h0KSB7CisJCXJldHVybiBNYXBzLmZpbHRlckVudHJpZXMobGVmdCwgbmV3IFByZWRpY2F0ZTxFbnRyeTxLLCBWPj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGFwcGx5KEVudHJ5PEssIFY+IGlucHV0KSB7CisJCQkJZmluYWwgViB2YWx1ZSA9IHJpZ2h0LmdldChpbnB1dC5nZXRLZXkoKSk7CisJCQkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIGlucHV0LmdldFZhbHVlKCkgPT0gbnVsbCAmJiByaWdodC5jb250YWluc0tleShpbnB1dC5nZXRLZXkoKSk7CisJCQkJfQorCQkJCXJldHVybiAhT2JqZWN0cy5lcXVhbChpbnB1dC5nZXRWYWx1ZSgpLCB2YWx1ZSk7CisJCQl9CisJCX0pOworCX0KKworCS8qKgorCSAqIFJlcGxpZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBtYXAgZXhjZXB0IHRoZSBwYWlycyB3aXRoIHRoZSBnaXZlbiBrZXlzLgorCSAqCisJICogPHA+CisJICogVGhlIHJlcGxpZWQgbWFwIGlzIGEgdmlldyBvbiB0aGUgZ2l2ZW4gbWFwLiBJdCBtZWFucyB0aGF0IGFueSBjaGFuZ2UKKwkgKiBpbiB0aGUgb3JpZ2luYWwgbWFwIGlzIHJlZmxlY3RlZCB0byB0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSA8Sz4gdHlwZSBvZiB0aGUgbWFwIGtleXMuCisJICogQHBhcmFtIDxWPiB0eXBlIG9mIHRoZSBtYXAgdmFsdWVzLgorCSAqIEBwYXJhbSBtYXAgdGhlIG1hcCB0byB1cGRhdGUuCisJICogQHBhcmFtIGtleXMgdGhlIGtleXMgb2YgdGhlIHBhaXJzIHRvIHJlbW92ZS4KKwkgKiBAcmV0dXJuIHRoZSBtYXAgd2l0aCB0aGUgY29udGVudCBvZiB0aGUgbWFwIGV4Y2VwdCB0aGUgcGFpcnMuCisJICogQHNpbmNlIDIuMTUKKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLCBWPiBvcGVyYXRvcl9taW51cyhNYXA8SywgVj4gbWFwLCBmaW5hbCBJdGVyYWJsZTw/PiBrZXlzKSB7CisJCXJldHVybiBNYXBzLmZpbHRlcktleXMobWFwLCBuZXcgUHJlZGljYXRlPEs+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBhcHBseShLIGlucHV0KSB7CisJCQkJcmV0dXJuICFJdGVyYWJsZXMuY29udGFpbnMoa2V5cywgaW5wdXQpOworCQkJfQorCQl9KTsKKwl9CisKKwkvKioKKwkgKiBNZXJnZSB0aGUgZ2l2ZW4gbWFwcy4KKwkgKgorCSAqIDxwPgorCSAqIFRoZSByZXBsaWVkIG1hcCBpcyBhIHZpZXcgb24gdGhlIGdpdmVuIHR3byBtYXBzLgorCSAqIElmIGEga2V5IGV4aXN0cyBpbiB0aGUgdHdvIG1hcHMsIHRoZSByZXBsaWVkIHZhbHVlIGlzIHRoZSB2YWx1ZSBvZiB0aGUgcmlnaHQgb3BlcmFuZC4KKwkgKiA8L3A+CisJICoKKwkgKiA8cD4KKwkgKiBFdmVuIGlmIHRoZSBrZXkgb2YgdGhlIHJpZ2h0IG9wZXJhbmQgZXhpc3RzIGluIHRoZSBsZWZ0IG9wZXJhbmQsIHRoZSB2YWx1ZSBpbiB0aGUgcmlnaHQgb3BlcmFuZCBpcyBwcmVmZXJyZWQuCisJICogPC9wPgorCSAqCisJICogPHA+CisJICogVGhlIHJlcGxpZWQgbWFwIGlzIHVubW9kaWZpYWJsZS4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gPEs+IHR5cGUgb2YgdGhlIG1hcCBrZXlzLgorCSAqIEBwYXJhbSA8Vj4gdHlwZSBvZiB0aGUgbWFwIHZhbHVlcy4KKwkgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCBtYXAuCisJICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCBtYXAuCisJICogQHJldHVybiBhIG1hcCB3aXRoIHRoZSBtZXJnZWQgY29udGVudHMgZnJvbSB0aGUgdHdvIG1hcHMuCisJICogQHNpbmNlIDIuMTUKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWUgPSAiKG5ldyAkMzwkNSwgJDY+KCQxLCAkMikpIiwgaW1wb3J0ZWQgPSBVbm1vZGlmaWFibGVNZXJnaW5nTWFwVmlldy5jbGFzcywgY29uc3RhbnRFeHByZXNzaW9uID0gdHJ1ZSkKKwlwdWJsaWMgc3RhdGljIDxLLCBWPiBNYXA8SywgVj4gdW5pb24oTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbGVmdCwgTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gcmlnaHQpIHsKKwkJcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVNZXJnaW5nTWFwVmlldzxLLCBWPihsZWZ0LCByaWdodCk7CisJfQorCisJLyoqCisJICogPHA+UmV0dXJucyBhIG1hcCB0aGF0IHBlcmZvcm1zIHRoZSBnaXZlbiB7QGNvZGUgdHJhbnNmb3JtYXRpb259IGZvciBlYWNoIHZhbHVlIG9mIHtAY29kZSBvcmlnaW5hbH0gd2hlbiByZXF1ZXN0ZWQuPC9wPgorCSAqIAorCSAqIDxwPlRoZSBtYXBwaW5nIGlzIGRvbmUgbGF6aWx5LiBUaGF0IGlzLCBzdWJzZXF1ZW50IGFjY2VzcyBvZiB0aGUgdmFsdWVzIGluIHRoZSBtYXAgd2lsbCByZXBlYXRlZGx5IGFwcGx5IHRoZQorCSAqIHRyYW5zZm9ybWF0aW9uLiBDaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIG9yaWdpbmFsIG1hcCwgc3VjaCBhcyBpdGVyYXRpb24gb3JkZXIsIGFyZSBsZWZ0IGludGFjdC4gQ2hhbmdlcyBpbiB0aGUKKwkgKiBvcmlnaW5hbCBtYXAgYXJlIHJlZmxlY3RlZCBpbiB0aGUgcmVzdWx0IG1hcC4gVGhlIHJlc3VsdHMgc3VwcG9ydHMgcmVtb3ZhbCBpZiB0aGUgb3JpZ2luYWwgbWFwIHN1cHBvcnRzIHJlbW92YWwuPC9wPgorCSAqIAorCSAqIEBwYXJhbSBvcmlnaW5hbAorCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIG1hcC4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gdHJhbnNmb3JtYXRpb24KKwkgKiAgICAgICAgICAgIHRoZSB0cmFuc2Zvcm1hdGlvbi4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGEgbWFwIHdpdGggZXF1YWwga2V5cyBidXQgdHJhbnNmb3JtZWQgdmFsdWVzLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxLLCBWMSwgVjI+IE1hcDxLLCBWMj4gbWFwVmFsdWVzKE1hcDxLLCBWMT4gb3JpZ2luYWwsIEZ1bmN0aW9uMTw/IHN1cGVyIFYxLCA/IGV4dGVuZHMgVjI+IHRyYW5zZm9ybWF0aW9uKSB7CisJCXJldHVybiBNYXBzLnRyYW5zZm9ybVZhbHVlcyhvcmlnaW5hbCwgbmV3IEZ1bmN0aW9uRGVsZWdhdGU8VjEsIFYyPih0cmFuc2Zvcm1hdGlvbikpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvT2JqZWN0RXh0ZW5zaW9ucy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvT2JqZWN0RXh0ZW5zaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MzYzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9PYmplY3RFeHRlbnNpb25zLmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXMuUHJvY2VkdXJlMTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworCisvKioKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIGxpYnJhcnkgZm9yIGFsbCB7QGxpbmsgT2JqZWN0IG9iamVjdHN9LgorICovCitAR3d0Q29tcGF0aWJsZSBwdWJsaWMgY2xhc3MgT2JqZWN0RXh0ZW5zaW9ucyB7CisKKwkvKioKKwkgKiBUaGUgPGNvZGU+ZXF1YWxzIG5vdDwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gYSBuZWdhdGVkLCBudWxsLXNhZmUKKwkgKiB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfSBtZXRob2QuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGFuIG9iamVjdC4KKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgYW5vdGhlciBvYmplY3QuCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB7QGNvZGUgYX0gYW5kIHtAY29kZSBifSBhcmUgbm90IGVxdWFsLgorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCEkMy5lcXVhbCgkMSwgJDIpKSIsIGltcG9ydGVkPU9iamVjdHMuY2xhc3MpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhPYmplY3QgYSwgT2JqZWN0IGIpIHsKKwkJcmV0dXJuICFPYmplY3RzLmVxdWFsKGEsIGIpOworCX0KKworCS8qKgorCSAqIFRoZSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIGEgbnVsbC1zYWZlIGludm9jYXRpb24gb2YKKwkgKiB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfS4KKwkgKiAKKwkgKiBAcGFyYW0gYQorCSAqICAgICAgICAgICAgYW4gb2JqZWN0LgorCSAqIEBwYXJhbSBiCisJICogICAgICAgICAgICBhbm90aGVyIG9iamVjdC4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHtAY29kZSBhfSBhbmQge0Bjb2RlIGJ9IGFyZSBlcXVhbC4KKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLmVxdWFsKCQxLCAkMikiLCBpbXBvcnRlZD1PYmplY3RzLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoT2JqZWN0IGEsIE9iamVjdCBiKSB7CisJCXJldHVybiBPYmplY3RzLmVxdWFsKGEsIGIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYge0Bjb2RlIGF9IGFuZCB7QGNvZGUgYn0gYXJlIGlkZW50aWNhbCAodGhlIHNhbWUgaW5zdGFuY2UpCisJICogb3IgYm90aCA8Y29kZT5udWxsPC9jb2RlPi4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGFuIG9iamVjdC4KKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgYW5vdGhlciBvYmplY3QuCisJICogQHJldHVybiBKYXZhJ3MgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZSA9ICIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uID0gdHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaWRlbnRpdHlFcXVhbHMoT2JqZWN0IGEsIE9iamVjdCBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPj09PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhbiBvYmplY3QuCisJICogQHBhcmFtIGIKKwkgKiAgICAgICAgICAgIGFub3RoZXIgb2JqZWN0LgorCSAqIEByZXR1cm4gSmF2YSdzIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlID0gIigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb24gPSB0cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoT2JqZWN0IGEsIE9iamVjdCBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGFuIG9iamVjdC4KKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgYW5vdGhlciBvYmplY3QuCisJICogQHJldHVybiBKYXZhJ3MgPGNvZGU+YSAhPSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWUgPSAiKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbiA9IHRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhPYmplY3QgYSwgT2JqZWN0IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisKKwkvKioKKwkgKiBUaGUgPGNvZGU+bWFwcGVkVG88L2NvZGU+IG9wZXJhdG9yIHlpZWxkcyBhIHtAbGluayBQYWlyfSB3aXRoIHtAY29kZSBhfSBhcyB0aGUge0BsaW5rIFBhaXIjZ2V0S2V5KCkga2V5fSBhbmQKKwkgKiB7QGNvZGUgYn0gYXMgaXRzIHtAbGluayBQYWlyI2dldFZhbHVlKCkgdmFsdWV9LgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhbiBvYmplY3QuCisJICogQHBhcmFtIGIKKwkgKiAgICAgICAgICAgIGFub3RoZXIgb2JqZWN0LgorCSAqIEByZXR1cm4gYSB7QGxpbmsgUGFpcn0uIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMuJDRvZigkMSwgJDIpIiwgaW1wb3J0ZWQ9UGFpci5jbGFzcykKKwlwdWJsaWMgc3RhdGljIDxBLCBCPiBQYWlyPEEsIEI+IG9wZXJhdG9yX21hcHBlZFRvKEEgYSwgQiBiKSB7CisJCXJldHVybiBQYWlyLm9mKGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+ZG91YmxlQXJyb3c8L2NvZGU+IG9wZXJhdG9yIGlzIHVzZWQgYXMgYSAnd2l0aCctIG9yICdsZXQnLW9wZXJhdGlvbi4KKwkgKiBJdCBhbGxvd3MgdG8gYmluZCBhbiBvYmplY3QgdG8gYSBsb2NhbCBzY29wZSBpbiBvcmRlciB0byBkbyBzb21ldGhpbmcgb24gaXQuCisJICogCisJICogRXhhbXBsZToKKwkgKiA8Y29kZT4KKwkgKiAgIG5ldyBQZXJzb24gPSZndDsgWworCSAqICAgICBmaXJzdE5hbWUgPSAnSGFuJworCSAqICAgICBsYXN0TmFtZSA9ICdTb2xvJworCSAqICAgXQorCSAqIDwvY29kZT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogICAgICAgICAgICBhbiBvYmplY3QuIENhbiBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gYmxvY2sKKwkgKiAgICAgICAgICAgIHRoZSBibG9jayB0byBleGVjdXRlIHdpdGggdGhlIGdpdmVuIG9iamVjdC4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUgcmVmZXJlbmNlIHRvIG9iamVjdC4KKwkgKiBAc2luY2UgMi4zCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gVCBvcGVyYXRvcl9kb3VibGVBcnJvdyhUIG9iamVjdCwgUHJvY2VkdXJlMTw/IHN1cGVyIFQ+IGJsb2NrKSB7CisJCWJsb2NrLmFwcGx5KG9iamVjdCk7CisJCXJldHVybiBvYmplY3Q7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+KzwvY29kZT4gb3BlcmF0b3IgdGhhdCBjb25jYXRlbmF0ZXMgdHdvIHN0cmluZ3MuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGFuIHtAbGluayBPYmplY3R9LgorCSAqIEBwYXJhbSBiCisJICogICAgICAgICAgICBhIHtAbGluayBTdHJpbmd9LgorCSAqIEByZXR1cm4gPGNvZGU+YSArIGI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlIC8qIG5vdCBndWFyYW50ZWVkIHB1cmUgLCBzaW5jZSB0b1N0cmluZygpIGlzIGludm9rZWQgb24gdGhlIGFyZ3VtZW50IGEqLworCUBJbmxpbmUoIigkMSArICQyKSIpCisJcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlcmF0b3JfcGx1cyhPYmplY3QgYSwgU3RyaW5nIGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgZWx2aXMgb3BlcmF0b3IgPGNvZGU+Pzo8L2NvZGU+IGlzIGEgc2hvcnQgaGFuZCBub3RhdGlvbiBmb3IKKwkgKiBwcm92aWRpbmcgZGVmYXVsdCB2YWx1ZSBpbiBjYXNlIGFuIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIAorCSAqIE5vdCB0aGF0IHRoZSBYdGVuZCBjb21waWxlciB3aWxsIGlubGluZSBjYWxscyB0byB0aGlzIG5vdCBjYWxsIHRoaXMgbWV0aG9kIHdpdGggYSBzaG9ydC1jaXJjdWl0IHNlbWFudGljLgorCSAqIFRoYXQgaXMgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBvbmx5IGV2YWx1YXRlZCBpZiB0aGUgZmlyc3Qgb25lIGV2YWx1YXRlcyB0byA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiAKKwkgKiBFeGFtcGxlOgorCSAqIDxjb2RlPnBlcnNvbi5uYW1lPzonSGFucyc8L2NvZGU+CisJICogCisJICogQHBhcmFtIGZpcnN0CisJICogICAgICAgICAgICBhbiB7QGxpbmsgT2JqZWN0fS4gTWlnaHQgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHNlY29uZAorCSAqICAgICAgICAgICAgYW4ge0BsaW5rIE9iamVjdH0uIE1pZ2h0IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIAorCSAqIEByZXR1cm4gYSByZWZlcmVuY2UgdG8gPGNvZGU+Zmlyc3Q8L2NvZGU+IGlmIDxjb2RlPmZpcnN0ICE9IG51bGwgPC9jb2RlPiwgPGNvZGU+c2Vjb25kPGNvZGU+IG90aGVyd2lzZSwgCisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8VD4gVCBvcGVyYXRvcl9lbHZpcyhUIGZpcnN0LCBUIHNlY29uZCkgeworCQlpZiAoZmlyc3QgIT0gbnVsbCkKKwkJCXJldHVybiBmaXJzdDsKKwkJcmV0dXJuIHNlY29uZDsKKwl9CisJCisJCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9QYWlyLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9QYWlyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0MjIwYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL1BhaXIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWI7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworCisvKioKKyAqIEFuIGltbXV0YWJsZSBwYWlyIG9mIHtAbGluayAjZ2V0S2V5KCkga2V5fSBhbmQge0BsaW5rICNnZXRWYWx1ZSgpIHZhbHVlfS4gQSBwYWlyIGlzIGNvbnNpZGVyZWQgdG8gYmUKKyAqIHtAbGluayAjZXF1YWxzKE9iamVjdCkgZXF1YWx9IHRvIGFub3RoZXIgcGFpciBpZiBib3RoIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSBhcmUgZXF1YWwuCisgKiAKKyAqIEBwYXJhbSA8Sz4KKyAqICAgICAgICAgICAgdGhlIGtleS10eXBlIG9mIHRoZSBwYWlyLgorICogQHBhcmFtIDxWPgorICogICAgICAgICAgICB0aGUgdmFsdWUtdHlwZSBvZiB0aGUgcGFpci4KKyAqIEBhdXRob3IgU2ViYXN0aWFuIFphcm5la293IC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICovCitAR3d0Q29tcGF0aWJsZSBwdWJsaWMgZmluYWwgY2xhc3MgUGFpcjxLLCBWPiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MzY1NDg5MDYyNTEzMDU5MzlMOworCXByaXZhdGUgZmluYWwgSyBrOworCXByaXZhdGUgZmluYWwgViB2OworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4ga2V5IGFuZCB2YWx1ZS4KKwkgKiBNYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBjb25zdHJ1Y3RvciBmb3IgY29udmVuaWVuY2UgcmVhc29ucy4KKwkgKiAKKwkgKiBAcGFyYW0gaworCSAqICAgICAgICAgICAgdGhlIGtleS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSB2CisJICogICAgICAgICAgICB0aGUgdmFsdWUuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBwYWlyLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlwdWJsaWMgc3RhdGljIDxLLCBWPiBQYWlyPEssIFY+IG9mKEsgaywgViB2KSB7CisJCXJldHVybiBuZXcgUGFpcjxLLCBWPihrLCB2KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIGtleSBhbmQgdmFsdWUuCisJICogCisJICogQHBhcmFtIGsKKwkgKiAgICAgICAgICAgIHRoZSBrZXkuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gdgorCSAqICAgICAgICAgICAgdGhlIHZhbHVlLiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogCisJICovCisJQFB1cmUKKwlwdWJsaWMgUGFpcihLIGssIFYgdikgeworCQl0aGlzLmsgPSBrOworCQl0aGlzLnYgPSB2OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGtleS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBrZXkuCisJICovCisJQFB1cmUKKwlwdWJsaWMgSyBnZXRLZXkoKSB7CisJCXJldHVybiBrOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHZhbHVlLgorCSAqLworCUBQdXJlCisJcHVibGljIFYgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCQlpZiAobyA9PSB0aGlzKQorCQkJcmV0dXJuIHRydWU7CisJCWlmICghKG8gaW5zdGFuY2VvZiBQYWlyKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJUGFpcjw/LCA/PiBlID0gKFBhaXI8PywgPz4pIG87CisJCXJldHVybiBPYmplY3RzLmVxdWFsKGssIGUuZ2V0S2V5KCkpICYmIE9iamVjdHMuZXF1YWwodiwgZS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gKChrID09IG51bGwpID8gMCA6IGsuaGFzaENvZGUoKSkgXiAoKHYgPT0gbnVsbCkgPyAwIDogdi5oYXNoQ29kZSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gayArICItPiIgKyB2OworCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvUHJvY2VkdXJlRXh0ZW5zaW9ucy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvUHJvY2VkdXJlRXh0ZW5zaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNDhkMjUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9Qcm9jZWR1cmVFeHRlbnNpb25zLmphdmEKQEAgLTAsMCArMSwxNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXMuUHJvY2VkdXJlMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlcy5Qcm9jZWR1cmUxOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzLlByb2NlZHVyZTI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXMuUHJvY2VkdXJlMzsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlcy5Qcm9jZWR1cmU0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzLlByb2NlZHVyZTU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXMuUHJvY2VkdXJlNjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CisKKy8qKgorICogVGhpcyBpcyBhbiBleHRlbnNpb24gbGlicmFyeSBmb3Ige0BsaW5rIFByb2NlZHVyZXMgcHJvY2VkdXJlc30sIGUuZy4gc2lkZS1lZmZlY3Qgb25seS1jbG9zdXJlcy4KKyAqIAorICogQGF1dGhvciBTZWJhc3RpYW4gWmFybmVrb3cgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKiBAc2VlIFByb2NlZHVyZXMKKyAqLworQEd3dENvbXBhdGlibGUgcHVibGljIGNsYXNzIFByb2NlZHVyZUV4dGVuc2lvbnMgeworCisJLyoqCisJICogQ3VycmllcyBhIHByb2NlZHVyZSB0aGF0IHRha2VzIG9uZSBhcmd1bWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvY2VkdXJlCisJICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgcHJvY2VkdXJlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBhcmd1bWVudAorCSAqICAgICAgICAgICAgdGhlIGZpeGVkIGFyZ3VtZW50LgorCSAqIEByZXR1cm4gYSBwcm9jZWR1cmUgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8UDE+IFByb2NlZHVyZTAgY3VycnkoZmluYWwgUHJvY2VkdXJlMTw/IHN1cGVyIFAxPiBwcm9jZWR1cmUsIGZpbmFsIFAxIGFyZ3VtZW50KSB7CisJCWlmIChwcm9jZWR1cmUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicHJvY2VkdXJlIik7CisJCXJldHVybiBuZXcgUHJvY2VkdXJlMCgpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwbHkoKSB7CisJCQkJcHJvY2VkdXJlLmFwcGx5KGFyZ3VtZW50KTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBDdXJyaWVzIGEgcHJvY2VkdXJlIHRoYXQgdGFrZXMgdHdvIGFyZ3VtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvY2VkdXJlCisJICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgcHJvY2VkdXJlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBhcmd1bWVudAorCSAqICAgICAgICAgICAgdGhlIGZpeGVkIGZpcnN0IGFyZ3VtZW50IG9mIHtAY29kZSBwcm9jZWR1cmV9LgorCSAqIEByZXR1cm4gYSBwcm9jZWR1cmUgdGhhdCB0YWtlcyBvbmUgYXJndW1lbnQuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8UDEsIFAyPiBQcm9jZWR1cmUxPFAyPiBjdXJyeShmaW5hbCBQcm9jZWR1cmUyPD8gc3VwZXIgUDEsID8gc3VwZXIgUDI+IHByb2NlZHVyZSwgZmluYWwgUDEgYXJndW1lbnQpIHsKKwkJaWYgKHByb2NlZHVyZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwcm9jZWR1cmUiKTsKKwkJcmV0dXJuIG5ldyBQcm9jZWR1cmUxPFAyPigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwbHkoUDIgcCkgeworCQkJCXByb2NlZHVyZS5hcHBseShhcmd1bWVudCwgcCk7CisJCQl9CisJCX07CisJfQorCisJLyoqCisJICogQ3VycmllcyBhIHByb2NlZHVyZSB0aGF0IHRha2VzIHRocmVlIGFyZ3VtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvY2VkdXJlCisJICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgcHJvY2VkdXJlLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBhcmd1bWVudAorCSAqICAgICAgICAgICAgdGhlIGZpeGVkIGZpcnN0IGFyZ3VtZW50IG9mIHtAY29kZSBwcm9jZWR1cmV9LgorCSAqIEByZXR1cm4gYSBwcm9jZWR1cmUgdGhhdCB0YWtlcyB0d28gYXJndW1lbnRzLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPFAxLCBQMiwgUDM+IFByb2NlZHVyZTI8UDIsIFAzPiBjdXJyeShmaW5hbCBQcm9jZWR1cmUzPD8gc3VwZXIgUDEsID8gc3VwZXIgUDIsID8gc3VwZXIgUDM+IHByb2NlZHVyZSwgZmluYWwgUDEgYXJndW1lbnQpIHsKKwkJaWYgKHByb2NlZHVyZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwcm9jZWR1cmUiKTsKKwkJcmV0dXJuIG5ldyBQcm9jZWR1cmUyPFAyLCBQMz4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGx5KFAyIHAyLCBQMyBwMykgeworCQkJCXByb2NlZHVyZS5hcHBseShhcmd1bWVudCwgcDIsIHAzKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBDdXJyaWVzIGEgcHJvY2VkdXJlIHRoYXQgdGFrZXMgZm91ciBhcmd1bWVudHMuCisJICogCisJICogQHBhcmFtIHByb2NlZHVyZQorCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHByb2NlZHVyZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gYXJndW1lbnQKKwkgKiAgICAgICAgICAgIHRoZSBmaXhlZCBmaXJzdCBhcmd1bWVudCBvZiB7QGNvZGUgcHJvY2VkdXJlfS4KKwkgKiBAcmV0dXJuIGEgcHJvY2VkdXJlIHRoYXQgdGFrZXMgdGhyZWUgYXJndW1lbnRzLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgPFAxLCBQMiwgUDMsIFA0PiBQcm9jZWR1cmUzPFAyLCBQMywgUDQ+IGN1cnJ5KGZpbmFsIFByb2NlZHVyZTQ8PyBzdXBlciBQMSwgPyBzdXBlciBQMiwgPyBzdXBlciBQMywgPyBzdXBlciBQND4gcHJvY2VkdXJlLAorCQkJZmluYWwgUDEgYXJndW1lbnQpIHsKKwkJaWYgKHByb2NlZHVyZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwcm9jZWR1cmUiKTsKKwkJcmV0dXJuIG5ldyBQcm9jZWR1cmUzPFAyLCBQMywgUDQ+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBseShQMiBwMiwgUDMgcDMsIFA0IHA0KSB7CisJCQkJcHJvY2VkdXJlLmFwcGx5KGFyZ3VtZW50LCBwMiwgcDMsIHA0KTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBDdXJyaWVzIGEgcHJvY2VkdXJlIHRoYXQgdGFrZXMgZml2ZSBhcmd1bWVudHMuCisJICogCisJICogQHBhcmFtIHByb2NlZHVyZQorCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHByb2NlZHVyZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gYXJndW1lbnQKKwkgKiAgICAgICAgICAgIHRoZSBmaXhlZCBmaXJzdCBhcmd1bWVudCBvZiB7QGNvZGUgcHJvY2VkdXJlfS4KKwkgKiBAcmV0dXJuIGEgcHJvY2VkdXJlIHRoYXQgdGFrZXMgZm91ciBhcmd1bWVudHMuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8UDEsIFAyLCBQMywgUDQsIFA1PiBQcm9jZWR1cmU0PFAyLCBQMywgUDQsIFA1PiBjdXJyeShmaW5hbCBQcm9jZWR1cmU1PD8gc3VwZXIgUDEsID8gc3VwZXIgUDIsID8gc3VwZXIgUDMsID8gc3VwZXIgUDQsID8gc3VwZXIgUDU+IHByb2NlZHVyZSwKKwkJCWZpbmFsIFAxIGFyZ3VtZW50KSB7CisJCWlmIChwcm9jZWR1cmUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicHJvY2VkdXJlIik7CisJCXJldHVybiBuZXcgUHJvY2VkdXJlNDxQMiwgUDMsIFA0LCBQNT4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGx5KFAyIHAyLCBQMyBwMywgUDQgcDQsIFA1IHA1KSB7CisJCQkJcHJvY2VkdXJlLmFwcGx5KGFyZ3VtZW50LCBwMiwgcDMsIHA0LCBwNSk7CisJCQl9CisJCX07CisJfQorCisJLyoqCisJICogQ3VycmllcyBhIHByb2NlZHVyZSB0aGF0IHRha2VzIHNpeCBhcmd1bWVudHMuCisJICogCisJICogQHBhcmFtIHByb2NlZHVyZQorCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHByb2NlZHVyZS4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gYXJndW1lbnQKKwkgKiAgICAgICAgICAgIHRoZSBmaXhlZCBmaXJzdCBhcmd1bWVudCBvZiB7QGNvZGUgcHJvY2VkdXJlfS4KKwkgKiBAcmV0dXJuIGEgcHJvY2VkdXJlIHRoYXQgdGFrZXMgZml2ZSBhcmd1bWVudHMuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyA8UDEsIFAyLCBQMywgUDQsIFA1LCBQNj4gUHJvY2VkdXJlNTxQMiwgUDMsIFA0LCBQNSwgUDY+IGN1cnJ5KAorCQkJZmluYWwgUHJvY2VkdXJlNjw/IHN1cGVyIFAxLCA/IHN1cGVyIFAyLCA/IHN1cGVyIFAzLCA/IHN1cGVyIFA0LCA/IHN1cGVyIFA1LCA/IHN1cGVyIFA2PiBwcm9jZWR1cmUsIGZpbmFsIFAxIGFyZ3VtZW50KSB7CisJCWlmIChwcm9jZWR1cmUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicHJvY2VkdXJlIik7CisJCXJldHVybiBuZXcgUHJvY2VkdXJlNTxQMiwgUDMsIFA0LCBQNSwgUDY+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBseShQMiBwMiwgUDMgcDMsIFA0IHA0LCBQNSBwNSwgUDYgcDYpIHsKKwkJCQlwcm9jZWR1cmUuYXBwbHkoYXJndW1lbnQsIHAyLCBwMywgcDQsIHA1LCBwNik7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvUHJvY2VkdXJlcy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvUHJvY2VkdXJlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTUwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9Qcm9jZWR1cmVzLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHNlcnZlcyBhcyBhIGNvbnRhaW5lciBmb3IgdGhlIHZhcmlvdXMgcHJvY2VkdXJlIHR5cGVzIHRoYXQgYXJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSB0eXBlIG9mIGNsb3N1cmVzIGluCisgKiBYYmFzZSB0aGF0IGRvIG5vdCByZXR1cm4gYW55IHJlc3VsdHMgYnV0IGEgbWVhbnQgdG8gY2F1c2Ugc2lkZS1lZmZlY3RzLgorICogCisgKiBAYXV0aG9yIFNlYmFzdGlhbiBaYXJuZWtvdyAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqIEBzZWUgUHJvY2VkdXJlRXh0ZW5zaW9ucworICogQHNlZSBGdW5jdGlvbnMKKyAqLworQEd3dENvbXBhdGlibGUgcHVibGljIGludGVyZmFjZSBQcm9jZWR1cmVzIHsKKworCS8qKgorCSAqIEEgcHJvY2VkdXJlIHdpdGhvdXQgYW55IHBhcmFtZXRlcnMsIGUuZy4gYSB7QGxpbmsgUnVubmFibGV9LgorCSAqLworCWludGVyZmFjZSBQcm9jZWR1cmUwIHsKKworCQl2b2lkIGFwcGx5KCk7CisKKwl9CisKKwkvKioKKwkgKiBBIHByb2NlZHVyZSB0aGF0IHRha2VzIG9uZSBhcmd1bWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gPFBhcmFtPgorCSAqICAgICAgICAgICAgdGhlIG9ubHkgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHtAbGluayAjYXBwbHkoT2JqZWN0KSBjbG9zdXJlfQorCSAqLworCWludGVyZmFjZSBQcm9jZWR1cmUxPFBhcmFtPiB7CisKKwkJdm9pZCBhcHBseShQYXJhbSBwKTsKKworCX0KKworCS8qKgorCSAqIEEgcHJvY2VkdXJlIHRoYXQgdGFrZXMgdHdvIGFyZ3VtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gPFAxPgorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB7QGxpbmsgI2FwcGx5KE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UDI+CisJICogICAgICAgICAgICB0aGUgc2Vjb25kIGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB7QGxpbmsgI2FwcGx5KE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqLworCWludGVyZmFjZSBQcm9jZWR1cmUyPFAxLCBQMj4geworCisJCXZvaWQgYXBwbHkoUDEgcDEsIFAyIHAyKTsKKworCX0KKworCS8qKgorCSAqIEEgcHJvY2VkdXJlIHRoYXQgdGFrZXMgdGhyZWUgYXJndW1lbnRzLgorCSAqIAorCSAqIEBwYXJhbSA8UDE+CisJICogICAgICAgICAgICB0aGUgZmlyc3QgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHtAbGluayAjYXBwbHkoT2JqZWN0LCBPYmplY3QsIE9iamVjdCkgY2xvc3VyZX0KKwkgKiBAcGFyYW0gPFAyPgorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0byB0aGUge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UDM+CisJICogICAgICAgICAgICB0aGUgdGhpcmQgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHtAbGluayAjYXBwbHkoT2JqZWN0LCBPYmplY3QsIE9iamVjdCkgY2xvc3VyZX0KKwkgKi8KKwlpbnRlcmZhY2UgUHJvY2VkdXJlMzxQMSwgUDIsIFAzPiB7CisKKwkJdm9pZCBhcHBseShQMSBwMSwgUDIgcDIsIFAzIHAzKTsKKworCX0KKworCS8qKgorCSAqIEEgcHJvY2VkdXJlIHRoYXQgdGFrZXMgZm91ciBhcmd1bWVudHMuCisJICogCisJICogQHBhcmFtIDxQMT4KKwkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0byB0aGUge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QpIGNsb3N1cmV9CisJICogQHBhcmFtIDxQMj4KKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHtAbGluayAjYXBwbHkoT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UDM+CisJICogICAgICAgICAgICB0aGUgdGhpcmQgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHtAbGluayAjYXBwbHkoT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UDQ+CisJICogICAgICAgICAgICB0aGUgZm91cnRoIGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB7QGxpbmsgI2FwcGx5KE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCkgY2xvc3VyZX0KKwkgKi8KKwlpbnRlcmZhY2UgUHJvY2VkdXJlNDxQMSwgUDIsIFAzLCBQND4geworCisJCXZvaWQgYXBwbHkoUDEgcDEsIFAyIHAyLCBQMyBwMywgUDQgcDQpOworCisJfQorCisJLyoqCisJICogQSBwcm9jZWR1cmUgdGhhdCB0YWtlcyBmaXZlIGFyZ3VtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gPFAxPgorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB7QGxpbmsgI2FwcGx5KE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KQorCSAqICAgICAgICAgICAgY2xvc3VyZX0KKwkgKiBAcGFyYW0gPFAyPgorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0byB0aGUge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCkKKwkgKiAgICAgICAgICAgIGNsb3N1cmV9CisJICogQHBhcmFtIDxQMz4KKwkgKiAgICAgICAgICAgIHRoZSB0aGlyZCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0byB0aGUge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCkKKwkgKiAgICAgICAgICAgIGNsb3N1cmV9CisJICogQHBhcmFtIDxQND4KKwkgKiAgICAgICAgICAgIHRoZSBmb3VydGggYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHtAbGluayAjYXBwbHkoT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QpCisJICogICAgICAgICAgICBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UDU+CisJICogICAgICAgICAgICB0aGUgZmlmdGggYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHtAbGluayAjYXBwbHkoT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QpCisJICogICAgICAgICAgICBjbG9zdXJlfQorCSAqLworCWludGVyZmFjZSBQcm9jZWR1cmU1PFAxLCBQMiwgUDMsIFA0LCBQNT4geworCisJCXZvaWQgYXBwbHkoUDEgcDEsIFAyIHAyLCBQMyBwMywgUDQgcDQsIFA1IHA1KTsKKworCX0KKworCS8qKgorCSAqIEEgcHJvY2VkdXJlIHRoYXQgdGFrZXMgc2l4IGFyZ3VtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gPFAxPgorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIHRoZQorCSAqICAgICAgICAgICAge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UDI+CisJICogICAgICAgICAgICB0aGUgc2Vjb25kIGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIHRoZQorCSAqICAgICAgICAgICAge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqIEBwYXJhbSA8UDM+CisJICogICAgICAgICAgICB0aGUgdGhpcmQgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlCisJICogICAgICAgICAgICB7QGxpbmsgI2FwcGx5KE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QpIGNsb3N1cmV9CisJICogQHBhcmFtIDxQND4KKwkgKiAgICAgICAgICAgIHRoZSBmb3VydGggYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlCisJICogICAgICAgICAgICB7QGxpbmsgI2FwcGx5KE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QpIGNsb3N1cmV9CisJICogQHBhcmFtIDxQNT4KKwkgKiAgICAgICAgICAgIHRoZSBmaWZ0aCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0byB0aGUKKwkgKiAgICAgICAgICAgIHtAbGluayAjYXBwbHkoT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCkgY2xvc3VyZX0KKwkgKiBAcGFyYW0gPFA2PgorCSAqICAgICAgICAgICAgdGhlIHNpeHRoIGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIHRoZQorCSAqICAgICAgICAgICAge0BsaW5rICNhcHBseShPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KSBjbG9zdXJlfQorCSAqLworCWludGVyZmFjZSBQcm9jZWR1cmU2PFAxLCBQMiwgUDMsIFA0LCBQNSwgUDY+IHsKKworCQl2b2lkIGFwcGx5KFAxIHAxLCBQMiBwMiwgUDMgcDMsIFA0IHA0LCBQNSBwNSwgUDYgcDYpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9QdXJlLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9QdXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3MmM1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL1B1cmUuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CisKKy8qKgorICogVGhlIGFubm90YXRlZCBjb25zdHJ1Y3RvciBvciBtZXRob2QgY2F1c2VzIG5vIGV4dGVybmFsbHkgdmlzaWJsZSBzaWRlLWVmZmVjdHMgYW5kIAorICogZG9lcyBub3QgbXV0YXRlIG5vbi1sb2NhbCBzdGF0ZS4gCisgKiAKKyAqIEluIG90aGVyIHdvcmRzOiBpZiB0aGUgcmVzdWx0IG9mIGEgcHVyZSBmdW5jdGlvbiBvciBjb25zdHJ1Y3RvciBpcyBub3QgdXNlZCwgaXQgCisgKiBpcyBkZWFkIGNvZGUgYW5kIGlzIHN1cHBvc2VkIHRvIGJlIHJlbW92ZWFibGUgd2l0aG91dCBjaGFuZ2luZyB0aGUgYmVoYXZpb3Igb2YgdGhlIAorICogcHJvZ3JhbS4KKyAqIAorICogT24ge0BsaW5rIElubGluZX1kIG1ldGhvZHMgdGhpcyBtZWFucyB0aGUgY29tcGlsZXIgY2Fubm90IHVzZSB0aGUgcmVzdWx0aW5nIEphdmEKKyAqIGV4cHJlc3Npb24gYXMgYSBzdGF0ZW1lbnQuIAorICogIAorICogQGF1dGhvciBTdmVuIEVmZnRpbmdlIC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICogCisgKiBAc2luY2UgMi4zCisgKi8KK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KHsKKyAgICBFbGVtZW50VHlwZS5DT05TVFJVQ1RPUiwKKyAgICBFbGVtZW50VHlwZS5NRVRIT0R9KQorQERvY3VtZW50ZWQKK0BCZXRhCitAR3d0Q29tcGF0aWJsZSBwdWJsaWMgQGludGVyZmFjZSBQdXJlIHsKKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvUmVhc3NpZ25GaXJzdEFyZ3VtZW50LmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9SZWFzc2lnbkZpcnN0QXJndW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGY4ODhkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvUmVhc3NpZ25GaXJzdEFyZ3VtZW50LmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWI7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlOworCisvKioKKyAqIFRoZSBhbm5vdGF0ZWQgZnVuY3Rpb24gYXNzaWducyB0aGUgcmV0dXJuZWQgdmFsdWUgdG8gdGhlIGZpcnN0IGFyZ3VtZW50LgorICogCisgKiBUaGF0IGlzLCBpdCBpcyByZXF1aXJlZCB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIHJlZmVyZW5jZSB0byBhbiBhc3NpZ25hYmxlCisgKiB2YXJpYWJsZSBvciBmaWVsZC4KKyAqIAorICogQGF1dGhvciBBbnRvbiBLb3N5YWtvdiAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqIEBzaW5jZSAyLjYKKyAqLworQEJldGEKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KHZhbHVlID0geyBFbGVtZW50VHlwZS5NRVRIT0QgfSkKK0BEb2N1bWVudGVkCitAR3d0Q29tcGF0aWJsZQorcHVibGljIEBpbnRlcmZhY2UgUmVhc3NpZ25GaXJzdEFyZ3VtZW50IHsKKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvU2hvcnRFeHRlbnNpb25zLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9TaG9ydEV4dGVuc2lvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzBkNTYyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvU2hvcnRFeHRlbnNpb25zLmphdmEKQEAgLTAsMCArMSwxNDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CisKKworLyoqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBsaWJyYXJ5IGZvciB7QGxpbmsgU2hvcnR9IG51bWJlcnMuCisgKiAKKyAqIEBhdXRob3IgSmFuIEtvZWhubGVpbiAtIENvZGUgZ2VuZXJhdG9yCisgKiBAc2luY2UgMi4zCisgKi8KK0BHd3RDb21wYXRpYmxlIHB1YmxpYyBjbGFzcyBTaG9ydEV4dGVuc2lvbnMgeworCS8vIEJFR0lOIGdlbmVyYXRlZCBjb2RlCisJLyoqCisJICogVGhlIHVuYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPi08L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBzICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT4tczwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoLSQxKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX21pbnVzKHNob3J0IHMpIHsKKwkJcmV0dXJuIC1zOworCX0KKwkKKwkvKioKKwkgKiBUaGUgcG9zdGZpeCA8Y29kZT5kZWNyZW1lbnQ8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+LS08L2NvZGU+IHBvc3RmaXggZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIHMgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPnMtLTwvY29kZT4KKwkgKiBAc2luY2UgMi42CisJICovCisJQElubGluZSh2YWx1ZT0iJDEtLSIpCisJcHVibGljIHN0YXRpYyBzaG9ydCBvcGVyYXRvcl9taW51c01pbnVzKHNob3J0IHMpIHsKKwkJdGhyb3cgbmV3IEhhcmRjb2RlZEluSW50ZXJwcmV0ZXJFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogVGhlIHBvc3RmaXggPGNvZGU+ZGVjcmVtZW50PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPi0tPC9jb2RlPiBwb3N0Zml4IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBzICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5zLS08L2NvZGU+CisJICogQHNpbmNlIDIuNgorCSAqLworCUBJbmxpbmUodmFsdWU9IiQxLS0iKQorCXB1YmxpYyBzdGF0aWMgU2hvcnQgb3BlcmF0b3JfbWludXNNaW51cyhTaG9ydCBzKSB7CisJCXRocm93IG5ldyBIYXJkY29kZWRJbkludGVycHJldGVyRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIFRoZSBwb3N0Zml4IDxjb2RlPmluY3JlbWVudDwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT4rKzwvY29kZT4gcG9zdGZpeCBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gcyAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+cysrPC9jb2RlPgorCSAqIEBzaW5jZSAyLjYKKwkgKi8KKwlASW5saW5lKHZhbHVlPSIkMSsrIikKKwlwdWJsaWMgc3RhdGljIHNob3J0IG9wZXJhdG9yX3BsdXNQbHVzKHNob3J0IHMpIHsKKwkJdGhyb3cgbmV3IEhhcmRjb2RlZEluSW50ZXJwcmV0ZXJFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogVGhlIHBvc3RmaXggPGNvZGU+aW5jcmVtZW50PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPisrPC9jb2RlPiBwb3N0Zml4IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBzICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5zKys8L2NvZGU+CisJICogQHNpbmNlIDIuNgorCSAqLworCUBJbmxpbmUodmFsdWU9IiQxKysiKQorCXB1YmxpYyBzdGF0aWMgU2hvcnQgb3BlcmF0b3JfcGx1c1BsdXMoU2hvcnQgcykgeworCQl0aHJvdyBuZXcgSGFyZGNvZGVkSW5JbnRlcnByZXRlckV4Y2VwdGlvbigpOworCX0KKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YStiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3BsdXMoc2hvcnQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9taW51cyhzaG9ydCBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX211bHRpcGx5KHNob3J0IGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS9iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAvICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX2RpdmlkZShzaG9ydCBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmElYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9tb2R1bG8oc2hvcnQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oc2hvcnQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4oc2hvcnQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPD0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKHNob3J0IGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGRvdWJsZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKHNob3J0IGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKHNob3J0IGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bm90RXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4hPTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKHNob3J0IGEsIGRvdWJsZSBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoc2hvcnQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgZG91YmxlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoc2hvcnQgYSwgZG91YmxlIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IG5vdCBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT4hPTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBkb3VibGUuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhzaG9ydCBhLCBkb3VibGUgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9wbHVzKHNob3J0IGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbWludXMoc2hvcnQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hKmI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICogJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9tdWx0aXBseShzaG9ydCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBmbG9hdCBvcGVyYXRvcl9kaXZpZGUoc2hvcnQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgZmxvYXQgb3BlcmF0b3JfbW9kdWxvKHNob3J0IGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzVGhhbihzaG9ydCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhIDwgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4oc2hvcnQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihzaG9ydCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlckVxdWFsc1RoYW4oc2hvcnQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA+PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+PT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKHNob3J0IGEsIGZsb2F0IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBmbG9hdC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhzaG9ydCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgZmxvYXQuCisJICogQHJldHVybiAgIDxjb2RlPk1hdGgucG93KGEsIGIpPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IiQzLnBvdygkMSwgJDIpIiwgaW1wb3J0ZWQ9TWF0aC5jbGFzcykKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBvcGVyYXRvcl9wb3dlcihzaG9ydCBhLCBmbG9hdCBiKSB7CisJCXJldHVybiBNYXRoLnBvdyhhLCBiKTsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPj09PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoc2hvcnQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGZsb2F0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoc2hvcnQgYSwgZmxvYXQgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfcGx1cyhzaG9ydCBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1pbnVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4tPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX21pbnVzKHNob3J0IGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfbXVsdGlwbHkoc2hvcnQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGxvbmcgb3BlcmF0b3JfZGl2aWRlKHNob3J0IGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAvIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bW9kdWxvPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4lPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBsb25nIG9wZXJhdG9yX21vZHVsbyhzaG9ydCBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKHNob3J0IGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4oc2hvcnQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlclRoYW4oc2hvcnQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihzaG9ydCBhLCBsb25nIGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKHNob3J0IGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGxvbmcuCisJICogQHJldHVybiAgIDxjb2RlPmEhPWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ub3RFcXVhbHMoc2hvcnQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKHNob3J0IGEsIGxvbmcgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBsb25nLgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoc2hvcnQgYSwgbG9uZyBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgbG9uZy4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSAhPSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlTm90RXF1YWxzKHNob3J0IGEsIGxvbmcgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfcGx1cyhzaG9ydCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hLWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbWludXMoc2hvcnQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgLSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm11bHRpcGx5PC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4qPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX211bHRpcGx5KHNob3J0IGEsIGludCBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfZGl2aWRlKHNob3J0IGEsIGludCBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICUgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfbW9kdWxvKHNob3J0IGEsIGludCBiKSB7CisJCXJldHVybiBhICUgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0OzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oc2hvcnQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihzaG9ydCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDtiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA+ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyVGhhbihzaG9ydCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSA+IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlckVxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKHNob3J0IGEsIGludCBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoc2hvcnQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYW4gaW50ZWdlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSE9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX25vdEVxdWFscyhzaG9ydCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBvd2VyPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSdzIDxjb2RlPk1hdGgucG93KCk8L2NvZGU+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoc2hvcnQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGFuIGludGVnZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhzaG9ydCBhLCBpbnQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhbiBpbnRlZ2VyLgorCSAqIEByZXR1cm4gICA8Y29kZT5hICE9IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVOb3RFcXVhbHMoc2hvcnQgYSwgaW50IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wbHVzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmErYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9wbHVzKHNob3J0IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSArIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bWludXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX21pbnVzKHNob3J0IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSpiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAqICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX211bHRpcGx5KHNob3J0IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAqIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZGl2aWRlPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4vPC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEvYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLyAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9kaXZpZGUoc2hvcnQgYSwgY2hhciBiKSB7CisJCXJldHVybiBhIC8gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tb2R1bG88L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiU8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX21vZHVsbyhzaG9ydCBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPCAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc1RoYW4oc2hvcnQgYSwgY2hhciBiKSB7CisJCXJldHVybiBhIDwgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5sZXNzRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmx0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZsdDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPD0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NFcXVhbHNUaGFuKHNob3J0IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA8PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlclRoYW4oc2hvcnQgYSwgY2hhciBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSZndDs9YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPj0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJFcXVhbHNUaGFuKHNob3J0IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA+PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+PT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YT09YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2VxdWFscyhzaG9ydCBhLCBjaGFyIGIpIHsKKwkJcmV0dXJuIGEgPT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ub3RFcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiE9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBjaGFyYWN0ZXIuCisJICogQHJldHVybiAgIDxjb2RlPmEhPWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ub3RFcXVhbHMoc2hvcnQgYSwgY2hhciBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgY2hhcmFjdGVyLgorCSAqIEByZXR1cm4gICA8Y29kZT5NYXRoLnBvdyhhLCBiKTwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIkMy5wb3coJDEsICQyKSIsIGltcG9ydGVkPU1hdGguY2xhc3MpCisJcHVibGljIHN0YXRpYyBkb3VibGUgb3BlcmF0b3JfcG93ZXIoc2hvcnQgYSwgY2hhciBiKSB7CisJCXJldHVybiBNYXRoLnBvdyhhLCBiKTsKKwl9CisJCisJLyoqCisJICogVGhlIDxjb2RlPmlkZW50aXR5IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPj09PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSA9PSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlRXF1YWxzKHNob3J0IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgbm90IGVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gSmF2YSdzIDxjb2RlPiE9PC9jb2RlPgorCSAqIG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGNoYXJhY3Rlci4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSAhPSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlTm90RXF1YWxzKHNob3J0IGEsIGNoYXIgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPnBsdXM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hK2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfcGx1cyhzaG9ydCBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEtYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgLSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9taW51cyhzaG9ydCBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhIC0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5tdWx0aXBseTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KjwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9tdWx0aXBseShzaG9ydCBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhICogYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5kaXZpZGU8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPi88L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hL2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIC8gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBpbnQgb3BlcmF0b3JfZGl2aWRlKHNob3J0IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmElYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgJSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9tb2R1bG8oc2hvcnQgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSAlIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKHNob3J0IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPCBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEmbHQ7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDw9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9sZXNzRXF1YWxzVGhhbihzaG9ydCBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmd0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID4gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2dyZWF0ZXJUaGFuKHNob3J0IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgPiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmdyZWF0ZXJFcXVhbHNUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mZ3Q7PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihzaG9ydCBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhID49IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT49PTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmE9PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9lcXVhbHMoc2hvcnQgYSwgc2hvcnQgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIHNob3J0LgorCSAqIEByZXR1cm4gICA8Y29kZT5hIT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3Jfbm90RXF1YWxzKHNob3J0IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIGEgIT0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5wb3dlcjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEncyA8Y29kZT5NYXRoLnBvdygpPC9jb2RlPiBmdW5jdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBzaG9ydC4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKHNob3J0IGEsIHNob3J0IGIpIHsKKwkJcmV0dXJuIE1hdGgucG93KGEsIGIpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+aWRlbnRpdHkgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+PT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEgPT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZUVxdWFscyhzaG9ydCBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgc2hvcnQuCisJICogQHJldHVybiAgIDxjb2RlPmEgIT0gYjwvY29kZT4KKwkgKiBAc2luY2UgMi40CisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgIT0gJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX3RyaXBsZU5vdEVxdWFscyhzaG9ydCBhLCBzaG9ydCBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cGx1czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+KzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YStiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX3BsdXMoc2hvcnQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5taW51czwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAtICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX21pbnVzKHNob3J0IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSAtIGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bXVsdGlwbHk8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPio8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEqYjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgKiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGludCBvcGVyYXRvcl9tdWx0aXBseShzaG9ydCBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgKiBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmRpdmlkZTwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+LzwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YS9iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAvICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX2RpdmlkZShzaG9ydCBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgLyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm1vZHVsbzwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+JTwvY29kZT4gb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSViPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAlICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgaW50IG9wZXJhdG9yX21vZHVsbyhzaG9ydCBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgJSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPmxlc3NUaGFuPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byB0aGUgSmF2YSA8Y29kZT4mbHQ7PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0O2I8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxIDwgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZXJhdG9yX2xlc3NUaGFuKHNob3J0IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA8IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+bGVzc0VxdWFsc1RoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hJmx0Oz1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA8PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfbGVzc0VxdWFsc1RoYW4oc2hvcnQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhIDw9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+Z3JlYXRlclRoYW48L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPiZndDs8L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7YjwvY29kZT4KKwkgKiBAc2luY2UgMi4zCisJICovCisJQFB1cmUKKwlASW5saW5lKHZhbHVlPSIoJDEgPiAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZ3JlYXRlclRoYW4oc2hvcnQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhID4gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5ncmVhdGVyRXF1YWxzVGhhbjwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+Jmd0Oz08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEmZ3Q7PWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID49ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ncmVhdGVyRXF1YWxzVGhhbihzaG9ydCBhLCBieXRlIGIpIHsKKwkJcmV0dXJuIGEgPj0gYjsKKwl9CisJCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT5lcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhIDxjb2RlPj09PC9jb2RlPiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hPT1iPC9jb2RlPgorCSAqIEBzaW5jZSAyLjMKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSA9PSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfZXF1YWxzKHNob3J0IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSA9PSBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPm5vdEVxdWFsczwvY29kZT4gb3BlcmF0b3IuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIEphdmEgPGNvZGU+IT08L2NvZGU+IG9wZXJhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBhICBhIHNob3J0LgorCSAqIEBwYXJhbSBiICBhIGJ5dGUuCisJICogQHJldHVybiAgIDxjb2RlPmEhPWI8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxICE9ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl9ub3RFcXVhbHMoc2hvcnQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhICE9IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSBiaW5hcnkgPGNvZGU+cG93ZXI8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBKYXZhJ3MgPGNvZGU+TWF0aC5wb3coKTwvY29kZT4gZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+TWF0aC5wb3coYSwgYik8L2NvZGU+CisJICogQHNpbmNlIDIuMworCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iJDMucG93KCQxLCAkMikiLCBpbXBvcnRlZD1NYXRoLmNsYXNzKQorCXB1YmxpYyBzdGF0aWMgZG91YmxlIG9wZXJhdG9yX3Bvd2VyKHNob3J0IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gTWF0aC5wb3coYSwgYik7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBlcXVhbHM8L2NvZGU+IG9wZXJhdG9yLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIEphdmEncyA8Y29kZT49PTwvY29kZT4KKwkgKiBvcGVyYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYSAgYSBzaG9ydC4KKwkgKiBAcGFyYW0gYiAgYSBieXRlLgorCSAqIEByZXR1cm4gICA8Y29kZT5hID09IGI8L2NvZGU+CisJICogQHNpbmNlIDIuNAorCSAqLworCUBQdXJlCisJQElubGluZSh2YWx1ZT0iKCQxID09ICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVyYXRvcl90cmlwbGVFcXVhbHMoc2hvcnQgYSwgYnl0ZSBiKSB7CisJCXJldHVybiBhID09IGI7CisJfQorCQorCS8qKgorCSAqIFRoZSA8Y29kZT5pZGVudGl0eSBub3QgZXF1YWxzPC9jb2RlPiBvcGVyYXRvci4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBKYXZhJ3MgPGNvZGU+IT08L2NvZGU+CisJICogb3BlcmF0b3IuCisJICogCisJICogQHBhcmFtIGEgIGEgc2hvcnQuCisJICogQHBhcmFtIGIgIGEgYnl0ZS4KKwkgKiBAcmV0dXJuICAgPGNvZGU+YSAhPSBiPC9jb2RlPgorCSAqIEBzaW5jZSAyLjQKKwkgKi8KKwlAUHVyZQorCUBJbmxpbmUodmFsdWU9IigkMSAhPSAkMikiLCBjb25zdGFudEV4cHJlc3Npb249dHJ1ZSkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlcmF0b3JfdHJpcGxlTm90RXF1YWxzKHNob3J0IGEsIGJ5dGUgYikgeworCQlyZXR1cm4gYSAhPSBiOworCX0KKwkKKwkvLyBFTkQgZ2VuZXJhdGVkIGNvZGUKKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvU3RyaW5nRXh0ZW5zaW9ucy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvU3RyaW5nRXh0ZW5zaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTE3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9TdHJpbmdFeHRlbnNpb25zLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKKworCisvKioKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIGxpYnJhcnkgZm9yIHtAbGluayBTdHJpbmcgc3RyaW5nc30uCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZSAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqLworQEd3dENvbXBhdGlibGUgcHVibGljIGNsYXNzIFN0cmluZ0V4dGVuc2lvbnMgeworCisJLyoqCisJICogVGhlIGJpbmFyeSA8Y29kZT4rPC9jb2RlPiBvcGVyYXRvciB0aGF0IGNvbmNhdGVuYXRlcyBhIHN0cmluZyBhbmQgdGhlIHN0cmluZworCSAqIHJlcHJlbnRhdGlvbiBvZiBhbiBvYmplY3QuCisJICogCisJICogQHBhcmFtIGEKKwkgKiAgICAgICAgICAgIGEgc3RyaW5nLgorCSAqIEBwYXJhbSBiCisJICogICAgICAgICAgICBhbiBvYmplY3QuCisJICogQHJldHVybiA8Y29kZT5hICsgYjwvY29kZT4KKwkgKi8KKwlAUHVyZSAvKiBub3QgZ3VhcmFudGVlZCwgc2luY2UgdG9TdHJpbmcoKSBpcyBpbnZva2VkICovCisJQElubGluZSh2YWx1ZT0iKCQxICsgJDIpIiwgY29uc3RhbnRFeHByZXNzaW9uPXRydWUpCisJcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlcmF0b3JfcGx1cyhTdHJpbmcgYSwgT2JqZWN0IGIpIHsKKwkJcmV0dXJuIGEgKyBiOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYmluYXJ5IDxjb2RlPis8L2NvZGU+IG9wZXJhdG9yIHRoYXQgY29uY2F0ZW5hdGVzIHR3byBzdHJpbmdzLgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBhIHN0cmluZy4KKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgYW5vdGhlciBzdHJpbmcuCisJICogQHJldHVybiA8Y29kZT5hICsgYjwvY29kZT4KKwkgKiAKKwkgKiBAc2luY2UgMi41CisJICovCisJQFB1cmUgLyogbm90IGd1YXJhbnRlZWQsIHNpbmNlIHRvU3RyaW5nKCkgaXMgaW52b2tlZCAqLworCUBJbmxpbmUodmFsdWU9IigkMSArICQyKSIsIGNvbnN0YW50RXhwcmVzc2lvbj10cnVlKQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZXJhdG9yX3BsdXMoU3RyaW5nIGEsIFN0cmluZyBiKSB7CisJCXJldHVybiBhICsgYjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHtAY29kZSBzfSBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBlcXVhbCB0byB0aGUgZW1wdHkge0BsaW5rIFN0cmluZ30gPGNvZGU+IiI8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBzCisJICogICAgICAgICAgICB0aGUgc3RyaW5nCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB7QGNvZGUgc30gaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgZXF1YWwgdG8gdGhlIGVtcHR5IHtAbGluayBTdHJpbmd9IDxjb2RlPiIiPC9jb2RlPgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzTnVsbE9yRW1wdHkoU3RyaW5nIHMpIHsKKwkJcmV0dXJuIHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDA7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFN0cmluZ30ge0Bjb2RlIHN9IHdpdGggYW4ge0BsaW5rIENoYXJhY3RlciNpc1VwcGVyQ2FzZShjaGFyKSB1cHBlciBjYXNlfSBmaXJzdCBjaGFyYWN0ZXIuIFRoaXMKKwkgKiBmdW5jdGlvbiBpcyBudWxsLXNhZmUuCisJICogCisJICogQHBhcmFtIHMKKwkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdGhhdCBzaG91bGQgZ2V0IGFuIHVwcGVyIGNhc2UgZmlyc3QgY2hhcmFjdGVyLiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHJldHVybiB0aGUge0BsaW5rIFN0cmluZ30ge0Bjb2RlIHN9IHdpdGggYW4gdXBwZXIgY2FzZSBmaXJzdCBjaGFyYWN0ZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGlucHV0CisJICogICAgICAgICB7QGxpbmsgU3RyaW5nfSB7QGNvZGUgc30gd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCUBQdXJlCisJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9GaXJzdFVwcGVyKFN0cmluZyBzKSB7CisJCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorCQkJcmV0dXJuIHM7CisJCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uocy5jaGFyQXQoMCkpKQorCQkJcmV0dXJuIHM7CisJCWlmIChzLmxlbmd0aCgpID09IDEpCisJCQlyZXR1cm4gcy50b1VwcGVyQ2FzZSgpOworCQlyZXR1cm4gcy5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHMuc3Vic3RyaW5nKDEpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBTdHJpbmd9IHtAY29kZSBzfSB3aXRoIGFuIHtAbGluayBDaGFyYWN0ZXIjaXNMb3dlckNhc2UoY2hhcikgbG93ZXIgY2FzZX0gZmlyc3QgY2hhcmFjdGVyLiBUaGlzCisJICogZnVuY3Rpb24gaXMgbnVsbC1zYWZlLgorCSAqIAorCSAqIEBwYXJhbSBzCisJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRoYXQgc2hvdWxkIGdldCBhbiBsb3dlciBjYXNlIGZpcnN0IGNoYXJhY3Rlci4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEByZXR1cm4gdGhlIHtAbGluayBTdHJpbmd9IHtAY29kZSBzfSB3aXRoIGFuIGxvd2VyIGNhc2UgZmlyc3QgY2hhcmFjdGVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbnB1dAorCSAqICAgICAgICAge0BsaW5rIFN0cmluZ30ge0Bjb2RlIHN9IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlAUHVyZQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRmlyc3RMb3dlcihTdHJpbmcgcykgeworCQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKKwkJCXJldHVybiBzOworCQlpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHMuY2hhckF0KDApKSkKKwkJCXJldHVybiBzOworCQlpZiAocy5sZW5ndGgoKSA9PSAxKQorCQkJcmV0dXJuIHMudG9Mb3dlckNhc2UoKTsKKwkJcmV0dXJuIHMuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBzLnN1YnN0cmluZygxKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9pbnRlcm5hbC9Cb29sZWFuRnVuY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvaW50ZXJuYWwvQm9vbGVhbkZ1bmN0aW9uRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzBiNzJkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvaW50ZXJuYWwvQm9vbGVhbkZ1bmN0aW9uRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5GdW5jdGlvbnMuRnVuY3Rpb24xOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKKworLyoqCisgKiBJbnRlcm5hbCB3cmFwcGVyIHRvIGxvb2sgbGlrZSBhIGdvb2dsZS5jb2xsZWN0IHByZWRpY2F0ZQorICogCisgKiBAcGFyYW0gPFQ+CisgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBvYmplY3RzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhpcyBwcmVkaWNhdGUuCisgKi8KK0BHd3RDb21wYXRpYmxlIHB1YmxpYyBjbGFzcyBCb29sZWFuRnVuY3Rpb25EZWxlZ2F0ZTxUPiBpbXBsZW1lbnRzIFByZWRpY2F0ZTxUPiB7CisKKwlwcml2YXRlIGZpbmFsIEZ1bmN0aW9uMTw/IHN1cGVyIFQsIEJvb2xlYW4+IGRlbGVnYXRlOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQm9vbGVhbkZ1bmN0aW9uRGVsZWdhdGV9IHRoYXQgd3JhcHMgdGhlIGdpdmVuIGRlbGVnYXRlIGZ1bmN0aW9uLiBUaGlzIGltcGxlbWVudGF0aW9uIHdpbGwKKwkgKiB0aHJvdyBhIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0gaWYgdGhlIGRlbGVnYXRlJ3Mge0BsaW5rIEZ1bmN0aW9uMSNhcHBseShPYmplY3QpIGltcGxlbWVudGF0aW9ufSByZXR1cm5zCisJICogPGNvZGU+bnVsbDwvY29kZT4gZm9yIGEgZ2l2ZW4gb2JqZWN0LgorCSAqIAorCSAqIEBwYXJhbSBkZWxlZ2F0ZQorCSAqICAgICAgICAgICAgdGhlIGRlbGVnYXRlIGZ1bmN0aW9uLiBNYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBCb29sZWFuRnVuY3Rpb25EZWxlZ2F0ZShGdW5jdGlvbjE8PyBzdXBlciBULCBCb29sZWFuPiBkZWxlZ2F0ZSkgeworCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZGVsZWdhdGUiKTsKKwkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGFwcGx5KFQgaW5wdXQpIHsKKwkJQm9vbGVhbiByZXN1bHQgPSBkZWxlZ2F0ZS5hcHBseShpbnB1dCk7CisJCXJldHVybiByZXN1bHQuYm9vbGVhblZhbHVlKCk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvaW50ZXJuYWwvRnVuY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvaW50ZXJuYWwvRnVuY3Rpb25EZWxlZ2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNmQ0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9pbnRlcm5hbC9GdW5jdGlvbkRlbGVnYXRlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworCisvKioKKyAqIEludGVybmFsIHdyYXBwZXIgdG8gbG9vayBsaWtlIGEgZ29vZ2xlLmNvbGxlY3QgZnVuY3Rpb24KKyAqIAorICogQHBhcmFtIDxQPgorICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnRzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uLgorICogQHBhcmFtIDxSPgorICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IGluc3RhbmNlcyBvZiB0aGlzIGZ1bmN0aW9uLgorICogQGF1dGhvciBTZWJhc3RpYW4gWmFybmVrb3cgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKi8KK0BHd3RDb21wYXRpYmxlIHB1YmxpYyBjbGFzcyBGdW5jdGlvbkRlbGVnYXRlPFAsIFI+IGltcGxlbWVudHMgRnVuY3Rpb248UCwgUj4geworCisJcHJpdmF0ZSBmaW5hbCBGdW5jdGlvbnMuRnVuY3Rpb24xPD8gc3VwZXIgUCwgPyBleHRlbmRzIFI+IGRlbGVnYXRlOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgRnVuY3Rpb25EZWxlZ2F0ZX0gdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gZGVsZWdhdGUgZnVuY3Rpb24uCisJICogCisJICogQHBhcmFtIGRlbGVnYXRlCisJICogICAgICAgICAgICB0aGUgZGVsZWdhdGUgZnVuY3Rpb24uIE1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHVibGljIEZ1bmN0aW9uRGVsZWdhdGUoRnVuY3Rpb25zLkZ1bmN0aW9uMTw/IHN1cGVyIFAsID8gZXh0ZW5kcyBSPiBkZWxlZ2F0ZSkgeworCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZGVsZWdhdGUiKTsKKwkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIGFwcGx5KFAgaW5wdXQpIHsKKwkJUiByZXN1bHQgPSBkZWxlZ2F0ZS5hcHBseShpbnB1dCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvaW50ZXJuYWwvS2V5Q29tcGFyYXRvci5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvaW50ZXJuYWwvS2V5Q29tcGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDk5M2UKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9pbnRlcm5hbC9LZXlDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuaW50ZXJuYWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5GdW5jdGlvbnMuRnVuY3Rpb24xOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKKworLyoqCisgKiBBIGNvbXBhcmF0b3IgdGhhdCBjb21wYXJlcyBvYmplY3RzIGJ5IGNhbGxpbmcgdGhlIHN1cHBsaWVkIGtleSBmdW5jdGlvbiBvbiB0aGVtIGFuZCB0aGVuIGNvbXBhcmluZyB0aGUgcmVzdWx0aW5nCisgKiBrZXlzLiBJdCBpcyBudWxsLXNhZmUgaWYgdGhlIGtleSdzIGNvbXBhcmVUbyBtZXRob2QgaXMgbnVsbC1zYWZlLgorICogCisgKiBAcGFyYW0gPFQ+CisgKiAgICAgICAgICAgIHRoZSB0eXBlIHRvIGNvbXBhcmUKKyAqIEBwYXJhbSA8Qz4KKyAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGNvbXBhcmFibGUga2V5CisgKi8KK0BHd3RDb21wYXRpYmxlCitwdWJsaWMgZmluYWwgY2xhc3MgS2V5Q29tcGFyYXRvcjxULCBDIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEM+PiBpbXBsZW1lbnRzIENvbXBhcmF0b3I8VD4geworCXByaXZhdGUgZmluYWwgRnVuY3Rpb24xPD8gc3VwZXIgVCwgQz4ga2V5RnVuY3Rpb247CisKKwkvKioKKwkgKiBAcGFyYW0ga2V5RnVuY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSBrZXkgZnVuY3Rpb24gdG8gdXNlIGZvciBjb21wYXJpbmcgb2JqZWN0cy4gTWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBLZXlDb21wYXJhdG9yKEZ1bmN0aW9uMTw/IHN1cGVyIFQsIEM+IGtleUZ1bmN0aW9uKSB7CisJCXRoaXMua2V5RnVuY3Rpb24gPSBjaGVja05vdE51bGwoa2V5RnVuY3Rpb24sICJrZXlGdW5jdGlvbiIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgY29tcGFyZShUIGEsIFQgYikgeworCQlDIGMxID0ga2V5RnVuY3Rpb24uYXBwbHkoYSk7CisJCUMgYzIgPSBrZXlGdW5jdGlvbi5hcHBseShiKTsKKwkJaWYgKGMxID09IGMyKSB7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChjMSAhPSBudWxsKSB7CisJCQlyZXR1cm4gYzEuY29tcGFyZVRvKGMyKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtYzIuY29tcGFyZVRvKGMxKTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi9pbnRlcm5hbC9Ub1N0cmluZ0hlbHBlci5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvaW50ZXJuYWwvVG9TdHJpbmdIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWY4NGNmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvaW50ZXJuYWwvVG9TdHJpbmdIZWxwZXIuamF2YQpAQCAtMCwwICsxLDE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5pbnRlcm5hbDsKKworCisvKioKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZSAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqLworQERlcHJlY2F0ZWQKK3B1YmxpYyBjbGFzcyBUb1N0cmluZ0hlbHBlciBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi51dGlsLlRvU3RyaW5nSGVscGVyIHsKKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvaW50ZXJuYWwvVW5tb2RpZmlhYmxlTWVyZ2luZ01hcFZpZXcuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL2ludGVybmFsL1VubW9kaWZpYWJsZU1lcmdpbmdNYXBWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlODcyZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL2ludGVybmFsL1VubW9kaWZpYWJsZU1lcmdpbmdNYXBWaWV3LmphdmEKQEAgLTAsMCArMSwxNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgVW5pdmVyc2l0ZSBkZSBUZWNobm9sb2dpZSBkZSBCZWxmb3J0LU1vbnRiZWxpYXJkIChodHRwOi8vd3d3LnV0Ym0uZnIpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7CisKKy8qKgorICogTWFwIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgbWVyZ2luZyB0d28gbWFwcy4KKyAqCisgKiA8cD5JZiBhIGtleSBleGlzdHMgd2l0aGluIHRoZSB0d28gbWVyZ2VkIG1hcHMsIHRoZW4gdGhlIHJldGFpbmVkIHZhbHVlIGlzIHRoZSBvbmUgb2YgdGhlIHJpZ2h0IG1hcC4KKyAqCisgKiBAYXV0aG9yIFN0ZXBoYW5lIEdhbGxhbmQgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKiBAc2luY2UgMi4xNQorICogQHBhcmFtIDxLPiB0aGUgdHlwZSBvZiB0aGUga2V5cy4KKyAqIEBwYXJhbSA8Vj4gdGhlIHR5cGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgbWFwcy4KKyAqLworQEd3dENvbXBhdGlibGUKK3B1YmxpYyBjbGFzcyBVbm1vZGlmaWFibGVNZXJnaW5nTWFwVmlldzxLLCBWPiBleHRlbmRzIEFic3RyYWN0TWFwPEssIFY+IHsKKworCXByaXZhdGUgZmluYWwgTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbGVmdDsKKworCXByaXZhdGUgZmluYWwgTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gcmlnaHQ7CisKKwkvKiogQ29uc3RydWN0IHRoZSB3cmFwcGluZyBtYXAuCisJICoKKwkgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCBvcGVyYW5kIHRvIG1lcmdlLgorCSAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgb3BlcmFuZCB0byBtZXJnZS4KKwkgKi8KKwlwdWJsaWMgVW5tb2RpZmlhYmxlTWVyZ2luZ01hcFZpZXcoTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbGVmdCwgTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gcmlnaHQpIHsKKwkJYXNzZXJ0IGxlZnQgIT0gbnVsbCA6ICJsZWZ0IG11c3Qgbm90IGJlIG51bGwiOyAvLyROT04tTkxTLTEkCisJCWFzc2VydCByaWdodCAhPSBudWxsIDogInJpZ2h0IG11c3Qgbm90IGJlIG51bGwiOyAvLyROT04tTkxTLTEkCisJCXRoaXMubGVmdCA9IGxlZnQ7CisJCXRoaXMucmlnaHQgPSByaWdodDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU2V0PEVudHJ5PEssIFY+PiBlbnRyeVNldCgpIHsKKwkJLy8gQSBjYWxsIHRvICJTZXRzLnVuaW9uKGtzMSwga3MyKSIgZG9lcyBub3Qgd29yayBiZWNhdXNlIG9mIHRoZSBlcXVhbHMoKSBkZWZpbml0aW9uIG9uIE1hcC5FbnRyeS4KKwkJLy8gVGhpcyBlcXVhbGl0eSB0ZXN0IGJyZWFrcyB0aGUgdW5pY2l0eSBvZiB0aGUga2V5cyBvdmVyIHRoZSByZXN1bHRpbmcgU2V0LgorCQkvLyBJbiBvdGhlciB3b3JkcywgIlNldHMudW5pb24oa3MxLCBrczIpIiByZXBsaWVzIGFsbCB0aGUgZW50cmllcyB0aGF0CisJCS8vIGFyZSBkaWZmZXJlbnQgb24gdGhlaXIga2V5cyBvciB2YWx1ZXMuCisKKwkJZmluYWwgU2V0PEVudHJ5PEssIFY+PiBkaWZmID0gIGRpZmZlcmVuY2UodGhpcy5sZWZ0LCB0aGlzLnJpZ2h0KTsKKwkJcmV0dXJuIG5ldyBBYnN0cmFjdEVhcmx5RmFpbGluZ1NldDxFbnRyeTxLLCBWPj4oKSB7CisJCQlAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAicmF3dHlwZXMiLCAic3ludGhldGljLWFjY2VzcyIgfSkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPEVudHJ5PEssIFY+PiBpdGVyYXRvcigpIHsKKwkJCQlyZXR1cm4gSXRlcmF0b3JzLnVubW9kaWZpYWJsZUl0ZXJhdG9yKChJdGVyYXRvcikgSXRlcmF0b3JzLmNvbmNhdCgKKwkJCQkJCVVubW9kaWZpYWJsZU1lcmdpbmdNYXBWaWV3LnRoaXMucmlnaHQuZW50cnlTZXQoKS5pdGVyYXRvcigpLCBkaWZmLml0ZXJhdG9yKCkpKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgaW50IHNpemUoKSB7CisJCQkJcmV0dXJuIEl0ZXJhdG9ycy5zaXplKGl0ZXJhdG9yKCkpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgc3RhdGljIDxLLCBWPiBTZXQ8RW50cnk8SywgVj4+IGRpZmZlcmVuY2UoZmluYWwgTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbGVmdCwgZmluYWwgTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gcmlnaHQpIHsKKwkJZmluYWwgUHJlZGljYXRlPEVudHJ5PD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4+IG5vdEluU2V0ID0gbmV3IFByZWRpY2F0ZTxNYXAuRW50cnk8PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWPj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGFwcGx5KEVudHJ5PD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gaXQpIHsKKwkJCQlpZiAoaXQgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCXJldHVybiAhcmlnaHQuY29udGFpbnNLZXkoaXQuZ2V0S2V5KCkpOworCQkJfQorCQl9OworCisJCXJldHVybiBuZXcgQWJzdHJhY3RFYXJseUZhaWxpbmdTZXQ8RW50cnk8SywgVj4+KCkgeworCQkJQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIiwgInJhd3R5cGVzIiB9KQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8RW50cnk8SywgVj4+IGl0ZXJhdG9yKCkgeworCQkJCXJldHVybiBJdGVyYXRvcnMudW5tb2RpZmlhYmxlSXRlcmF0b3IoKEl0ZXJhdG9yKSBJdGVyYXRvcnMuZmlsdGVyKGxlZnQuZW50cnlTZXQoKS5pdGVyYXRvcigpLCBub3RJblNldCkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBpbnQgc2l6ZSgpIHsKKwkJCQlyZXR1cm4gSXRlcmF0b3JzLnNpemUoaXRlcmF0b3IoKSk7CisJCQl9CisJCX07CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2xlYXIoKSB7CisJCS8vIEZhaWwgZXZlbiBpZiB0aGUgc2V0IGlzIGVtcHR5LgorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgViBwdXQoSyBrZXksIFYgdmFsdWUpIHsKKwkJLy8gRmFpbCBldmVuIGlmIHRoZSBzZXQgaXMgZW1wdHkuCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBWIHJlbW92ZShPYmplY3Qga2V5KSB7CisJCS8vIEZhaWwgZXZlbiBpZiB0aGUgc2V0IGlzIGVtcHR5LgorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXBsYWNlQWxsKEJpRnVuY3Rpb248PyBzdXBlciBLLCA/IHN1cGVyIFYsID8gZXh0ZW5kcyBWPiBmdW5jdGlvbikgeworCQkvLyBGYWlsIGV2ZW4gaWYgdGhlIHNldCBpcyBlbXB0eS4KKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLyoqCisJICogQWJzdHJhY3QgaW1wbGVtZW50cyBvZiBhIHNldCB0aGF0IGlzIGZhaWxpbmcgYXMgc29vbiBhcyBwb3NzaWJsZQorCSAqIHdoZW4gbW9kaWZpZXJzIGFyZSBjYWxsZWQuCisJICoKKwkgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSBzZXQgZWxlbWVudHMuCisJICogQGF1dGhvciAkQXV0aG9yOiBzZ2FsbGFuZCQKKwkgKiBAdmVyc2lvbiAkRnVsbFZlcnNpb24kCisJICogQG1hdmVuZ3JvdXBpZCAkR3JvdXBJZCQKKwkgKiBAbWF2ZW5hcnRpZmFjdGlkICRBcnRpZmFjdElkJAorCSAqLworCUBHd3RDb21wYXRpYmxlCisJcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQWJzdHJhY3RFYXJseUZhaWxpbmdTZXQ8VD4gZXh0ZW5kcyBBYnN0cmFjdFNldDxUPiB7CisKKwkJQWJzdHJhY3RFYXJseUZhaWxpbmdTZXQoKSB7CisJCQkvLworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGNsZWFyKCkgeworCQkJLy8gRmFpbCBldmVuIGlmIHRoZSBzZXQgaXMgZW1wdHkuCisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBhZGQoVCBlbnRyeSkgeworCQkJLy8gRmFpbCBldmVuIGlmIHRoZSBzZXQgaXMgZW1wdHkuCisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCS8vIEZhaWwgZXZlbiBpZiB0aGUgc2V0IGlzIGVtcHR5LgorCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvdXRpbC9SZWZsZWN0RXh0ZW5zaW9ucy5qYXZhIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvdXRpbC9SZWZsZWN0RXh0ZW5zaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMTJiYTMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi91dGlsL1JlZmxlY3RFeHRlbnNpb25zLmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLnV0aWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworCisvKioKKyAqIEV4dGVuc2lvbiBtZXRob2RzIHRvIHNpbXBsaWZ5IHJlZmxlY3RpdmUgaW52b2NhdGlvbiBvZiBtZXRob2RzIGFuZCBmaWVsZHMuCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZSAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqIEBzaW5jZSAyLjMKKyAqLworQEJldGEKK3B1YmxpYyBjbGFzcyBSZWZsZWN0RXh0ZW5zaW9ucyB7CisKKwkvKioKKwkgKiBTZXRzIHRoZSBnaXZlbiB2YWx1ZSBvbiBhbiB0aGUgcmVjZWl2ZXJzJ3MgYWNjZXNzaWJsZSBmaWVsZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIAorCSAqIEBwYXJhbSByZWNlaXZlciB0aGUgcmVjZWl2ZXIsIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHBhcmFtIGZpZWxkTmFtZSB0aGUgZmllbGQncyBuYW1lLCBuZXZlciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0CisJICogCisJICogQHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBzZWUge0BsaW5rIENsYXNzI2dldEZpZWxkKFN0cmluZyl9CisJICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBzZWUge0BsaW5rIENsYXNzI2dldEZpZWxkKFN0cmluZyl9CisJICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHNlZSB7QGxpbmsgRmllbGQjc2V0KE9iamVjdCwgT2JqZWN0KX0KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzZWUge0BsaW5rIEZpZWxkI3NldChPYmplY3QsIE9iamVjdCl9CisJICovCisJcHVibGljIHZvaWQgc2V0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIGZpZWxkTmFtZSwgLyogQE51bGxhYmxlICovIE9iamVjdCB2YWx1ZSkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLCBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKwkJUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwocmVjZWl2ZXIsInJlY2VpdmVyIik7CisJCVByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGZpZWxkTmFtZSwiZmllbGROYW1lIik7CisJCUNsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+IGNsYXp6ID0gcmVjZWl2ZXIuZ2V0Q2xhc3MoKTsKKwkJRmllbGQgZiA9IGdldERlY2xhcmVkRmllbGQoY2xhenosIGZpZWxkTmFtZSk7CisJCWlmICghZi5pc0FjY2Vzc2libGUoKSkKKwkJCWYuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKwkJZi5zZXQocmVjZWl2ZXIsIHZhbHVlKTsKKwl9CisJCisJLyoqCisJICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYWNjZXNzaWJsZSBmaWVsZCBvZiB0aGUgZ2l2ZW4gcmVjZWl2ZXIuCisJICogCisJICogQHBhcmFtIHJlY2VpdmVyIHRoZSBjb250YWluZXIgb2YgdGhlIGZpZWxkLCBub3QgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcGFyYW0gZmllbGROYW1lIHRoZSBmaWVsZCdzIG5hbWUsIG5vdCA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAorCSAqIAorCSAqIEB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gc2VlIHtAbGluayBDbGFzcyNnZXRGaWVsZChTdHJpbmcpfQorCSAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gc2VlIHtAbGluayBDbGFzcyNnZXRGaWVsZChTdHJpbmcpfQorCSAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBzZWUge0BsaW5rIEZpZWxkI2dldChPYmplY3QpfQorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNlZSB7QGxpbmsgRmllbGQjZ2V0KE9iamVjdCl9CisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJLyogQE51bGxhYmxlICovCisJcHVibGljIDxUPiBUIGdldChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisJCVByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHJlY2VpdmVyLCJyZWNlaXZlciIpOworCQlQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChmaWVsZE5hbWUsImZpZWxkTmFtZSIpOworCQkKKwkJQ2xhc3M8PyBleHRlbmRzIE9iamVjdD4gY2xhenogPSByZWNlaXZlci5nZXRDbGFzcygpOworCQlGaWVsZCBmID0gZ2V0RGVjbGFyZWRGaWVsZChjbGF6eiwgZmllbGROYW1lKTsKKwkJaWYgKCFmLmlzQWNjZXNzaWJsZSgpKQorCQkJZi5zZXRBY2Nlc3NpYmxlKHRydWUpOworCQlyZXR1cm4gKFQpIGYuZ2V0KHJlY2VpdmVyKTsKKwl9CisJCisJcHJpdmF0ZSBGaWVsZCBnZXREZWNsYXJlZEZpZWxkKENsYXNzPD8+IGNsYXp6LCBTdHJpbmcgbmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKKwkJTm9TdWNoRmllbGRFeGNlcHRpb24gaW5pdGlhbEV4Y2VwdGlvbiA9IG51bGw7CisJCWRvIHsKKwkJCXRyeSB7CisJCQkJRmllbGQgZiA9IGNsYXp6LmdldERlY2xhcmVkRmllbGQobmFtZSk7CisJCQkJcmV0dXJuIGY7CisJCQl9IGNhdGNoKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5vU3VjaEZpZWxkKSB7CisJCQkJaWYgKGluaXRpYWxFeGNlcHRpb24gPT0gbnVsbCkgeworCQkJCQlpbml0aWFsRXhjZXB0aW9uID0gbm9TdWNoRmllbGQ7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlKChjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKSkgIT0gbnVsbCk7CisJCXRocm93IGluaXRpYWxFeGNlcHRpb247CisJfQorCQorCS8qKgorCSAqIEludm9rZXMgdGhlIGZpcnN0IGFjY2Vzc2libGUgbWV0aG9kIGRlZmluZWQgb24gdGhlIHJlY2VpdmVyJ2MgY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQKKwkgKiBhIHBhcmFtZXRlciBsaXN0IGNvbXBhdGlibGUgdG8gdGhlIGdpdmVuIGFyZ3VtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gcmVjZWl2ZXIgdGhlIG1ldGhvZCBjYWxsIHJlY2VpdmVyLCBub3QgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbWV0aG9kIG5hbWUsIG5vdCA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBwYXJhbSBhcmdzIHRoZSBhcmd1bWVudHMgZm9yIHRoZSBtZXRob2QgaW52b2NhdGlvbgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGludm9jYXRpb24uIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtZXRob2Qgd2FzIG9mIHR5cGUgdm9pZC4KKwkgKiAKKwkgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHNlZSB7QGxpbmsgQ2xhc3MjZ2V0TWV0aG9kKFN0cmluZywgQ2xhc3MuLi4pfQorCSAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHNlZSB7QGxpbmsgQ2xhc3MjZ2V0TWV0aG9kKFN0cmluZywgQ2xhc3MuLi4pfQorCSAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBzZWUge0BsaW5rIE1ldGhvZCNpbnZva2UoT2JqZWN0LCBPYmplY3QuLi4pfQorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNlZSB7QGxpbmsgTWV0aG9kI2ludm9rZShPYmplY3QsIE9iamVjdC4uLil9CisJICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHNlZSB7QGxpbmsgTWV0aG9kI2ludm9rZShPYmplY3QsIE9iamVjdC4uLil9CisJICovCisJLyogQE51bGxhYmxlICovCisJcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgLyogQE51bGxhYmxlICovIE9iamVjdC4uLmFyZ3MpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworCQlQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChyZWNlaXZlciwicmVjZWl2ZXIiKTsKKwkJUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwobWV0aG9kTmFtZSwibWV0aG9kTmFtZSIpOworCQlmaW5hbCBPYmplY3RbXSBhcmd1bWVudHMgPSBhcmdzPT1udWxsID8gbmV3IE9iamVjdFtde251bGx9OmFyZ3M7CisJCQorCQlDbGFzczw/IGV4dGVuZHMgT2JqZWN0PiBjbGF6eiA9IHJlY2VpdmVyLmdldENsYXNzKCk7CisJCU1ldGhvZCBjb21wYXRpYmxlID0gbnVsbDsKKwkJZG8geworCQkJZm9yIChNZXRob2QgY2FuZGlkYXRlIDogY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKKwkJCQlpZiAoY2FuZGlkYXRlICE9IG51bGwgJiYgIWNhbmRpZGF0ZS5pc0JyaWRnZSgpICYmIGlzQ29tcGF0aWJsZShjYW5kaWRhdGUsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cykpIHsKKwkJCQkJaWYgKGNvbXBhdGlibGUgIT0gbnVsbCkgCisJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBbWJpZ3VvdXMgbWV0aG9kcyB0byBpbnZva2UuIEJvdGggIitjb21wYXRpYmxlKyIgYW5kICAiK2NhbmRpZGF0ZSsiIHdvdWxkIGJlIGNvbXBhdGlibGUgY2hvaWNlcy4iKTsKKwkJCQkJY29tcGF0aWJsZSA9IGNhbmRpZGF0ZTsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUoY29tcGF0aWJsZSA9PSBudWxsICYmIChjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKSkgIT0gbnVsbCk7CisJCWlmIChjb21wYXRpYmxlICE9IG51bGwpIHsKKwkJCWlmICghY29tcGF0aWJsZS5pc0FjY2Vzc2libGUoKSkKKwkJCQljb21wYXRpYmxlLnNldEFjY2Vzc2libGUodHJ1ZSk7CisJCQlyZXR1cm4gY29tcGF0aWJsZS5pbnZva2UocmVjZWl2ZXIsIGFyZ3VtZW50cyk7CisJCX0KKwkJLy8gbm90IGZvdW5kIHByb3Zva2UgbWV0aG9kIG5vdCBmb3VuZCBleGNlcHRpb24KKwkJQ2xhc3M8Pz5bXSBwYXJhbVR5cGVzID0gbmV3IENsYXNzPD8+W2FyZ3VtZW50cy5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaTwgYXJndW1lbnRzLmxlbmd0aCA7IGkrKykgeworCQkJcGFyYW1UeXBlc1tpXSA9IGFyZ3VtZW50c1tpXSA9PSBudWxsID8gT2JqZWN0LmNsYXNzIDogYXJndW1lbnRzW2ldLmdldENsYXNzKCk7CisJCX0KKwkJTWV0aG9kIG1ldGhvZCA9IHJlY2VpdmVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtVHlwZXMpOworCQlyZXR1cm4gbWV0aG9kLmludm9rZShyZWNlaXZlciwgYXJndW1lbnRzKTsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGlzQ29tcGF0aWJsZShNZXRob2QgY2FuZGlkYXRlLCBTdHJpbmcgZmVhdHVyZU5hbWUsIE9iamVjdC4uLiBhcmdzKSB7CisJCWlmICghY2FuZGlkYXRlLmdldE5hbWUoKS5lcXVhbHMoZmVhdHVyZU5hbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoY2FuZGlkYXRlLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoICE9IGFyZ3MubGVuZ3RoKQorCQkJcmV0dXJuIGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaTwgY2FuZGlkYXRlLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoOyBpKyspIHsKKwkJCU9iamVjdCBwYXJhbSA9IGFyZ3NbaV07CisJCQlDbGFzczw/PiBjbGFzczEgPSBjYW5kaWRhdGUuZ2V0UGFyYW1ldGVyVHlwZXMoKVtpXTsKKwkJCWlmIChjbGFzczEuaXNQcmltaXRpdmUoKSkKKwkJCQljbGFzczEgPSB3cmFwcGVyVHlwZUZvcihjbGFzczEpOworCQkJaWYgKHBhcmFtICE9IG51bGwgJiYgIWNsYXNzMS5pc0luc3RhbmNlKHBhcmFtKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXByaXZhdGUgQ2xhc3M8Pz4gd3JhcHBlclR5cGVGb3IoQ2xhc3M8Pz4gcHJpbWl0aXZlKSB7CisJCVByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHByaW1pdGl2ZSk7CisgICAgICAgIGlmIChwcmltaXRpdmUgPT0gQm9vbGVhbi5UWVBFKSByZXR1cm4gQm9vbGVhbi5jbGFzczsKKyAgICAgICAgaWYgKHByaW1pdGl2ZSA9PSBCeXRlLlRZUEUpIHJldHVybiBCeXRlLmNsYXNzOworICAgICAgICBpZiAocHJpbWl0aXZlID09IENoYXJhY3Rlci5UWVBFKSByZXR1cm4gQ2hhcmFjdGVyLmNsYXNzOworICAgICAgICBpZiAocHJpbWl0aXZlID09IFNob3J0LlRZUEUpIHJldHVybiBTaG9ydC5jbGFzczsKKyAgICAgICAgaWYgKHByaW1pdGl2ZSA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiBJbnRlZ2VyLmNsYXNzOworICAgICAgICBpZiAocHJpbWl0aXZlID09IExvbmcuVFlQRSkgcmV0dXJuIExvbmcuY2xhc3M7CisgICAgICAgIGlmIChwcmltaXRpdmUgPT0gRmxvYXQuVFlQRSkgcmV0dXJuIEZsb2F0LmNsYXNzOworICAgICAgICBpZiAocHJpbWl0aXZlID09IERvdWJsZS5UWVBFKSByZXR1cm4gRG91YmxlLmNsYXNzOworICAgICAgICBpZiAocHJpbWl0aXZlID09IFZvaWQuVFlQRSkgcmV0dXJuIFZvaWQuY2xhc3M7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocHJpbWl0aXZlKyAiIGlzIG5vdCBhIHByaW1pdGl2ZSIpOworICAgIH0KKwkKK30KZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL3V0aWwvVG9TdHJpbmdCdWlsZGVyLmphdmEgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi91dGlsL1RvU3RyaW5nQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzFkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL2xpYi91dGlsL1RvU3RyaW5nQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMzY3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIudXRpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RJbmNvbXBhdGlibGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuQ29sbGVjdGlvbkxpdGVyYWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Db252ZXJzaW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuSXRlcmFibGVFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi51dGlsLlRvU3RyaW5nQ29udGV4dDsKKworLyoqCisgKiBIZWxwcyB3aXRoIHRoZSBjb25zdHJ1Y3Rpb24gb2YgZ29vZCB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCl9IHJlcHJlc2VudGF0aW9ucy4KKyAqIDxwPllvdSBjYW4gY3VzdG9taXplIHRoZSBvdXRwdXQgdXNpbmcgdGhlIGJ1aWxkZXItc3R5bGUgbWV0aG9kcyB7QGxpbmsgVG9TdHJpbmdCdWlsZGVyI3NpbmdsZUxpbmUoKX0ge0BsaW5rIFRvU3RyaW5nQnVpbGRlciNza2lwTnVsbHMoKX0gYW5kIHtAbGluayBUb1N0cmluZ0J1aWxkZXIjaGlkZUZpZWxkTmFtZXMoKX0uPC9wPgorICogPHA+WW91IGNhbiBlaXRoZXIgZGlyZWN0bHkgbGlzdCBmaWVsZHMgdG8gaW5jbHVkZSB2aWEge0BsaW5rIFRvU3RyaW5nQnVpbGRlciNhZGQoU3RyaW5nLCBPYmplY3QpfSBhbmQge0BsaW5rIFRvU3RyaW5nQnVpbGRlciNhZGQoT2JqZWN0KX0KKyAqIG9yIHlvdSBjYW4gbGV0IHRoZSBidWlsZGVyIGRvIGl0IGF1dG9tYXRpY2FsbHkgdXNpbmcgcmVmbGVjdGlvbiwgZWl0aGVyIGluY2x1ZGluZyB0aGUgZmllbGRzIGRlY2xhcmVkIGluIHRoaXMgY2xhc3Mgb3IgaW5jbHVkaW5nIGFsbCBzdXBlcmNsYXNzZXMuPC9wPgorICogPHA+VGhlIGJ1aWxkZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGhhbmRsZSBjeWNsZXMgaW4gdGhlIG9iamVjdCB0cmVlLiBJdCBhbHNvIHByZXR0eSBwcmludHMgYXJyYXlzIGFuZCBJdGVyYWJsZXMuPC9wPgorICoKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZCBzYWZlLgorICogQHNpbmNlIDIuNworICovCitAQmV0YQorQEd3dENvbXBhdGlibGUKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGZpbmFsIGNsYXNzIFRvU3RyaW5nQnVpbGRlciB7CisJCisJcHJpdmF0ZSBzdGF0aWMgVG9TdHJpbmdDb250ZXh0IHRvU3RyaW5nQ29udGV4dCA9IFRvU3RyaW5nQ29udGV4dC5JTlNUQU5DRTsKKwkKKwlwcml2YXRlIGZpbmFsIE9iamVjdCBpbnN0YW5jZTsKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIHR5cGVOYW1lOworCisJcHJpdmF0ZSBib29sZWFuIG11bHRpTGluZSA9IHRydWU7CisKKwlwcml2YXRlIGJvb2xlYW4gc2tpcE51bGxzID0gZmFsc2U7CisKKwlwcml2YXRlIGJvb2xlYW4gc2hvd0ZpZWxkTmFtZXMgPSB0cnVlOworCisJcHJpdmF0ZSBib29sZWFuIHByZXR0eVByaW50ID0gdHJ1ZTsKKworCXByaXZhdGUgZmluYWwgTGlzdDxQYXJ0PiBwYXJ0cyA9IG5ldyBBcnJheUxpc3Q8UGFydD4oKTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgVG9TdHJpbmdCdWlsZGVyIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LiBJZiB5b3UgZG9uJ3QgdXNlIHJlZmxlY3Rpb24sIHRoZW4gdGhpcyBpbnN0YW5jZQorCSAqIGlzIG9ubHkgdXNlZCBmb3Igb2J0YWluaW5nIGl0cyBjbGFzc2VzJyBzaW1wbGUgbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBpbnN0YW5jZSB0aGUgb2JqZWN0IHRvIGNvbnZlcnQgdG8gYSBTdHJpbmcKKwkgKi8KKwlwdWJsaWMgVG9TdHJpbmdCdWlsZGVyKGZpbmFsIE9iamVjdCBpbnN0YW5jZSkgeworCQl0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7CisJCXRoaXMudHlwZU5hbWUgPSBpbnN0YW5jZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKKwl9CisKKwkvKioKKwkgKiBGaWVsZHMgYXJlIHByaW50ZWQgb24gYSBzaW5nbGUgbGluZSwgc2VwYXJhdGVkIGJ5IGNvbW1hcyBpbnN0ZWFkIG9mIG5ld2xpbmVzCisJICogQHJldHVybiB0aGlzCisJICovCisJcHVibGljIFRvU3RyaW5nQnVpbGRlciBzaW5nbGVMaW5lKCkgeworCQl0aGlzLm11bHRpTGluZSA9IGZhbHNlOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBGaWVsZHMgd2l0aCBudWxsIHZhbHVlcyB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIG91dHB1dAorCSAqIEByZXR1cm4gdGhpcworCSAqLworCXB1YmxpYyBUb1N0cmluZ0J1aWxkZXIgc2tpcE51bGxzKCkgeworCQl0aGlzLnNraXBOdWxscyA9IHRydWU7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEZpZWxkIG5hbWVzIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuIFVzZWZ1bCBmb3Igc21hbGwgY2xhc3Nlcy4KKwkgKiBAcmV0dXJuIHRoaXMKKwkgKi8KKwlwdWJsaWMgVG9TdHJpbmdCdWlsZGVyIGhpZGVGaWVsZE5hbWVzKCkgeworCQl0aGlzLnNob3dGaWVsZE5hbWVzID0gZmFsc2U7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEJ5IGRlZmF1bHQsIEl0ZXJhYmxlcywgQXJyYXlzIGFuZCBtdWx0aWxpbmUgU3RyaW5ncyBhcmUgcHJldHR5LXByaW50ZWQuCisJICogU3dpdGNoaW5nIHRvIHRoZWlyIG5vcm1hbCByZXByZXNlbnRhdGlvbiBtYWtlcyB0aGUgdG9TdHJpbmcgbWV0aG9kIHNpZ25pZmljYW50bHkgZmFzdGVyLgorCSAqIEBzaW5jZSAyLjkKKwkgKiBAcmV0dXJuIHRoaXMKKwkgKi8KKwlwdWJsaWMgVG9TdHJpbmdCdWlsZGVyIHZlcmJhdGltVmFsdWVzKCkgeworCQl0aGlzLnByZXR0eVByaW50ID0gZmFsc2U7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgYWxsIGZpZWxkcyBkZWNsYXJlZCBkaXJlY3RseSBpbiB0aGUgb2JqZWN0J3MgY2xhc3MgdG8gdGhlIG91dHB1dAorCSAqIEByZXR1cm4gdGhpcworCSAqLworCUBHd3RJbmNvbXBhdGlibGUoIkNsYXNzLmdldERlY2xhcmVkRmllbGRzIikKKwlwdWJsaWMgVG9TdHJpbmdCdWlsZGVyIGFkZERlY2xhcmVkRmllbGRzKCkgeworCQlGaWVsZFtdIGZpZWxkcyA9IGluc3RhbmNlLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKwkJZm9yKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7CisJCQlhZGRGaWVsZChmaWVsZCk7CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBhbGwgZmllbGRzIGRlY2xhcmVkIGluIHRoZSBvYmplY3QncyBjbGFzcyBhbmQgaXRzIHN1cGVyY2xhc3NlcyB0byB0aGUgb3V0cHV0LgorCSAqIEByZXR1cm4gdGhpcworCSAqLworCUBHd3RJbmNvbXBhdGlibGUoIkNsYXNzLmdldERlY2xhcmVkRmllbGRzIikKKwlwdWJsaWMgVG9TdHJpbmdCdWlsZGVyIGFkZEFsbEZpZWxkcygpIHsKKwkJTGlzdDxGaWVsZD4gZmllbGRzID0gZ2V0QWxsRGVjbGFyZWRGaWVsZHMoaW5zdGFuY2UuZ2V0Q2xhc3MoKSk7CisJCWZvcihGaWVsZCBmaWVsZCA6IGZpZWxkcykgeworCQkJYWRkRmllbGQoZmllbGQpOworCQl9CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBmaWVsZE5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGFkZCB0byB0aGUgb3V0cHV0IHVzaW5nIHJlZmxlY3Rpb24KKwkgKiBAcmV0dXJuIHRoaXMKKwkgKi8KKwlAR3d0SW5jb21wYXRpYmxlKCJDbGFzcy5nZXREZWNsYXJlZEZpZWxkKFN0cmluZykiKQorCXB1YmxpYyBUb1N0cmluZ0J1aWxkZXIgYWRkRmllbGQoZmluYWwgU3RyaW5nIGZpZWxkTmFtZSkgeworCQlMaXN0PEZpZWxkPiBmaWVsZHMgPSBnZXRBbGxEZWNsYXJlZEZpZWxkcyhpbnN0YW5jZS5nZXRDbGFzcygpKTsKKwkJZm9yKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7CisJCQlpZihmaWVsZE5hbWUuZXF1YWxzKGZpZWxkLmdldE5hbWUoKSkpIHsKKwkJCQlhZGRGaWVsZChmaWVsZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfQorCisJQEd3dEluY29tcGF0aWJsZSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiKQorCXByaXZhdGUgVG9TdHJpbmdCdWlsZGVyIGFkZEZpZWxkKGZpbmFsIEZpZWxkIGZpZWxkKSB7CisJCWlmICghTW9kaWZpZXIuaXNTdGF0aWMoZmllbGQuZ2V0TW9kaWZpZXJzKCkpKSB7CisJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworCQkJdHJ5IHsKKwkJCQlhZGQoZmllbGQuZ2V0TmFtZSgpLCBmaWVsZC5nZXQoaW5zdGFuY2UpKTsKKwkJCX0gY2F0Y2goSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgRXhjZXB0aW9ucy5zbmVha3lUaHJvdyhlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgb3V0cHV0CisJICogQHBhcmFtIGZpZWxkTmFtZSB0aGUgZmllbGQgbmFtZSB0byBsaXN0IHRoZSB2YWx1ZSB1bmRlcgorCSAqIEByZXR1cm4gdGhpcworCSAqLworCXB1YmxpYyBUb1N0cmluZ0J1aWxkZXIgYWRkKGZpbmFsIFN0cmluZyBmaWVsZE5hbWUsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworCQlyZXR1cm4gYWRkUGFydChmaWVsZE5hbWUsIHZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgb3V0cHV0IHdpdGhvdXQgYSBmaWVsZCBuYW1lCisJICogQHJldHVybiB0aGlzCisJICovCisJcHVibGljIFRvU3RyaW5nQnVpbGRlciBhZGQoZmluYWwgT2JqZWN0IHZhbHVlKSB7CisJCXJldHVybiBhZGRQYXJ0KHZhbHVlKTsKKwl9CisKKwlwcml2YXRlIFBhcnQgYWRkUGFydCgpIHsKKwkJZmluYWwgUGFydCBwID0gbmV3IFBhcnQoKTsKKwkJdGhpcy5wYXJ0cy5hZGQocCk7CisJCXJldHVybiBwOworCX0KKworCXByaXZhdGUgVG9TdHJpbmdCdWlsZGVyIGFkZFBhcnQoZmluYWwgT2JqZWN0IHZhbHVlKSB7CisJCWZpbmFsIFBhcnQgcCA9IHRoaXMuYWRkUGFydCgpOworCQlwLnZhbHVlID0gdmFsdWU7CisJCXJldHVybiB0aGlzOworCX0KKworCXByaXZhdGUgVG9TdHJpbmdCdWlsZGVyIGFkZFBhcnQoZmluYWwgU3RyaW5nIGZpZWxkTmFtZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisJCWZpbmFsIFBhcnQgcCA9IHRoaXMuYWRkUGFydCgpOworCQlwLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKwkJcC52YWx1ZSA9IHZhbHVlOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb2Nlc3NlZCBvYmplY3QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlib29sZWFuIHN0YXJ0UHJvY2Vzc2luZyA9IFRvU3RyaW5nQnVpbGRlci50b1N0cmluZ0NvbnRleHQuc3RhcnRQcm9jZXNzaW5nKHRoaXMuaW5zdGFuY2UpOworCQlpZiAoIXN0YXJ0UHJvY2Vzc2luZykgeworCQkJcmV0dXJuIHRoaXMudG9TaW1wbGVSZWZlcmVuY2VTdHJpbmcodGhpcy5pbnN0YW5jZSk7CisJCX0KKwkJdHJ5IHsKKwkJCWZpbmFsIEluZGVudGF0aW9uQXdhcmVTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSW5kZW50YXRpb25Bd2FyZVN0cmluZ0J1aWxkZXIoKTsKKwkJCWJ1aWxkZXIuYXBwZW5kKHR5cGVOYW1lKS5hcHBlbmQoIiAiKTsKKwkJCWJ1aWxkZXIuYXBwZW5kKCJbIik7CisJCQlTdHJpbmcgbmV4dFNlcGFyYXRvciA9ICIiOworCQkJaWYgKG11bHRpTGluZSkgeworCQkJCWJ1aWxkZXIuaW5jcmVhc2VJbmRlbnQoKTsKKwkJCX0KKwkJCWZvciAoUGFydCBwYXJ0IDogcGFydHMpIHsKKwkJCQlpZiAoIXNraXBOdWxscyB8fCBwYXJ0LnZhbHVlICE9IG51bGwpIHsKKwkJCQkJaWYgKG11bHRpTGluZSkgeworCQkJCQkJYnVpbGRlci5uZXdMaW5lKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlidWlsZGVyLmFwcGVuZChuZXh0U2VwYXJhdG9yKTsKKwkJCQkJCW5leHRTZXBhcmF0b3IgPSAiLCAiOworCQkJCQl9CisJCQkJCWlmIChwYXJ0LmZpZWxkTmFtZSAhPSBudWxsICYmIHRoaXMuc2hvd0ZpZWxkTmFtZXMpIHsKKwkJCQkJCWJ1aWxkZXIuYXBwZW5kKHBhcnQuZmllbGROYW1lKS5hcHBlbmQoIiA9ICIpOworCQkJCQl9CisJCQkJCXRoaXMuaW50ZXJuYWxUb1N0cmluZyhwYXJ0LnZhbHVlLCBidWlsZGVyKTsKKwkJCQl9CisJCQl9CisJCQlpZiAobXVsdGlMaW5lKSB7CisJCQkJYnVpbGRlci5kZWNyZWFzZUluZGVudCgpLm5ld0xpbmUoKTsKKwkJCX0KKwkJCWJ1aWxkZXIuYXBwZW5kKCJdIik7CisJCQlyZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworCQl9IGZpbmFsbHkgeworCQkJVG9TdHJpbmdCdWlsZGVyLnRvU3RyaW5nQ29udGV4dC5lbmRQcm9jZXNzaW5nKHRoaXMuaW5zdGFuY2UpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGludGVybmFsVG9TdHJpbmcoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgSW5kZW50YXRpb25Bd2FyZVN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJaWYgKHByZXR0eVByaW50KSB7CisJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSXRlcmFibGU8Pz4pIHsKKwkJCQlzZXJpYWxpemVJdGVyYWJsZSgoSXRlcmFibGU8Pz4pb2JqZWN0LCBzYik7CisJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE9iamVjdFtdKSB7CisJCQkJc2IuYXBwZW5kKEFycmF5cy50b1N0cmluZygoT2JqZWN0W10pb2JqZWN0KSk7CisJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIGJ5dGVbXSkgeworCQkJCXNiLmFwcGVuZChBcnJheXMudG9TdHJpbmcoKGJ5dGVbXSlvYmplY3QpKTsKKwkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgY2hhcltdKSB7CisJCQkJc2IuYXBwZW5kKEFycmF5cy50b1N0cmluZygoY2hhcltdKW9iamVjdCkpOworCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBpbnRbXSkgeworCQkJCXNiLmFwcGVuZChBcnJheXMudG9TdHJpbmcoKGludFtdKW9iamVjdCkpOworCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBib29sZWFuW10pIHsKKwkJCQlzYi5hcHBlbmQoQXJyYXlzLnRvU3RyaW5nKChib29sZWFuW10pb2JqZWN0KSk7CisJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIGxvbmdbXSkgeworCQkJCXNiLmFwcGVuZChBcnJheXMudG9TdHJpbmcoKGxvbmdbXSlvYmplY3QpKTsKKwkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgZmxvYXRbXSkgeworCQkJCXNiLmFwcGVuZChBcnJheXMudG9TdHJpbmcoKGZsb2F0W10pb2JqZWN0KSk7CisJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIGRvdWJsZVtdKSB7CisJCQkJc2IuYXBwZW5kKEFycmF5cy50b1N0cmluZygoZG91YmxlW10pb2JqZWN0KSk7CisJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkgeworCQkJCXNiLmFwcGVuZCgiXCIiKS5hcHBlbmQoKChDaGFyU2VxdWVuY2Upb2JqZWN0KS50b1N0cmluZygpLnJlcGxhY2UoIlxuIiwgIlxcbiIpLnJlcGxhY2UoIlxyIiwgIlxcciIpKS5hcHBlbmQoIlwiIik7CisJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVudW08Pz4pIHsKKwkJCQlzYi5hcHBlbmQoKChFbnVtPD8+KW9iamVjdCkubmFtZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJc2IuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG9iamVjdCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJc2IuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG9iamVjdCkpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZUl0ZXJhYmxlKGZpbmFsIEl0ZXJhYmxlPD8+IG9iamVjdCwgZmluYWwgSW5kZW50YXRpb25Bd2FyZVN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJZmluYWwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IgPSBvYmplY3QuaXRlcmF0b3IoKTsKKwkJc2IuYXBwZW5kKG9iamVjdC5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkuYXBwZW5kKCIgKCIpOworCQlpZiAobXVsdGlMaW5lKSB7CisJCQlzYi5pbmNyZWFzZUluZGVudCgpOworCQl9CisJCWJvb2xlYW4gd2FzRW1wdHkgPSB0cnVlOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQl3YXNFbXB0eSA9IGZhbHNlOworCQkJaWYgKG11bHRpTGluZSkgeworCQkJCXNiLm5ld0xpbmUoKTsKKwkJCX0KKwkJCXRoaXMuaW50ZXJuYWxUb1N0cmluZyhpdGVyYXRvci5uZXh0KCksIHNiKTsKKwkJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlzYi5hcHBlbmQoIiwiKTsKKwkJCX0KKwkJfQorCQlpZiAobXVsdGlMaW5lKSB7CisJCQlzYi5kZWNyZWFzZUluZGVudCgpOworCQl9CisJCWlmICghd2FzRW1wdHkgJiYgdGhpcy5tdWx0aUxpbmUpIHsKKwkJCXNiLm5ld0xpbmUoKTsKKwkJfQorCQlzYi5hcHBlbmQoIikiKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyB0b1NpbXBsZVJlZmVyZW5jZVN0cmluZyhmaW5hbCBPYmplY3Qgb2JqKSB7CisJCVN0cmluZyBzaW1wbGVOYW1lID0gb2JqLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOworCQlpbnQgaWRlbnRpdHlIYXNoQ29kZSA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG9iaik7CisJCXJldHVybiBzaW1wbGVOYW1lICsgIkAiICsgSW50ZWdlci52YWx1ZU9mKGlkZW50aXR5SGFzaENvZGUpOworCX0KKworCUBHd3RJbmNvbXBhdGlibGUoImphdmEubGFuZy5yZWZsZWN0LkZpZWxkIikKKwlwcml2YXRlIExpc3Q8RmllbGQ+IGdldEFsbERlY2xhcmVkRmllbGRzKGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisJCWZpbmFsIEFycmF5TGlzdDxGaWVsZD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCisJCWZvcihDbGFzczw/PiBjdXJyZW50ID0gY2xheno7IGN1cnJlbnQgIT0gbnVsbDsgY3VycmVudCA9IGN1cnJlbnQuZ2V0U3VwZXJjbGFzcygpKSB7CisJCQlGaWVsZFtdIGRlY2xhcmVkRmllbGRzID0gY3VycmVudC5nZXREZWNsYXJlZEZpZWxkcygpOworCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGRlY2xhcmVkRmllbGRzKSk7CisJCQkKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFBhcnQgeworCQlwcml2YXRlIFN0cmluZyBmaWVsZE5hbWU7CisJCXByaXZhdGUgT2JqZWN0IHZhbHVlOworCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIEluZGVudGF0aW9uQXdhcmVTdHJpbmdCdWlsZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisJCXByaXZhdGUgZmluYWwgU3RyaW5nIGluZGVudGF0aW9uU3RyaW5nID0gIiAgIjsKKworCQlwcml2YXRlIGZpbmFsIFN0cmluZyBuZXdMaW5lU3RyaW5nID0gIlxuIjsKKworCQlwcml2YXRlIGludCBpbmRlbnRhdGlvbiA9IDA7CisKKwkJcHVibGljIEluZGVudGF0aW9uQXdhcmVTdHJpbmdCdWlsZGVyIGluY3JlYXNlSW5kZW50KCkgeworCQkJaW5kZW50YXRpb24rKzsKKwkJCXJldHVybiB0aGlzOworCQl9CisKKwkJcHVibGljIEluZGVudGF0aW9uQXdhcmVTdHJpbmdCdWlsZGVyIGRlY3JlYXNlSW5kZW50KCkgeworCQkJaW5kZW50YXRpb24tLTsKKwkJCXJldHVybiB0aGlzOworCQl9CisKKwkJcHVibGljIEluZGVudGF0aW9uQXdhcmVTdHJpbmdCdWlsZGVyIGFwcGVuZChmaW5hbCBDaGFyU2VxdWVuY2Ugc3RyaW5nKSB7CisJCQlpZiAoaW5kZW50YXRpb24gPiAwKSB7CisJCQkJU3RyaW5nIGluZGVudGVkID0gc3RyaW5nLnRvU3RyaW5nKCkucmVwbGFjZSgKKwkJCQkJbmV3TGluZVN0cmluZywKKwkJCQkJbmV3TGluZVN0cmluZyArIFN0cmluZ3MucmVwZWF0KGluZGVudGF0aW9uU3RyaW5nLCBpbmRlbnRhdGlvbikKKwkJCQkpOworCQkJCWJ1aWxkZXIuYXBwZW5kKGluZGVudGVkKTsKKwkJCX0gZWxzZSB7CisJCQkJYnVpbGRlci5hcHBlbmQoc3RyaW5nKTsKKwkJCX0KKwkJCXJldHVybiB0aGlzOworCQl9CisKKwkJcHVibGljIEluZGVudGF0aW9uQXdhcmVTdHJpbmdCdWlsZGVyIG5ld0xpbmUoKSB7CisJCQlidWlsZGVyLmFwcGVuZChuZXdMaW5lU3RyaW5nKS4KKwkJCWFwcGVuZChTdHJpbmdzLnJlcGVhdCh0aGlzLmluZGVudGF0aW9uU3RyaW5nLCB0aGlzLmluZGVudGF0aW9uKSk7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuIHRoaXMuYnVpbGRlci50b1N0cmluZygpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvdXRpbC9Ub1N0cmluZ0NvbnRleHQuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL3V0aWwvVG9TdHJpbmdDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhZjdjOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL3V0aWwvVG9TdHJpbmdDb250ZXh0LmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLnV0aWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlOworaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7CisKKy8qKgorICogT24gR1dUIHdlIGp1c3QgdXNlIGEgc3RhdGljIHZhcmlhYmxlIGluc3RlYWQgb2YgYSBUaHJlYWRMb2NhbAorICovCitAR3d0Q29tcGF0aWJsZShlbXVsYXRlZCA9IHRydWUpCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK2NsYXNzIFRvU3RyaW5nQ29udGV4dCB7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIFRvU3RyaW5nQ29udGV4dCBJTlNUQU5DRSA9IG5ldyBUb1N0cmluZ0NvbnRleHQoKTsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIFRocmVhZExvY2FsPElkZW50aXR5SGFzaE1hcDxPYmplY3QsIEJvb2xlYW4+PiBjdXJyZW50bHlQcm9jZXNzZWQgPSBuZXcgVGhyZWFkTG9jYWw8SWRlbnRpdHlIYXNoTWFwPE9iamVjdCwgQm9vbGVhbj4+KCkgeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIElkZW50aXR5SGFzaE1hcDxPYmplY3QsIEJvb2xlYW4+IGluaXRpYWxWYWx1ZSgpIHsKKwkJCXJldHVybiBuZXcgSWRlbnRpdHlIYXNoTWFwPE9iamVjdCwgQm9vbGVhbj4oKTsKKwkJfQorCX07CisKKwlwdWJsaWMgYm9vbGVhbiBzdGFydFByb2Nlc3NpbmcoZmluYWwgT2JqZWN0IG9iaikgeworCQlyZXR1cm4gVG9TdHJpbmdDb250ZXh0LmN1cnJlbnRseVByb2Nlc3NlZC5nZXQoKS5wdXQob2JqLCBCb29sZWFuLlRSVUUpID09IG51bGw7CisJfQorCisJcHVibGljIHZvaWQgZW5kUHJvY2Vzc2luZyhmaW5hbCBPYmplY3Qgb2JqKSB7CisJCVRvU3RyaW5nQ29udGV4dC5jdXJyZW50bHlQcm9jZXNzZWQuZ2V0KCkucmVtb3ZlKG9iaik7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL3V0aWwvVG9TdHJpbmdIZWxwZXIuamF2YSBiL2phdmEvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvbGliL3V0aWwvVG9TdHJpbmdIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTEzZDMzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS9saWIvdXRpbC9Ub1N0cmluZ0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLnV0aWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIHRvIGFzc2lzdCBjb25zdHJ1Y3Rpb24gb2YgcHJvcGVyIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKX0gaW1wbGVtZW50YXRpb24gZm9yIHZhbHVlIG9iamVjdHMuCisgKiAKKyAqIEBhdXRob3IgU3ZlbiBFZmZ0aW5nZSAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqIAorICogQHNpbmNlIDIuMworICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBUb1N0cmluZ0J1aWxkZXJ9CisgKi8KK0BCZXRhCitARGVwcmVjYXRlZAorcHVibGljIGNsYXNzIFRvU3RyaW5nSGVscGVyIHsKKworCS8qKgorCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgVG9TdHJpbmdCdWlsZGVyfQorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIFRvU3RyaW5nSGVscGVyKCkgeworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIG9iamVjdCBieSBsaXN0aW5nIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBhbGwgZmllbGRzLgorCSAqIAorCSAqIEBwYXJhbSBvYmoKKwkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdGhhdCBzaG91bGQgYmUgcHJpbnRlZC4KKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBkZXByZWNhdGVkIHVzZSA8Y29kZT5uZXcgVG9TdHJpbmdCdWlsZGVyKCkuYWRkQWxsRmllbGRzKCkudG9TdHJpbmcoKTwvY29kZT4KKwkgKi8KKwlARGVwcmVjYXRlZAorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoT2JqZWN0IG9iaikgeworCQlyZXR1cm4gbmV3IFRvU3RyaW5nQnVpbGRlcihvYmopLmFkZEFsbEZpZWxkcygpLnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0RhdGFUZXN0LmphdmEgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRlbmQvbGliL2Fubm90YXRpb25zL0RhdGFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyMmNhNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvRGF0YVRlc3QuamF2YQpAQCAtMCwwICsxLDkxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kMi5saWIuU3RyaW5nQ29uY2F0ZW5hdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIudXRpbC5Ub1N0cmluZ0J1aWxkZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgRGF0YVRlc3QgeworICBARGF0YQorICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RGF0YUNsYXNzIHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhcmc7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZvbyA9IGZhbHNlOworICAgIAorICAgIHB1YmxpYyBNeURhdGFDbGFzcyhmaW5hbCBTdHJpbmcgYXJnKSB7CisgICAgICBzdXBlcigpOworICAgICAgdGhpcy5hcmcgPSBhcmc7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIEBQdXJlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodGhpcy5hcmc9PSBudWxsKSA/IDAgOiB0aGlzLmFyZy5oYXNoQ29kZSgpKTsKKyAgICAgIHJldHVybiBwcmltZSAqIHJlc3VsdCArICh0aGlzLmZvbyA/IDEyMzEgOiAxMjM3KTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgQFB1cmUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgeworICAgICAgaWYgKHRoaXMgPT0gb2JqKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIERhdGFUZXN0Lk15RGF0YUNsYXNzIG90aGVyID0gKERhdGFUZXN0Lk15RGF0YUNsYXNzKSBvYmo7CisgICAgICBpZiAodGhpcy5hcmcgPT0gbnVsbCkgeworICAgICAgICBpZiAob3RoZXIuYXJnICE9IG51bGwpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIGlmICghdGhpcy5hcmcuZXF1YWxzKG90aGVyLmFyZykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmIChvdGhlci5mb28gIT0gdGhpcy5mb28pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBAUHVyZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBUb1N0cmluZ0J1aWxkZXIgYiA9IG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyk7CisgICAgICBiLmFkZCgiYXJnIiwgdGhpcy5hcmcpOworICAgICAgYi5hZGQoImZvbyIsIHRoaXMuZm9vKTsKKyAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIEBQdXJlCisgICAgcHVibGljIFN0cmluZyBnZXRBcmcoKSB7CisgICAgICByZXR1cm4gdGhpcy5hcmc7CisgICAgfQorICAgIAorICAgIEBQdXJlCisgICAgcHVibGljIGJvb2xlYW4gaXNGb28oKSB7CisgICAgICByZXR1cm4gdGhpcy5mb287CisgICAgfQorICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0RGF0YSgpIHsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIk15RGF0YUNsYXNzIFsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiYXJnID0gXCJmb29cIiIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJmb28gPSBmYWxzZSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIl0iKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERhdGFUZXN0LnRvVW5peChfYnVpbGRlci50b1N0cmluZygpKSwgbmV3IERhdGFUZXN0Lk15RGF0YUNsYXNzKCJmb28iKS50b1N0cmluZygpKTsKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Vbml4KGZpbmFsIFN0cmluZyBzKSB7CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiByZXN1bHQgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigiXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKHMpOworICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi9hbm5vdGF0aW9ucy9EYXRhVGVzdC54dGVuZCBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvRGF0YVRlc3QueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlNzgyMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGVuZC9saWIvYW5ub3RhdGlvbnMvRGF0YVRlc3QueHRlbmQKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnMKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kMi5saWIuU3RyaW5nQ29uY2F0ZW5hdGlvbgorCitjbGFzcyBEYXRhVGVzdCB7CisJCisJQFRlc3QgZGVmIHZvaWQgdGVzdERhdGEoKSB7CisJCUFzc2VydC5hc3NlcnRFcXVhbHModG9Vbml4KCcnJworCQkJTXlEYXRhQ2xhc3MgWworCQkJICBhcmcgPSAiZm9vIgorCQkJICBmb28gPSBmYWxzZQorCQkJXScnJyksIG5ldyBNeURhdGFDbGFzcygiZm9vIikudG9TdHJpbmcpCisJfQorCQorCUBEYXRhIHN0YXRpYyBjbGFzcyBNeURhdGFDbGFzcyB7CisJCVN0cmluZyBhcmcKKwkJYm9vbGVhbiBmb28gPSBmYWxzZQorCX0gCisKKwlkZWYgc3RhdGljIFN0cmluZyB0b1VuaXgoU3RyaW5nIHMpIHsKKwkJdmFyIFN0cmluZ0NvbmNhdGVuYXRpb24gcmVzdWx0ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oIlxuIikKKwkJcmVzdWx0LmFwcGVuZChzKQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCkKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZW5kL2xpYi90ZXN0L1Rlc3QuZ3d0LnhtbCBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGVuZC9saWIvdGVzdC9UZXN0Lmd3dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhNWY1MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGVuZC9saWIvdGVzdC9UZXN0Lmd3dC54bWwKQEAgLTAsMCArMSw4IEBACis8IURPQ1RZUEUgbW9kdWxlIFBVQkxJQyAiLS8vR29vZ2xlIEluYy4vL0RURCBHb29nbGUgV2ViIFRvb2xraXQgMi44LjIvL0VOIiAiaHR0cDovL3d3dy5nd3Rwcm9qZWN0Lm9yZy9kb2N0eXBlLzIuOC4yL2d3dC1tb2R1bGUuZHRkIj4KKzxtb2R1bGU+CisgIDxpbmhlcml0cyBuYW1lPSJvcmcuZWNsaXBzZS54dGVuZC5saWIuTGliIiAvPgorICA8c291cmNlIHBhdGg9IiI+CisgICAgPGluY2x1ZGUgbmFtZT0iVGVzdEVudHJ5UG9pbnQuamF2YSIgLz4KKyAgPC9zb3VyY2U+CisgIDxlbnRyeS1wb2ludCBjbGFzcz0ib3JnLmVjbGlwc2UueHRlbmQubGliLnRlc3QuVGVzdEVudHJ5UG9pbnQiIC8+Cis8L21vZHVsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRlbmQvbGliL3Rlc3QvVGVzdEVudHJ5UG9pbnQuamF2YSBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGVuZC9saWIvdGVzdC9UZXN0RW50cnlQb2ludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZWM5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRlbmQvbGliL3Rlc3QvVGVzdEVudHJ5UG9pbnQuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi50ZXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQyLmxpYi5TdHJpbmdDb25jYXRlbmF0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuRW50cnlQb2ludDsKKworcHVibGljIGNsYXNzIFRlc3RFbnRyeVBvaW50IGltcGxlbWVudHMgRW50cnlQb2ludCB7CisgIHB1YmxpYyB2b2lkIG9uTW9kdWxlTG9hZCgpIHsKKwkgIFN0cmluZ0NvbmNhdGVuYXRpb24gZGVtbyA9IG51bGw7CisJICBhc3NlcnQgZGVtbyA9PSBudWxsOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9BcnJheUV4dGVuc2lvbnNCb29sZWFuVGVzdC5qYXZhIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9BcnJheUV4dGVuc2lvbnNCb29sZWFuVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMGRlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0Jvb2xlYW5UZXN0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICogCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnRlc3RzLmxpYjsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5BcnJheUV4dGVuc2lvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLk9iamVjdEV4dGVuc2lvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXMuUHJvY2VkdXJlMTsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQGF1dGhvciBNYXRoaWFzIFJpZWRlciAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQXJyYXlFeHRlbnNpb25zQm9vbGVhblRlc3QgeworICBwcml2YXRlIGJvb2xlYW5bXSBkYXRhOworICAKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgIHRoaXMuZGF0YSA9IHRoaXMuY3JlYXRlRGF0YSgpOworICB9CisgIAorICBwcml2YXRlIGJvb2xlYW5bXSBjcmVhdGVEYXRhKCkgeworICAgIGZpbmFsIGJvb2xlYW5bXSBhcnJheSA9IG5ldyBib29sZWFuWzNdOworICAgIGFycmF5WzBdID0gdHJ1ZTsKKyAgICBhcnJheVsxXSA9IGZhbHNlOworICAgIGFycmF5WzJdID0gdHJ1ZTsKKyAgICByZXR1cm4gYXJyYXk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RTZXRHZXRfX2Jvb2xlYW4oKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUodGhpcy5kYXRhWzBdKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhWzFdKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0aGlzLmRhdGFbMl0pOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q2xvbmVfX2Jvb2xlYW4oKSB7CisgICAgZmluYWwgYm9vbGVhbltdIGNsb25lZERhdGEgPSB0aGlzLmRhdGEuY2xvbmUoKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjbG9uZWREYXRhWzBdKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY2xvbmVkRGF0YVsxXSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoY2xvbmVkRGF0YVsyXSk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RMZW5ndGhfX2Jvb2xlYW4oKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCB0aGlzLmRhdGEubGVuZ3RoKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlX19ib29sZWFuKCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoT2JqZWN0cy5oYXNoQ29kZSh0aGlzLmRhdGEpLCB0aGlzLmRhdGEuaGFzaENvZGUoKSk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNfX2Jvb2xlYW4oKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUodGhpcy5kYXRhLmVxdWFscyh0aGlzLmRhdGEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhLmVxdWFscyh0aGlzLmNyZWF0ZURhdGEoKSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZSh0aGlzLmRhdGEuZXF1YWxzKG5ldyBPYmplY3RbM10pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhLmVxdWFscyhudWxsKSk7CisgICAgYm9vbGVhbltdIF9jcmVhdGVEYXRhID0gdGhpcy5jcmVhdGVEYXRhKCk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxib29sZWFuW10+IF9mdW5jdGlvbiA9IChib29sZWFuW10gaXQpIC0+IHsKKyAgICAgIGl0WzFdID0gdHJ1ZTsKKyAgICB9OworICAgIGZpbmFsIGJvb2xlYW5bXSBuZXdEYXRhID0gT2JqZWN0RXh0ZW5zaW9ucy48Ym9vbGVhbltdPm9wZXJhdG9yX2RvdWJsZUFycm93KF9jcmVhdGVEYXRhLCBfZnVuY3Rpb24pOworICAgIEFzc2VydC5hc3NlcnRGYWxzZSh0aGlzLmRhdGEuZXF1YWxzKG5ld0RhdGEpKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zX19ib29sZWFuKCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyh0aGlzLmRhdGEsIHRydWUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCBmYWxzZSkpOworICAgIGJvb2xlYW5bXSBfbmV3Qm9vbGVhbkFycmF5T2ZTaXplID0gbmV3IGJvb2xlYW5bMl07CisgICAgZmluYWwgUHJvY2VkdXJlMTxib29sZWFuW10+IF9mdW5jdGlvbiA9IChib29sZWFuW10gaXQpIC0+IHsKKyAgICAgIGl0WzBdID0gZmFsc2U7CisgICAgICBpdFsxXSA9IGZhbHNlOworICAgIH07CisgICAgZmluYWwgYm9vbGVhbltdIG9ubHlGYWxzZSA9IE9iamVjdEV4dGVuc2lvbnMuPGJvb2xlYW5bXT5vcGVyYXRvcl9kb3VibGVBcnJvdyhfbmV3Qm9vbGVhbkFycmF5T2ZTaXplLCBfZnVuY3Rpb24pOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMob25seUZhbHNlLCB0cnVlKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKG9ubHlGYWxzZSwgZmFsc2UpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9BcnJheUV4dGVuc2lvbnNCb29sZWFuVGVzdC54dGVuZCBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zQm9vbGVhblRlc3QueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkNjk3YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zQm9vbGVhblRlc3QueHRlbmQKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxOSBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50ZXN0cy5saWIKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZQoraW1wb3J0IG9yZy5qdW5pdC5UZXN0CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qCisKKy8qKgorICogQGF1dGhvciBNYXRoaWFzIFJpZWRlciAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqLworY2xhc3MgQXJyYXlFeHRlbnNpb25zQm9vbGVhblRlc3QgeworCisJdmFyIGJvb2xlYW5bXSBkYXRhCisKKwlAQmVmb3JlCisJZGVmIHZvaWQgaW5pdCgpIHsKKwkJZGF0YSA9IGNyZWF0ZURhdGEoKQorCX0KKworCXByaXZhdGUgZGVmIGJvb2xlYW5bXSBjcmVhdGVEYXRhKCkgeworCQl2YWwgYm9vbGVhbltdIGFycmF5ID0gbmV3Qm9vbGVhbkFycmF5T2ZTaXplKDMpCisJCWFycmF5LnNldCgwLCB0cnVlKQorCQlhcnJheS5zZXQoMSwgZmFsc2UpCisJCWFycmF5LnNldCgyLCB0cnVlKQorCQlyZXR1cm4gYXJyYXkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RTZXRHZXRfX2Jvb2xlYW4oKSB7CisJCWFzc2VydFRydWUoZGF0YS5nZXQoMCkpCisJCWFzc2VydEZhbHNlKGRhdGEuZ2V0KDEpKQorCQlhc3NlcnRUcnVlKGRhdGEuZ2V0KDIpKQorCX0KKworCUBUZXN0CisJZGVmIHZvaWQgdGVzdENsb25lX19ib29sZWFuKCkgeworCQl2YWwgY2xvbmVkRGF0YSA9IGRhdGEuY2xvbmUoKTsKKworCQlhc3NlcnRUcnVlKGNsb25lZERhdGEuZ2V0KDApKQorCQlhc3NlcnRGYWxzZShjbG9uZWREYXRhLmdldCgxKSkKKwkJYXNzZXJ0VHJ1ZShjbG9uZWREYXRhLmdldCgyKSkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RMZW5ndGhfX2Jvb2xlYW4oKSB7CisJCWFzc2VydEVxdWFscygzLCBkYXRhLmxlbmd0aCkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RIYXNoQ29kZV9fYm9vbGVhbigpIHsKKwkJYXNzZXJ0RXF1YWxzKE9iamVjdHMuaGFzaENvZGUoZGF0YSksIGRhdGEuaGFzaENvZGUpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0RXF1YWxzX19ib29sZWFuKCkgeworCQlhc3NlcnRUcnVlKGRhdGEuZXF1YWxzKGRhdGEpKQorCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKGNyZWF0ZURhdGEoKSkpCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKG5ld0FycmF5T2ZTaXplKDMpKSkKKwkJYXNzZXJ0RmFsc2UoZGF0YS5lcXVhbHMobnVsbCkpCisKKwkJdmFsIG5ld0RhdGEgPSBjcmVhdGVEYXRhKCkgPT4gW2l0LnNldCgxLCB0cnVlKV0KKwkJYXNzZXJ0RmFsc2UoZGF0YS5lcXVhbHMobmV3RGF0YSkpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0Q29udGFpbnNfX2Jvb2xlYW4oKSB7CisJCWFzc2VydFRydWUoZGF0YS5jb250YWlucyh0cnVlKSkKKwkJYXNzZXJ0VHJ1ZShkYXRhLmNvbnRhaW5zKGZhbHNlKSkKKwkJCisJCXZhbCBvbmx5RmFsc2UgPSBuZXdCb29sZWFuQXJyYXlPZlNpemUoMikgPT4gWworCQkJc2V0KDAsIGZhbHNlKQorCQkJc2V0KDEsIGZhbHNlKQorCQldCisKKwkJYXNzZXJ0RmFsc2Uob25seUZhbHNlLmNvbnRhaW5zKHRydWUpKQorCQlhc3NlcnRUcnVlKG9ubHlGYWxzZS5jb250YWlucyhmYWxzZSkpCisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0J5dGVUZXN0LmphdmEgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0J5dGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyOWE1NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zQnl0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxOSBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKiAKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UudGVzdHMubGliOworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkFycmF5RXh0ZW5zaW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuT2JqZWN0RXh0ZW5zaW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlcy5Qcm9jZWR1cmUxOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIE1hdGhpYXMgUmllZGVyIC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBBcnJheUV4dGVuc2lvbnNCeXRlVGVzdCB7CisgIHByaXZhdGUgYnl0ZVtdIGRhdGE7CisgIAorICBwcml2YXRlIGZpbmFsIGJ5dGUgXzEwID0gKChieXRlKSAxMCk7CisgIAorICBwcml2YXRlIGZpbmFsIGJ5dGUgXzIwID0gKChieXRlKSAyMCk7CisgIAorICBwcml2YXRlIGZpbmFsIGJ5dGUgXzMwID0gKChieXRlKSAzMCk7CisgIAorICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgdGhpcy5kYXRhID0gdGhpcy5jcmVhdGVEYXRhKCk7CisgIH0KKyAgCisgIHByaXZhdGUgYnl0ZVtdIGNyZWF0ZURhdGEoKSB7CisgICAgZmluYWwgYnl0ZVtdIGFycmF5ID0gbmV3IGJ5dGVbM107CisgICAgYXJyYXlbMF0gPSB0aGlzLl8xMDsKKyAgICBhcnJheVsxXSA9IHRoaXMuXzIwOworICAgIGFycmF5WzJdID0gdGhpcy5fMzA7CisgICAgcmV0dXJuIGFycmF5OworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0X19ieXRlKCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGhpcy5fMTAsIHRoaXMuZGF0YVswXSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0aGlzLl8yMCwgdGhpcy5kYXRhWzFdKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRoaXMuXzMwLCB0aGlzLmRhdGFbMl0pOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q2xvbmVfX2J5dGUoKSB7CisgICAgZmluYWwgYnl0ZVtdIGNsb25lZERhdGEgPSB0aGlzLmRhdGEuY2xvbmUoKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRoaXMuXzEwLCBjbG9uZWREYXRhWzBdKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRoaXMuXzIwLCBjbG9uZWREYXRhWzFdKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRoaXMuXzMwLCBjbG9uZWREYXRhWzJdKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdExlbmd0aF9fYnl0ZSgpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIHRoaXMuZGF0YS5sZW5ndGgpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGVfX2J5dGUoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhPYmplY3RzLmhhc2hDb2RlKHRoaXMuZGF0YSksIHRoaXMuZGF0YS5oYXNoQ29kZSgpKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEVxdWFsc19fYnl0ZSgpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0aGlzLmRhdGEuZXF1YWxzKHRoaXMuZGF0YSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZSh0aGlzLmRhdGEuZXF1YWxzKHRoaXMuY3JlYXRlRGF0YSgpKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHRoaXMuZGF0YS5lcXVhbHMobmV3IE9iamVjdFszXSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZSh0aGlzLmRhdGEuZXF1YWxzKG51bGwpKTsKKyAgICBieXRlW10gX2NyZWF0ZURhdGEgPSB0aGlzLmNyZWF0ZURhdGEoKTsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPGJ5dGVbXT4gX2Z1bmN0aW9uID0gKGJ5dGVbXSBpdCkgLT4geworICAgICAgaXRbMV0gPSAoKGJ5dGUpIDApOworICAgIH07CisgICAgZmluYWwgYnl0ZVtdIG5ld0RhdGEgPSBPYmplY3RFeHRlbnNpb25zLjxieXRlW10+b3BlcmF0b3JfZG91YmxlQXJyb3coX2NyZWF0ZURhdGEsIF9mdW5jdGlvbik7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHRoaXMuZGF0YS5lcXVhbHMobmV3RGF0YSkpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNfX2J5dGUoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKHRoaXMuZGF0YSwgKChieXRlKSAxMCkpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCAoKGJ5dGUpIDIwKSkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyh0aGlzLmRhdGEsICgoYnl0ZSkgMzApKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyh0aGlzLmRhdGEsICgoYnl0ZSkgNDApKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zQnl0ZVRlc3QueHRlbmQgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0J5dGVUZXN0Lnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NmExZjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0J5dGVUZXN0Lnh0ZW5kCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UudGVzdHMubGliCisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlCitpbXBvcnQgb3JnLmp1bml0LlRlc3QKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LioKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0cworCisvKioKKyAqIEBhdXRob3IgTWF0aGlhcyBSaWVkZXIgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKi8KK2NsYXNzIEFycmF5RXh0ZW5zaW9uc0J5dGVUZXN0IHsKKworCXZhciBieXRlW10gZGF0YQorCisJdmFsIGJ5dGUgXzEwID0gMTAgYXMgYnl0ZQorCXZhbCBieXRlIF8yMCA9IDIwIGFzIGJ5dGUKKwl2YWwgYnl0ZSBfMzAgPSAzMCBhcyBieXRlCisKKwlAQmVmb3JlCisJZGVmIHZvaWQgaW5pdCgpIHsKKwkJZGF0YSA9IGNyZWF0ZURhdGEoKQorCX0KKworCXByaXZhdGUgZGVmIGJ5dGVbXSBjcmVhdGVEYXRhKCkgeworCQl2YWwgYnl0ZVtdIGFycmF5ID0gbmV3Qnl0ZUFycmF5T2ZTaXplKDMpCisJCWFycmF5LnNldCgwLCBfMTApCisJCWFycmF5LnNldCgxLCBfMjApCisJCWFycmF5LnNldCgyLCBfMzApCisJCXJldHVybiBhcnJheQorCX0KKworCUBUZXN0CisJZGVmIHZvaWQgdGVzdFNldEdldF9fYnl0ZSgpIHsKKwkJYXNzZXJ0RXF1YWxzKF8xMCwgZGF0YS5nZXQoMCkpCisJCWFzc2VydEVxdWFscyhfMjAsIGRhdGEuZ2V0KDEpKQorCQlhc3NlcnRFcXVhbHMoXzMwLCBkYXRhLmdldCgyKSkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RDbG9uZV9fYnl0ZSgpIHsKKwkJdmFsIGNsb25lZERhdGEgPSBkYXRhLmNsb25lKCk7CisKKwkJYXNzZXJ0RXF1YWxzKF8xMCwgY2xvbmVkRGF0YS5nZXQoMCkpCisJCWFzc2VydEVxdWFscyhfMjAsIGNsb25lZERhdGEuZ2V0KDEpKQorCQlhc3NlcnRFcXVhbHMoXzMwLCBjbG9uZWREYXRhLmdldCgyKSkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RMZW5ndGhfX2J5dGUoKSB7CisJCWFzc2VydEVxdWFscygzLCBkYXRhLmxlbmd0aCkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RIYXNoQ29kZV9fYnl0ZSgpIHsKKwkJYXNzZXJ0RXF1YWxzKE9iamVjdHMuaGFzaENvZGUoZGF0YSksIGRhdGEuaGFzaENvZGUpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0RXF1YWxzX19ieXRlKCkgeworCQlhc3NlcnRUcnVlKGRhdGEuZXF1YWxzKGRhdGEpKQorCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKGNyZWF0ZURhdGEoKSkpCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKG5ld0FycmF5T2ZTaXplKDMpKSkKKwkJYXNzZXJ0RmFsc2UoZGF0YS5lcXVhbHMobnVsbCkpCisKKwkJdmFsIG5ld0RhdGEgPSBjcmVhdGVEYXRhKCkgPT4gW2l0LnNldCgxLCAwIGFzIGJ5dGUpXQorCQlhc3NlcnRGYWxzZShkYXRhLmVxdWFscyhuZXdEYXRhKSkKKwl9CisKKwlAVGVzdCAKKwlkZWYgdm9pZCB0ZXN0Q29udGFpbnNfX2J5dGUoKSB7CisJCWFzc2VydFRydWUoZGF0YS5jb250YWlucygxMCBhcyBieXRlKSkKKwkJYXNzZXJ0VHJ1ZShkYXRhLmNvbnRhaW5zKDIwIGFzIGJ5dGUpKSAKKwkJYXNzZXJ0VHJ1ZShkYXRhLmNvbnRhaW5zKDMwIGFzIGJ5dGUpKQorCQkKKwkJYXNzZXJ0RmFsc2UoZGF0YS5jb250YWlucyg0MCBhcyBieXRlKSkKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zQ2hhclRlc3QuamF2YSBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zQ2hhclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmI4YmRhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9BcnJheUV4dGVuc2lvbnNDaGFyVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE5IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqIAorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50ZXN0cy5saWI7CisKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuQXJyYXlFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5PYmplY3RFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzLlByb2NlZHVyZTE7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgTWF0aGlhcyBSaWVkZXIgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEFycmF5RXh0ZW5zaW9uc0NoYXJUZXN0IHsKKyAgcHJpdmF0ZSBjaGFyW10gZGF0YTsKKyAgCisgIHByaXZhdGUgZmluYWwgY2hhciBhID0gJ2EnOworICAKKyAgcHJpdmF0ZSBmaW5hbCBjaGFyIGIgPSAnYic7CisgIAorICBwcml2YXRlIGZpbmFsIGNoYXIgYyA9ICdjJzsKKyAgCisgIHByaXZhdGUgZmluYWwgY2hhciB4ID0gJ3gnOworICAKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgIHRoaXMuZGF0YSA9IHRoaXMuY3JlYXRlRGF0YSgpOworICB9CisgIAorICBwcml2YXRlIGNoYXJbXSBjcmVhdGVEYXRhKCkgeworICAgIGZpbmFsIGNoYXJbXSBhcnJheSA9IG5ldyBjaGFyWzNdOworICAgIGFycmF5WzBdID0gdGhpcy5hOworICAgIGFycmF5WzFdID0gdGhpcy5iOworICAgIGFycmF5WzJdID0gdGhpcy5jOworICAgIHJldHVybiBhcnJheTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFNldEdldF9fY2hhcigpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRoaXMuYSwgdGhpcy5kYXRhWzBdKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRoaXMuYiwgdGhpcy5kYXRhWzFdKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRoaXMuYywgdGhpcy5kYXRhWzJdKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENsb25lX19jaGFyKCkgeworICAgIGZpbmFsIGNoYXJbXSBjbG9uZWREYXRhID0gdGhpcy5kYXRhLmNsb25lKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0aGlzLmEsIGNsb25lZERhdGFbMF0pOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGhpcy5iLCBjbG9uZWREYXRhWzFdKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRoaXMuYywgY2xvbmVkRGF0YVsyXSk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RMZW5ndGhfX2NoYXIoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCB0aGlzLmRhdGEubGVuZ3RoKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlX19jaGFyKCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoT2JqZWN0cy5oYXNoQ29kZSh0aGlzLmRhdGEpLCB0aGlzLmRhdGEuaGFzaENvZGUoKSk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNfX2NoYXIoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUodGhpcy5kYXRhLmVxdWFscyh0aGlzLmRhdGEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhLmVxdWFscyh0aGlzLmNyZWF0ZURhdGEoKSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZSh0aGlzLmRhdGEuZXF1YWxzKG5ldyBPYmplY3RbM10pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhLmVxdWFscyhudWxsKSk7CisgICAgY2hhcltdIF9jcmVhdGVEYXRhID0gdGhpcy5jcmVhdGVEYXRhKCk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxjaGFyW10+IF9mdW5jdGlvbiA9IChjaGFyW10gaXQpIC0+IHsKKyAgICAgIGl0WzFdID0gdGhpcy5hOworICAgIH07CisgICAgZmluYWwgY2hhcltdIG5ld0RhdGEgPSBPYmplY3RFeHRlbnNpb25zLjxjaGFyW10+b3BlcmF0b3JfZG91YmxlQXJyb3coX2NyZWF0ZURhdGEsIF9mdW5jdGlvbik7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHRoaXMuZGF0YS5lcXVhbHMobmV3RGF0YSkpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNfX2NoYXIoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKHRoaXMuZGF0YSwgdGhpcy5hKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKHRoaXMuZGF0YSwgdGhpcy5iKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKHRoaXMuZGF0YSwgdGhpcy5jKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyh0aGlzLmRhdGEsIHRoaXMueCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0NoYXJUZXN0Lnh0ZW5kIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9BcnJheUV4dGVuc2lvbnNDaGFyVGVzdC54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjZlYzFmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9BcnJheUV4dGVuc2lvbnNDaGFyVGVzdC54dGVuZApAQCAtMCwwICsxLDkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE5IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnRlc3RzLmxpYgorCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZQoraW1wb3J0IG9yZy5qdW5pdC5UZXN0CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHMKKworLyoqCisgKiBAYXV0aG9yIE1hdGhpYXMgUmllZGVyIC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICovCitjbGFzcyBBcnJheUV4dGVuc2lvbnNDaGFyVGVzdCB7CisKKwl2YXIgY2hhcltdIGRhdGEKKwkKKwl2YWwgY2hhciBhID0gJ2EnCisJdmFsIGNoYXIgYiA9ICdiJworCXZhbCBjaGFyIGMgPSAnYycKKwkKKwl2YWwgY2hhciB4ID0gJ3gnCisKKwlAQmVmb3JlCisJZGVmIHZvaWQgaW5pdCgpIHsKKwkJZGF0YSA9IGNyZWF0ZURhdGEoKQorCX0KKworCXByaXZhdGUgZGVmIGNoYXJbXSBjcmVhdGVEYXRhKCkgeworCQl2YWwgY2hhcltdIGFycmF5ID0gbmV3Q2hhckFycmF5T2ZTaXplKDMpCisJCWFycmF5LnNldCgwLCBhKSAKKwkJYXJyYXkuc2V0KDEsIGIpCisJCWFycmF5LnNldCgyLCBjKQorCQlyZXR1cm4gYXJyYXkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RTZXRHZXRfX2NoYXIoKSB7CisJCWFzc2VydEVxdWFscyhhLCBkYXRhLmdldCgwKSkKKwkJYXNzZXJ0RXF1YWxzKGIsIGRhdGEuZ2V0KDEpKQorCQlhc3NlcnRFcXVhbHMoYywgZGF0YS5nZXQoMikpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0Q2xvbmVfX2NoYXIoKSB7CisJCXZhbCBjbG9uZWREYXRhID0gZGF0YS5jbG9uZSgpOworCisJCWFzc2VydEVxdWFscyhhLCBjbG9uZWREYXRhLmdldCgwKSkKKwkJYXNzZXJ0RXF1YWxzKGIsIGNsb25lZERhdGEuZ2V0KDEpKQorCQlhc3NlcnRFcXVhbHMoYywgY2xvbmVkRGF0YS5nZXQoMikpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0TGVuZ3RoX19jaGFyKCkgeworCQlhc3NlcnRFcXVhbHMoMywgZGF0YS5sZW5ndGgpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0SGFzaENvZGVfX2NoYXIoKSB7CisJCWFzc2VydEVxdWFscyhPYmplY3RzLmhhc2hDb2RlKGRhdGEpLCBkYXRhLmhhc2hDb2RlKQorCX0KKworCUBUZXN0CisJZGVmIHZvaWQgdGVzdEVxdWFsc19fY2hhcigpIHsKKwkJYXNzZXJ0VHJ1ZShkYXRhLmVxdWFscyhkYXRhKSkKKworCQlhc3NlcnRGYWxzZShkYXRhLmVxdWFscyhjcmVhdGVEYXRhKCkpKQorCQlhc3NlcnRGYWxzZShkYXRhLmVxdWFscyhuZXdBcnJheU9mU2l6ZSgzKSkpCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKG51bGwpKQorCisJCXZhbCBuZXdEYXRhID0gY3JlYXRlRGF0YSgpID0+IFtpdC5zZXQoMSwgYSldCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKG5ld0RhdGEpKQorCX0KKworCUBUZXN0IAorCWRlZiB2b2lkIHRlc3RDb250YWluc19fY2hhcigpIHsKKwkJYXNzZXJ0VHJ1ZShkYXRhLmNvbnRhaW5zKGEpKQorCQlhc3NlcnRUcnVlKGRhdGEuY29udGFpbnMoYikpCisJCWFzc2VydFRydWUoZGF0YS5jb250YWlucyhjKSkKKwkJCisJCWFzc2VydEZhbHNlKGRhdGEuY29udGFpbnMoeCkpCisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0RvdWJsZVRlc3QuamF2YSBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zRG91YmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNmM4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0RvdWJsZVRlc3QuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICogCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnRlc3RzLmxpYjsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5BcnJheUV4dGVuc2lvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLk9iamVjdEV4dGVuc2lvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXMuUHJvY2VkdXJlMTsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQGF1dGhvciBNYXRoaWFzIFJpZWRlciAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQXJyYXlFeHRlbnNpb25zRG91YmxlVGVzdCB7CisgIHByaXZhdGUgZG91YmxlW10gZGF0YTsKKyAgCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICB0aGlzLmRhdGEgPSB0aGlzLmNyZWF0ZURhdGEoKTsKKyAgfQorICAKKyAgcHJpdmF0ZSBkb3VibGVbXSBjcmVhdGVEYXRhKCkgeworICAgIGZpbmFsIGRvdWJsZVtdIGFycmF5ID0gbmV3IGRvdWJsZVszXTsKKyAgICBhcnJheVswXSA9IDEwLjA7CisgICAgYXJyYXlbMV0gPSAyMC4wOworICAgIGFycmF5WzJdID0gMzAuMDsKKyAgICByZXR1cm4gYXJyYXk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RTZXRHZXRfX2RvdWJsZSgpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwLjAsIHRoaXMuZGF0YVswXSwgMC4wMDEpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAuMCwgdGhpcy5kYXRhWzFdLCAwLjAwMSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMC4wLCB0aGlzLmRhdGFbMl0sIDAuMDAxKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENsb25lX19kb3VibGUoKSB7CisgICAgZmluYWwgZG91YmxlW10gY2xvbmVkRGF0YSA9IHRoaXMuZGF0YS5jbG9uZSgpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAuMCwgY2xvbmVkRGF0YVswXSwgMC4wMDEpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAuMCwgY2xvbmVkRGF0YVsxXSwgMC4wMDEpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzAuMCwgY2xvbmVkRGF0YVsyXSwgMC4wMDEpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0TGVuZ3RoX19kb3VibGUoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCB0aGlzLmRhdGEubGVuZ3RoKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlX19kb3VibGUoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhPYmplY3RzLmhhc2hDb2RlKHRoaXMuZGF0YSksIHRoaXMuZGF0YS5oYXNoQ29kZSgpKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEVxdWFsc19fZG91YmxlKCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKHRoaXMuZGF0YS5lcXVhbHModGhpcy5kYXRhKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHRoaXMuZGF0YS5lcXVhbHModGhpcy5jcmVhdGVEYXRhKCkpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhLmVxdWFscyhuZXcgT2JqZWN0WzNdKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHRoaXMuZGF0YS5lcXVhbHMobnVsbCkpOworICAgIGRvdWJsZVtdIF9jcmVhdGVEYXRhID0gdGhpcy5jcmVhdGVEYXRhKCk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxkb3VibGVbXT4gX2Z1bmN0aW9uID0gKGRvdWJsZVtdIGl0KSAtPiB7CisgICAgICBpdFsxXSA9IDAuMDsKKyAgICB9OworICAgIGZpbmFsIGRvdWJsZVtdIG5ld0RhdGEgPSBPYmplY3RFeHRlbnNpb25zLjxkb3VibGVbXT5vcGVyYXRvcl9kb3VibGVBcnJvdyhfY3JlYXRlRGF0YSwgX2Z1bmN0aW9uKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhLmVxdWFscyhuZXdEYXRhKSk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc19fZG91YmxlKCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyh0aGlzLmRhdGEsIDEwLjApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCAyMC4wKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKHRoaXMuZGF0YSwgMzAuMCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCA0MC4wKSk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc19fZmxvYXRfTmFOKCkgeworICAgIGZpbmFsIGRvdWJsZVtdIG5hbkRhdGEgPSB7IDEuMCwgRG91YmxlLk5hTiB9OworICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyhuYW5EYXRhLCBEb3VibGUuTmFOKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKG5hbkRhdGEsICgwZiAvIDBmKSkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyhuYW5EYXRhLCBNYXRoLmxvZygoLTEpKSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMobmFuRGF0YSwgRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyhuYW5EYXRhLCBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkpKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zX19kb3VibGVfcG9zSW5maW5pdHkoKSB7CisgICAgZmluYWwgZG91YmxlW10gbmFuRGF0YSA9IHsgMS4wZiwgRG91YmxlLlBPU0lUSVZFX0lORklOSVRZIH07CisgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKG5hbkRhdGEsIERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyhuYW5EYXRhLCAoRG91YmxlLlBPU0lUSVZFX0lORklOSVRZICsgNy4yZikpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKG5hbkRhdGEsIERvdWJsZS5OYU4pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKG5hbkRhdGEsICgwZiAvIDBmKSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMobmFuRGF0YSwgTWF0aC5sb2coKC0xKSkpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKG5hbkRhdGEsIERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSkpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNfX2RvdWJsZV9uZWdJbmZpbml0eSgpIHsKKyAgICBmaW5hbCBkb3VibGVbXSBuYW5EYXRhID0geyAxLjBmLCBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkgfTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMobmFuRGF0YSwgRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKG5hbkRhdGEsIChEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkgKyA3LjJmKSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMobmFuRGF0YSwgRG91YmxlLk5hTikpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMobmFuRGF0YSwgKDBmIC8gMGYpKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyhuYW5EYXRhLCBNYXRoLmxvZygoLTEpKSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMobmFuRGF0YSwgRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zRG91YmxlVGVzdC54dGVuZCBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zRG91YmxlVGVzdC54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDM3NTUxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9BcnJheUV4dGVuc2lvbnNEb3VibGVUZXN0Lnh0ZW5kCkBAIC0wLDAgKzEsMTIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE5IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnRlc3RzLmxpYgorCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHMKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlCitpbXBvcnQgb3JnLmp1bml0LlRlc3QKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LioKKworLyoqCisgKiBAYXV0aG9yIE1hdGhpYXMgUmllZGVyIC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICovCitjbGFzcyBBcnJheUV4dGVuc2lvbnNEb3VibGVUZXN0IHsKKworCXZhciBkb3VibGVbXSBkYXRhCisKKwlAQmVmb3JlCisJZGVmIHZvaWQgaW5pdCgpIHsKKwkJZGF0YSA9IGNyZWF0ZURhdGEoKQorCX0KKworCXByaXZhdGUgZGVmIGRvdWJsZVtdIGNyZWF0ZURhdGEoKSB7CisJCXZhbCBkb3VibGVbXSBhcnJheSA9IG5ld0RvdWJsZUFycmF5T2ZTaXplKDMpCisJCWFycmF5LnNldCgwLCAxMC4wKQorCQlhcnJheS5zZXQoMSwgMjAuMCkKKwkJYXJyYXkuc2V0KDIsIDMwLjApCisJCXJldHVybiBhcnJheQorCX0KKworCUBUZXN0CisJZGVmIHZvaWQgdGVzdFNldEdldF9fZG91YmxlKCkgeworCQlhc3NlcnRFcXVhbHMoMTAuMCwgZGF0YS5nZXQoMCksIDAuMDAxKQorCQlhc3NlcnRFcXVhbHMoMjAuMCwgZGF0YS5nZXQoMSksIDAuMDAxKQorCQlhc3NlcnRFcXVhbHMoMzAuMCwgZGF0YS5nZXQoMiksIDAuMDAxKQorCX0KKworCUBUZXN0CisJZGVmIHZvaWQgdGVzdENsb25lX19kb3VibGUoKSB7CisJCXZhbCBjbG9uZWREYXRhID0gZGF0YS5jbG9uZSgpOworCisJCWFzc2VydEVxdWFscygxMC4wLCBjbG9uZWREYXRhLmdldCgwKSwgMC4wMDEpCisJCWFzc2VydEVxdWFscygyMC4wLCBjbG9uZWREYXRhLmdldCgxKSwgMC4wMDEpCisJCWFzc2VydEVxdWFscygzMC4wLCBjbG9uZWREYXRhLmdldCgyKSwgMC4wMDEpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0TGVuZ3RoX19kb3VibGUoKSB7CisJCWFzc2VydEVxdWFscygzLCBkYXRhLmxlbmd0aCkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RIYXNoQ29kZV9fZG91YmxlKCkgeworCQlhc3NlcnRFcXVhbHMoT2JqZWN0cy5oYXNoQ29kZShkYXRhKSwgZGF0YS5oYXNoQ29kZSkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RFcXVhbHNfX2RvdWJsZSgpIHsKKwkJYXNzZXJ0VHJ1ZShkYXRhLmVxdWFscyhkYXRhKSkKKworCQlhc3NlcnRGYWxzZShkYXRhLmVxdWFscyhjcmVhdGVEYXRhKCkpKQorCQlhc3NlcnRGYWxzZShkYXRhLmVxdWFscyhuZXdBcnJheU9mU2l6ZSgzKSkpCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKG51bGwpKQorCisJCXZhbCBuZXdEYXRhID0gY3JlYXRlRGF0YSgpID0+IFtpdC5zZXQoMSwgMC4wKV0KKwkJYXNzZXJ0RmFsc2UoZGF0YS5lcXVhbHMobmV3RGF0YSkpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0Q29udGFpbnNfX2RvdWJsZSgpIHsKKwkJYXNzZXJ0VHJ1ZShkYXRhLmNvbnRhaW5zKDEwLjApKQorCQlhc3NlcnRUcnVlKGRhdGEuY29udGFpbnMoMjAuMCkpCisJCWFzc2VydFRydWUoZGF0YS5jb250YWlucygzMC4wKSkKKwkJCisJCWFzc2VydEZhbHNlKGRhdGEuY29udGFpbnMoNDAuMCkpCisJfQorCQorCUBUZXN0CisJZGVmIHZvaWQgdGVzdENvbnRhaW5zX19mbG9hdF9OYU4oKSB7CisJCXZhbCBkb3VibGVbXSBuYW5EYXRhID0gI1sxLjAsIERvdWJsZS5OYU5dCisJCQorCQlhc3NlcnRUcnVlKG5hbkRhdGEuY29udGFpbnMoRG91YmxlLk5hTikpCisJCWFzc2VydFRydWUobmFuRGF0YS5jb250YWlucygwZiAvIDBmKSkKKwkJYXNzZXJ0VHJ1ZShuYW5EYXRhLmNvbnRhaW5zKE1hdGgubG9nKC0xKSkpCisJCQorCQlhc3NlcnRGYWxzZShuYW5EYXRhLmNvbnRhaW5zKERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSkpCisJCWFzc2VydEZhbHNlKG5hbkRhdGEuY29udGFpbnMoRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKSkKKwl9CisJCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0Q29udGFpbnNfX2RvdWJsZV9wb3NJbmZpbml0eSgpIHsKKwkJdmFsIGRvdWJsZVtdIG5hbkRhdGEgPSAjWzEuMGYsIERvdWJsZS5QT1NJVElWRV9JTkZJTklUWV0KKwkJCisJCWFzc2VydFRydWUobmFuRGF0YS5jb250YWlucyhEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkpKQorCQlhc3NlcnRUcnVlKG5hbkRhdGEuY29udGFpbnMoRG91YmxlLlBPU0lUSVZFX0lORklOSVRZICsgNy4yZikpCisJCQorCQlhc3NlcnRGYWxzZShuYW5EYXRhLmNvbnRhaW5zKERvdWJsZS5OYU4pKQorCQlhc3NlcnRGYWxzZShuYW5EYXRhLmNvbnRhaW5zKDBmIC8gMGYpKQorCQlhc3NlcnRGYWxzZShuYW5EYXRhLmNvbnRhaW5zKE1hdGgubG9nKC0xKSkpCisJCWFzc2VydEZhbHNlKG5hbkRhdGEuY29udGFpbnMoRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKSkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RDb250YWluc19fZG91YmxlX25lZ0luZmluaXR5KCkgeworCQl2YWwgZG91YmxlW10gbmFuRGF0YSA9ICNbMS4wZiwgRG91YmxlLk5FR0FUSVZFX0lORklOSVRZXQorCQkKKwkJYXNzZXJ0VHJ1ZShuYW5EYXRhLmNvbnRhaW5zKERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSkpCisJCWFzc2VydFRydWUobmFuRGF0YS5jb250YWlucyhEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkgKyA3LjJmKSkKKwkJCisJCWFzc2VydEZhbHNlKG5hbkRhdGEuY29udGFpbnMoRG91YmxlLk5hTikpCisJCWFzc2VydEZhbHNlKG5hbkRhdGEuY29udGFpbnMoMGYgLyAwZikpCisJCWFzc2VydEZhbHNlKG5hbkRhdGEuY29udGFpbnMoTWF0aC5sb2coLTEpKSkKKwkJYXNzZXJ0RmFsc2UobmFuRGF0YS5jb250YWlucyhEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkpKQorCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9BcnJheUV4dGVuc2lvbnNGbG9hdFRlc3QuamF2YSBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zRmxvYXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5ZjFiZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zRmxvYXRUZXN0LmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE5IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqIAorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50ZXN0cy5saWI7CisKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuQXJyYXlFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5PYmplY3RFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzLlByb2NlZHVyZTE7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgTWF0aGlhcyBSaWVkZXIgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEFycmF5RXh0ZW5zaW9uc0Zsb2F0VGVzdCB7CisgIHByaXZhdGUgZmxvYXRbXSBkYXRhOworICAKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgIHRoaXMuZGF0YSA9IHRoaXMuY3JlYXRlRGF0YSgpOworICB9CisgIAorICBwcml2YXRlIGZsb2F0W10gY3JlYXRlRGF0YSgpIHsKKyAgICBmaW5hbCBmbG9hdFtdIGFycmF5ID0gbmV3IGZsb2F0WzNdOworICAgIGFycmF5WzBdID0gMTAuMGY7CisgICAgYXJyYXlbMV0gPSAyMC4wZjsKKyAgICBhcnJheVsyXSA9IDMwLjBmOworICAgIHJldHVybiBhcnJheTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFNldEdldF9fZmxvYXQoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMC4wZiwgdGhpcy5kYXRhWzBdLCAwLjAwMWYpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAuMGYsIHRoaXMuZGF0YVsxXSwgMC4wMDFmKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwLjBmLCB0aGlzLmRhdGFbMl0sIDAuMDAxZik7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDbG9uZV9fZmxvYXQoKSB7CisgICAgZmluYWwgZmxvYXRbXSBjbG9uZWREYXRhID0gdGhpcy5kYXRhLmNsb25lKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMC4wZiwgY2xvbmVkRGF0YVswXSwgMC4wMDFmKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwLjBmLCBjbG9uZWREYXRhWzFdLCAwLjAwMWYpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzAuMGYsIGNsb25lZERhdGFbMl0sIDAuMDAxZik7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RMZW5ndGhfX2Zsb2F0KCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgdGhpcy5kYXRhLmxlbmd0aCk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZV9fZmxvYXQoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhPYmplY3RzLmhhc2hDb2RlKHRoaXMuZGF0YSksIHRoaXMuZGF0YS5oYXNoQ29kZSgpKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEVxdWFsc19fZmxvYXQoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUodGhpcy5kYXRhLmVxdWFscyh0aGlzLmRhdGEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhLmVxdWFscyh0aGlzLmNyZWF0ZURhdGEoKSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZSh0aGlzLmRhdGEuZXF1YWxzKG5ldyBPYmplY3RbM10pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhLmVxdWFscyhudWxsKSk7CisgICAgZmxvYXRbXSBfY3JlYXRlRGF0YSA9IHRoaXMuY3JlYXRlRGF0YSgpOworICAgIGZpbmFsIFByb2NlZHVyZTE8ZmxvYXRbXT4gX2Z1bmN0aW9uID0gKGZsb2F0W10gaXQpIC0+IHsKKyAgICAgIGl0WzFdID0gMC4wZjsKKyAgICB9OworICAgIGZpbmFsIGZsb2F0W10gbmV3RGF0YSA9IE9iamVjdEV4dGVuc2lvbnMuPGZsb2F0W10+b3BlcmF0b3JfZG91YmxlQXJyb3coX2NyZWF0ZURhdGEsIF9mdW5jdGlvbik7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHRoaXMuZGF0YS5lcXVhbHMobmV3RGF0YSkpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNfX2Zsb2F0KCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyh0aGlzLmRhdGEsIDEwLjBmKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKHRoaXMuZGF0YSwgMjAuMGYpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCAzMC4wZikpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCA0MC4wZikpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNfX2Zsb2F0X05hTigpIHsKKyAgICBmaW5hbCBmbG9hdFtdIG5hbkRhdGEgPSB7IDEuMGYsIEZsb2F0Lk5hTiB9OworICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyhuYW5EYXRhLCBGbG9hdC5OYU4pKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMobmFuRGF0YSwgKDBmIC8gMGYpKSk7CisgICAgZG91YmxlIF9sb2cgPSBNYXRoLmxvZygoLTEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMobmFuRGF0YSwgKChmbG9hdCkgX2xvZykpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKG5hbkRhdGEsIEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyhuYW5EYXRhLCBGbG9hdC5QT1NJVElWRV9JTkZJTklUWSkpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNfX2Zsb2F0X3Bvc0luZmluaXR5KCkgeworICAgIGZpbmFsIGZsb2F0W10gbmFuRGF0YSA9IHsgMS4wZiwgRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkgfTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMobmFuRGF0YSwgRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMobmFuRGF0YSwgKEZsb2F0LlBPU0lUSVZFX0lORklOSVRZICsgNy4yZikpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKG5hbkRhdGEsIEZsb2F0Lk5hTikpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMobmFuRGF0YSwgKDBmIC8gMGYpKSk7CisgICAgZG91YmxlIF9sb2cgPSBNYXRoLmxvZygoLTEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKG5hbkRhdGEsICgoZmxvYXQpIF9sb2cpKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyhuYW5EYXRhLCBGbG9hdC5ORUdBVElWRV9JTkZJTklUWSkpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNfX2Zsb2F0X25lZ0luZmluaXR5KCkgeworICAgIGZpbmFsIGZsb2F0W10gbmFuRGF0YSA9IHsgMS4wZiwgRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkgfTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMobmFuRGF0YSwgRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMobmFuRGF0YSwgKEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZICsgNy4yZikpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKG5hbkRhdGEsIEZsb2F0Lk5hTikpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnMobmFuRGF0YSwgKDBmIC8gMGYpKSk7CisgICAgZG91YmxlIF9sb2cgPSBNYXRoLmxvZygoLTEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKG5hbkRhdGEsICgoZmxvYXQpIF9sb2cpKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyhuYW5EYXRhLCBGbG9hdC5QT1NJVElWRV9JTkZJTklUWSkpOworICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0Zsb2F0VGVzdC54dGVuZCBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zRmxvYXRUZXN0Lnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YTlhZmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0Zsb2F0VGVzdC54dGVuZApAQCAtMCwwICsxLDEyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxOSBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50ZXN0cy5saWIKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZQoraW1wb3J0IG9yZy5qdW5pdC5UZXN0CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qCisKKy8qKgorICogQGF1dGhvciBNYXRoaWFzIFJpZWRlciAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqLworY2xhc3MgQXJyYXlFeHRlbnNpb25zRmxvYXRUZXN0IHsKKworCXZhciBmbG9hdFtdIGRhdGEKKworCUBCZWZvcmUKKwlkZWYgdm9pZCBpbml0KCkgeworCQlkYXRhID0gY3JlYXRlRGF0YSgpCisJfQorCisJcHJpdmF0ZSBkZWYgZmxvYXRbXSBjcmVhdGVEYXRhKCkgeworCQl2YWwgZmxvYXRbXSBhcnJheSA9IG5ld0Zsb2F0QXJyYXlPZlNpemUoMykKKwkJYXJyYXkuc2V0KDAsIDEwLjBmKQorCQlhcnJheS5zZXQoMSwgMjAuMGYpCisJCWFycmF5LnNldCgyLCAzMC4wZikKKwkJcmV0dXJuIGFycmF5CisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0U2V0R2V0X19mbG9hdCgpIHsKKwkJYXNzZXJ0RXF1YWxzKDEwLjBmLCBkYXRhLmdldCgwKSwgMC4wMDFmKQorCQlhc3NlcnRFcXVhbHMoMjAuMGYsIGRhdGEuZ2V0KDEpLCAwLjAwMWYpCisJCWFzc2VydEVxdWFscygzMC4wZiwgZGF0YS5nZXQoMiksIDAuMDAxZikKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RDbG9uZV9fZmxvYXQoKSB7CisJCXZhbCBjbG9uZWREYXRhID0gZGF0YS5jbG9uZSgpOworCisJCWFzc2VydEVxdWFscygxMC4wZiwgY2xvbmVkRGF0YS5nZXQoMCksIDAuMDAxZikKKwkJYXNzZXJ0RXF1YWxzKDIwLjBmLCBjbG9uZWREYXRhLmdldCgxKSwgMC4wMDFmKQorCQlhc3NlcnRFcXVhbHMoMzAuMGYsIGNsb25lZERhdGEuZ2V0KDIpLCAwLjAwMWYpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0TGVuZ3RoX19mbG9hdCgpIHsKKwkJYXNzZXJ0RXF1YWxzKDMsIGRhdGEubGVuZ3RoKQorCX0KKworCUBUZXN0CisJZGVmIHZvaWQgdGVzdEhhc2hDb2RlX19mbG9hdCgpIHsKKwkJYXNzZXJ0RXF1YWxzKE9iamVjdHMuaGFzaENvZGUoZGF0YSksIGRhdGEuaGFzaENvZGUpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0RXF1YWxzX19mbG9hdCgpIHsKKwkJYXNzZXJ0VHJ1ZShkYXRhLmVxdWFscyhkYXRhKSkKKworCQlhc3NlcnRGYWxzZShkYXRhLmVxdWFscyhjcmVhdGVEYXRhKCkpKQorCQlhc3NlcnRGYWxzZShkYXRhLmVxdWFscyhuZXdBcnJheU9mU2l6ZSgzKSkpCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKG51bGwpKQorCisJCXZhbCBuZXdEYXRhID0gY3JlYXRlRGF0YSgpID0+IFtpdC5zZXQoMSwgMC4wZildCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKG5ld0RhdGEpKQorCX0KKworCUBUZXN0IAorCWRlZiB2b2lkIHRlc3RDb250YWluc19fZmxvYXQoKSB7CisJCWFzc2VydFRydWUoZGF0YS5jb250YWlucygxMC4wZikpCisJCWFzc2VydFRydWUoZGF0YS5jb250YWlucygyMC4wZikpCisJCWFzc2VydFRydWUoZGF0YS5jb250YWlucygzMC4wZikpCisJCQorCQlhc3NlcnRGYWxzZShkYXRhLmNvbnRhaW5zKDQwLjBmKSkKKwl9CisJCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0Q29udGFpbnNfX2Zsb2F0X05hTigpIHsKKwkJdmFsIGZsb2F0W10gbmFuRGF0YSA9ICNbMS4wZiwgRmxvYXQuTmFOXQorCQkKKwkJYXNzZXJ0VHJ1ZShuYW5EYXRhLmNvbnRhaW5zKEZsb2F0Lk5hTikpCisJCWFzc2VydFRydWUobmFuRGF0YS5jb250YWlucygwZiAvIDBmKSkKKwkJYXNzZXJ0VHJ1ZShuYW5EYXRhLmNvbnRhaW5zKE1hdGgubG9nKC0xKSBhcyBmbG9hdCkpCisJCQorCQlhc3NlcnRGYWxzZShuYW5EYXRhLmNvbnRhaW5zKEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZKSkKKwkJYXNzZXJ0RmFsc2UobmFuRGF0YS5jb250YWlucyhGbG9hdC5QT1NJVElWRV9JTkZJTklUWSkpCisJfQorCQorCUBUZXN0CisJZGVmIHZvaWQgdGVzdENvbnRhaW5zX19mbG9hdF9wb3NJbmZpbml0eSgpIHsKKwkJdmFsIGZsb2F0W10gbmFuRGF0YSA9ICNbMS4wZiwgRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFldCisJCQorCQlhc3NlcnRUcnVlKG5hbkRhdGEuY29udGFpbnMoRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkpKQorCQlhc3NlcnRUcnVlKG5hbkRhdGEuY29udGFpbnMoRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkgKyA3LjJmKSkKKwkJCisJCWFzc2VydEZhbHNlKG5hbkRhdGEuY29udGFpbnMoRmxvYXQuTmFOKSkKKwkJYXNzZXJ0RmFsc2UobmFuRGF0YS5jb250YWlucygwZiAvIDBmKSkKKwkJYXNzZXJ0RmFsc2UobmFuRGF0YS5jb250YWlucyhNYXRoLmxvZygtMSkgYXMgZmxvYXQpKQorCQlhc3NlcnRGYWxzZShuYW5EYXRhLmNvbnRhaW5zKEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZKSkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RDb250YWluc19fZmxvYXRfbmVnSW5maW5pdHkoKSB7CisJCXZhbCBmbG9hdFtdIG5hbkRhdGEgPSAjWzEuMGYsIEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZXQorCQkKKwkJYXNzZXJ0VHJ1ZShuYW5EYXRhLmNvbnRhaW5zKEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZKSkKKwkJYXNzZXJ0VHJ1ZShuYW5EYXRhLmNvbnRhaW5zKEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZICsgNy4yZikpCisJCQorCQlhc3NlcnRGYWxzZShuYW5EYXRhLmNvbnRhaW5zKEZsb2F0Lk5hTikpCisJCWFzc2VydEZhbHNlKG5hbkRhdGEuY29udGFpbnMoMGYgLyAwZikpCisJCWFzc2VydEZhbHNlKG5hbkRhdGEuY29udGFpbnMoTWF0aC5sb2coLTEpIGFzIGZsb2F0KSkKKwkJYXNzZXJ0RmFsc2UobmFuRGF0YS5jb250YWlucyhGbG9hdC5QT1NJVElWRV9JTkZJTklUWSkpCisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0ludFRlc3QuamF2YSBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zSW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTVmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0ludFRlc3QuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxOSBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKiAKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UudGVzdHMubGliOworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkFycmF5RXh0ZW5zaW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuT2JqZWN0RXh0ZW5zaW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlcy5Qcm9jZWR1cmUxOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIE1hdGhpYXMgUmllZGVyIC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBBcnJheUV4dGVuc2lvbnNJbnRUZXN0IHsKKyAgcHJpdmF0ZSBpbnRbXSBkYXRhOworICAKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgIHRoaXMuZGF0YSA9IHRoaXMuY3JlYXRlRGF0YSgpOworICB9CisgIAorICBwcml2YXRlIGludFtdIGNyZWF0ZURhdGEoKSB7CisgICAgZmluYWwgaW50W10gYXJyYXkgPSBuZXcgaW50WzNdOworICAgIGFycmF5WzBdID0gMTA7CisgICAgYXJyYXlbMV0gPSAyMDsKKyAgICBhcnJheVsyXSA9IDMwOworICAgIHJldHVybiBhcnJheTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFNldEdldF9faW50KCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAsIHRoaXMuZGF0YVswXSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMCwgdGhpcy5kYXRhWzFdKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwLCB0aGlzLmRhdGFbMl0pOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q2xvbmVfX2ludCgpIHsKKyAgICBmaW5hbCBpbnRbXSBjbG9uZWREYXRhID0gdGhpcy5kYXRhLmNsb25lKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMCwgY2xvbmVkRGF0YVswXSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMCwgY2xvbmVkRGF0YVsxXSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMCwgY2xvbmVkRGF0YVsyXSk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RMZW5ndGhfX2ludCgpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIHRoaXMuZGF0YS5sZW5ndGgpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGVfX2ludCgpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE9iamVjdHMuaGFzaENvZGUodGhpcy5kYXRhKSwgdGhpcy5kYXRhLmhhc2hDb2RlKCkpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzX19pbnQoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUodGhpcy5kYXRhLmVxdWFscyh0aGlzLmRhdGEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhLmVxdWFscyh0aGlzLmNyZWF0ZURhdGEoKSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZSh0aGlzLmRhdGEuZXF1YWxzKG5ldyBPYmplY3RbM10pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhLmVxdWFscyhudWxsKSk7CisgICAgaW50W10gX2NyZWF0ZURhdGEgPSB0aGlzLmNyZWF0ZURhdGEoKTsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPGludFtdPiBfZnVuY3Rpb24gPSAoaW50W10gaXQpIC0+IHsKKyAgICAgIGl0WzFdID0gMDsKKyAgICB9OworICAgIGZpbmFsIGludFtdIG5ld0RhdGEgPSBPYmplY3RFeHRlbnNpb25zLjxpbnRbXT5vcGVyYXRvcl9kb3VibGVBcnJvdyhfY3JlYXRlRGF0YSwgX2Z1bmN0aW9uKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhLmVxdWFscyhuZXdEYXRhKSk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc19faW50KCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyh0aGlzLmRhdGEsIDEwKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKHRoaXMuZGF0YSwgMjApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCAzMCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCA0MCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0ludFRlc3QueHRlbmQgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0ludFRlc3QueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJiYzE1YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zSW50VGVzdC54dGVuZApAQCAtMCwwICsxLDg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE5IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnRlc3RzLmxpYgorCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZQoraW1wb3J0IG9yZy5qdW5pdC5UZXN0CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHMKKworLyoqCisgKiBAYXV0aG9yIE1hdGhpYXMgUmllZGVyIC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICovCitjbGFzcyBBcnJheUV4dGVuc2lvbnNJbnRUZXN0IHsKKworCXZhciBpbnRbXSBkYXRhCisKKwlAQmVmb3JlCisJZGVmIHZvaWQgaW5pdCgpIHsKKwkJZGF0YSA9IGNyZWF0ZURhdGEoKQorCX0KKworCXByaXZhdGUgZGVmIGludFtdIGNyZWF0ZURhdGEoKSB7CisJCXZhbCBpbnRbXSBhcnJheSA9IG5ld0ludEFycmF5T2ZTaXplKDMpCisJCWFycmF5LnNldCgwLCAxMCkKKwkJYXJyYXkuc2V0KDEsIDIwKQorCQlhcnJheS5zZXQoMiwgMzApCisJCXJldHVybiBhcnJheQorCX0KKworCUBUZXN0CisJZGVmIHZvaWQgdGVzdFNldEdldF9faW50KCkgeworCQlhc3NlcnRFcXVhbHMoMTAsIGRhdGEuZ2V0KDApKQorCQlhc3NlcnRFcXVhbHMoMjAsIGRhdGEuZ2V0KDEpKQorCQlhc3NlcnRFcXVhbHMoMzAsIGRhdGEuZ2V0KDIpKQorCX0KKworCUBUZXN0CisJZGVmIHZvaWQgdGVzdENsb25lX19pbnQoKSB7CisJCXZhbCBjbG9uZWREYXRhID0gZGF0YS5jbG9uZSgpOworCisJCWFzc2VydEVxdWFscygxMCwgY2xvbmVkRGF0YS5nZXQoMCkpCisJCWFzc2VydEVxdWFscygyMCwgY2xvbmVkRGF0YS5nZXQoMSkpCisJCWFzc2VydEVxdWFscygzMCwgY2xvbmVkRGF0YS5nZXQoMikpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0TGVuZ3RoX19pbnQoKSB7CisJCWFzc2VydEVxdWFscygzLCBkYXRhLmxlbmd0aCkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RIYXNoQ29kZV9faW50KCkgeworCQlhc3NlcnRFcXVhbHMoT2JqZWN0cy5oYXNoQ29kZShkYXRhKSwgZGF0YS5oYXNoQ29kZSkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RFcXVhbHNfX2ludCgpIHsKKwkJYXNzZXJ0VHJ1ZShkYXRhLmVxdWFscyhkYXRhKSkKKworCQlhc3NlcnRGYWxzZShkYXRhLmVxdWFscyhjcmVhdGVEYXRhKCkpKQorCQlhc3NlcnRGYWxzZShkYXRhLmVxdWFscyhuZXdBcnJheU9mU2l6ZSgzKSkpCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKG51bGwpKQorCisJCXZhbCBuZXdEYXRhID0gY3JlYXRlRGF0YSgpID0+IFtpdC5zZXQoMSwgMCldCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKG5ld0RhdGEpKQorCX0KKworCUBUZXN0IAorCWRlZiB2b2lkIHRlc3RDb250YWluc19faW50KCkgeworCQlhc3NlcnRUcnVlKGRhdGEuY29udGFpbnMoMTApKQorCQlhc3NlcnRUcnVlKGRhdGEuY29udGFpbnMoMjApKQorCQlhc3NlcnRUcnVlKGRhdGEuY29udGFpbnMoMzApKQorCQkKKwkJYXNzZXJ0RmFsc2UoZGF0YS5jb250YWlucyg0MCkpCisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0xvbmdUZXN0LmphdmEgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc0xvbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkODQyNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zTG9uZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxOSBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKiAKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UudGVzdHMubGliOworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkFycmF5RXh0ZW5zaW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuT2JqZWN0RXh0ZW5zaW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlcy5Qcm9jZWR1cmUxOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIE1hdGhpYXMgUmllZGVyIC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBBcnJheUV4dGVuc2lvbnNMb25nVGVzdCB7CisgIHByaXZhdGUgbG9uZ1tdIGRhdGE7CisgIAorICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgdGhpcy5kYXRhID0gdGhpcy5jcmVhdGVEYXRhKCk7CisgIH0KKyAgCisgIHByaXZhdGUgbG9uZ1tdIGNyZWF0ZURhdGEoKSB7CisgICAgZmluYWwgbG9uZ1tdIGFycmF5ID0gbmV3IGxvbmdbM107CisgICAgYXJyYXlbMF0gPSAxMGw7CisgICAgYXJyYXlbMV0gPSAyMGw7CisgICAgYXJyYXlbMl0gPSAzMGw7CisgICAgcmV0dXJuIGFycmF5OworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0X19sb25nKCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTBsLCB0aGlzLmRhdGFbMF0pOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjBsLCB0aGlzLmRhdGFbMV0pOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzBsLCB0aGlzLmRhdGFbMl0pOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q2xvbmVfX2xvbmcoKSB7CisgICAgZmluYWwgbG9uZ1tdIGNsb25lZERhdGEgPSB0aGlzLmRhdGEuY2xvbmUoKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwbCwgY2xvbmVkRGF0YVswXSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMGwsIGNsb25lZERhdGFbMV0pOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzBsLCBjbG9uZWREYXRhWzJdKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdExlbmd0aF9fbG9uZygpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIHRoaXMuZGF0YS5sZW5ndGgpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGVfX2xvbmcoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhPYmplY3RzLmhhc2hDb2RlKHRoaXMuZGF0YSksIHRoaXMuZGF0YS5oYXNoQ29kZSgpKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEVxdWFsc19fbG9uZygpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0aGlzLmRhdGEuZXF1YWxzKHRoaXMuZGF0YSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZSh0aGlzLmRhdGEuZXF1YWxzKHRoaXMuY3JlYXRlRGF0YSgpKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHRoaXMuZGF0YS5lcXVhbHMobmV3IE9iamVjdFszXSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZSh0aGlzLmRhdGEuZXF1YWxzKG51bGwpKTsKKyAgICBsb25nW10gX2NyZWF0ZURhdGEgPSB0aGlzLmNyZWF0ZURhdGEoKTsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPGxvbmdbXT4gX2Z1bmN0aW9uID0gKGxvbmdbXSBpdCkgLT4geworICAgICAgaXRbMV0gPSAwbDsKKyAgICB9OworICAgIGZpbmFsIGxvbmdbXSBuZXdEYXRhID0gT2JqZWN0RXh0ZW5zaW9ucy48bG9uZ1tdPm9wZXJhdG9yX2RvdWJsZUFycm93KF9jcmVhdGVEYXRhLCBfZnVuY3Rpb24pOworICAgIEFzc2VydC5hc3NlcnRGYWxzZSh0aGlzLmRhdGEuZXF1YWxzKG5ld0RhdGEpKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zX19sb25nKCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyh0aGlzLmRhdGEsIDEwbCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyh0aGlzLmRhdGEsIDIwbCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyh0aGlzLmRhdGEsIDMwbCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCA0MGwpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9BcnJheUV4dGVuc2lvbnNMb25nVGVzdC54dGVuZCBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zTG9uZ1Rlc3QueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlMzc4NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zTG9uZ1Rlc3QueHRlbmQKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxOSBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50ZXN0cy5saWIKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmUKK2ltcG9ydCBvcmcuanVuaXQuVGVzdAorCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKgoraW1wb3J0IGphdmEudXRpbC5PYmplY3RzCisKKy8qKgorICogQGF1dGhvciBNYXRoaWFzIFJpZWRlciAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqLworY2xhc3MgQXJyYXlFeHRlbnNpb25zTG9uZ1Rlc3QgeworCisJdmFyIGxvbmdbXSBkYXRhCisKKwlAQmVmb3JlCisJZGVmIHZvaWQgaW5pdCgpIHsKKwkJZGF0YSA9IGNyZWF0ZURhdGEoKQorCX0KKworCXByaXZhdGUgZGVmIGxvbmdbXSBjcmVhdGVEYXRhKCkgeworCQl2YWwgbG9uZ1tdIGFycmF5ID0gbmV3TG9uZ0FycmF5T2ZTaXplKDMpCisJCWFycmF5LnNldCgwLCAxMGwpCisJCWFycmF5LnNldCgxLCAyMGwpCisJCWFycmF5LnNldCgyLCAzMGwpCisJCXJldHVybiBhcnJheQorCX0KKworCUBUZXN0CisJZGVmIHZvaWQgdGVzdFNldEdldF9fbG9uZygpIHsKKwkJYXNzZXJ0RXF1YWxzKDEwbCwgZGF0YS5nZXQoMCkpCisJCWFzc2VydEVxdWFscygyMGwsIGRhdGEuZ2V0KDEpKQorCQlhc3NlcnRFcXVhbHMoMzBsLCBkYXRhLmdldCgyKSkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RDbG9uZV9fbG9uZygpIHsKKwkJdmFsIGNsb25lZERhdGEgPSBkYXRhLmNsb25lKCk7CisKKwkJYXNzZXJ0RXF1YWxzKDEwbCwgY2xvbmVkRGF0YS5nZXQoMCkpCisJCWFzc2VydEVxdWFscygyMGwsIGNsb25lZERhdGEuZ2V0KDEpKQorCQlhc3NlcnRFcXVhbHMoMzBsLCBjbG9uZWREYXRhLmdldCgyKSkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RMZW5ndGhfX2xvbmcoKSB7CisJCWFzc2VydEVxdWFscygzLCBkYXRhLmxlbmd0aCkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RIYXNoQ29kZV9fbG9uZygpIHsKKwkJYXNzZXJ0RXF1YWxzKE9iamVjdHMuaGFzaENvZGUoZGF0YSksIGRhdGEuaGFzaENvZGUpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0RXF1YWxzX19sb25nKCkgeworCQlhc3NlcnRUcnVlKGRhdGEuZXF1YWxzKGRhdGEpKQorCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKGNyZWF0ZURhdGEoKSkpCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKG5ld0FycmF5T2ZTaXplKDMpKSkKKwkJYXNzZXJ0RmFsc2UoZGF0YS5lcXVhbHMobnVsbCkpCisKKwkJdmFsIG5ld0RhdGEgPSBjcmVhdGVEYXRhKCkgPT4gW2l0LnNldCgxLCAwbCldCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKG5ld0RhdGEpKQorCX0KKworCUBUZXN0IAorCWRlZiB2b2lkIHRlc3RDb250YWluc19fbG9uZygpIHsKKwkJYXNzZXJ0VHJ1ZShkYXRhLmNvbnRhaW5zKDEwbCkpCisJCWFzc2VydFRydWUoZGF0YS5jb250YWlucygyMGwpKQorCQlhc3NlcnRUcnVlKGRhdGEuY29udGFpbnMoMzBsKSkKKwkJCisJCWFzc2VydEZhbHNlKGRhdGEuY29udGFpbnMoNDBsKSkKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zT2JqZWN0VGVzdC5qYXZhIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9BcnJheUV4dGVuc2lvbnNPYmplY3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhZTA4OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zT2JqZWN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE5IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqIAorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50ZXN0cy5saWI7CisKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuQXJyYXlFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5PYmplY3RFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzLlByb2NlZHVyZTE7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgTWF0aGlhcyBSaWVkZXIgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEFycmF5RXh0ZW5zaW9uc09iamVjdFRlc3QgeworICBwcml2YXRlIE9iamVjdFtdIGRhdGE7CisgIAorICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgdGhpcy5kYXRhID0gdGhpcy5jcmVhdGVEYXRhKCk7CisgIH0KKyAgCisgIHByaXZhdGUgT2JqZWN0W10gY3JlYXRlRGF0YSgpIHsKKyAgICBmaW5hbCBPYmplY3RbXSBhcnJheSA9IG5ldyBPYmplY3RbM107CisgICAgYXJyYXlbMF0gPSBJbnRlZ2VyLnZhbHVlT2YoMCk7CisgICAgYXJyYXlbMV0gPSBJbnRlZ2VyLnZhbHVlT2YoMSk7CisgICAgYXJyYXlbMl0gPSBudWxsOworICAgIHJldHVybiBhcnJheTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFNldEdldF9fT2JqZWN0KCkgeworICAgIEFzc2VydC5hc3NlcnRTYW1lKEludGVnZXIudmFsdWVPZigwKSwgdGhpcy5kYXRhWzBdKTsKKyAgICBBc3NlcnQuYXNzZXJ0U2FtZShJbnRlZ2VyLnZhbHVlT2YoMSksIHRoaXMuZGF0YVsxXSk7CisgICAgQXNzZXJ0LmFzc2VydE51bGwobnVsbCwgdGhpcy5kYXRhWzJdKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENsb25lX19PYmplY3QoKSB7CisgICAgZmluYWwgT2JqZWN0W10gY2xvbmVkRGF0YSA9IHRoaXMuZGF0YS5jbG9uZSgpOworICAgIEFzc2VydC5hc3NlcnRTYW1lKEludGVnZXIudmFsdWVPZigwKSwgY2xvbmVkRGF0YVswXSk7CisgICAgQXNzZXJ0LmFzc2VydFNhbWUoSW50ZWdlci52YWx1ZU9mKDEpLCBjbG9uZWREYXRhWzFdKTsKKyAgICBBc3NlcnQuYXNzZXJ0TnVsbChudWxsLCB0aGlzLmRhdGFbMl0pOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0TGVuZ3RoX19PYmplY3QoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCB0aGlzLmRhdGEubGVuZ3RoKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlX19PYmplY3QoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhPYmplY3RzLmhhc2hDb2RlKHRoaXMuZGF0YSksIHRoaXMuZGF0YS5oYXNoQ29kZSgpKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEVxdWFsc19fT2JqZWN0KCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKHRoaXMuZGF0YS5lcXVhbHModGhpcy5kYXRhKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHRoaXMuZGF0YS5lcXVhbHModGhpcy5jcmVhdGVEYXRhKCkpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhLmVxdWFscyhuZXcgT2JqZWN0WzNdKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHRoaXMuZGF0YS5lcXVhbHMobnVsbCkpOworICAgIE9iamVjdFtdIF9jcmVhdGVEYXRhID0gdGhpcy5jcmVhdGVEYXRhKCk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxPYmplY3RbXT4gX2Z1bmN0aW9uID0gKE9iamVjdFtdIGl0KSAtPiB7CisgICAgICBpdFsxXSA9ICJIZWxsbyBXb3JsZCI7CisgICAgfTsKKyAgICBmaW5hbCBPYmplY3RbXSBuZXdEYXRhID0gT2JqZWN0RXh0ZW5zaW9ucy48T2JqZWN0W10+b3BlcmF0b3JfZG91YmxlQXJyb3coX2NyZWF0ZURhdGEsIF9mdW5jdGlvbik7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHRoaXMuZGF0YS5lcXVhbHMobmV3RGF0YSkpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNfX09iamVjdCgpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCBJbnRlZ2VyLnZhbHVlT2YoMCkpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCBJbnRlZ2VyLnZhbHVlT2YoMSkpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCBudWxsKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKEFycmF5RXh0ZW5zaW9ucy5jb250YWlucyh0aGlzLmRhdGEsIEludGVnZXIudmFsdWVPZigzKSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCBJbnRlZ2VyLnZhbHVlT2YoNCkpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9BcnJheUV4dGVuc2lvbnNPYmplY3RUZXN0Lnh0ZW5kIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9BcnJheUV4dGVuc2lvbnNPYmplY3RUZXN0Lnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MWU4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc09iamVjdFRlc3QueHRlbmQKQEAgLTAsMCArMSw4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxOSBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50ZXN0cy5saWIKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZQoraW1wb3J0IG9yZy5qdW5pdC5UZXN0CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qCisKKy8qKgorICogQGF1dGhvciBNYXRoaWFzIFJpZWRlciAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqLworY2xhc3MgQXJyYXlFeHRlbnNpb25zT2JqZWN0VGVzdCB7CisKKwl2YXIgT2JqZWN0W10gZGF0YQorCisJQEJlZm9yZQorCWRlZiB2b2lkIGluaXQoKSB7CisJCWRhdGEgPSBjcmVhdGVEYXRhKCkKKwl9CisKKwlwcml2YXRlIGRlZiBPYmplY3RbXSBjcmVhdGVEYXRhKCkgeworCQl2YWwgT2JqZWN0W10gYXJyYXkgPSBuZXdBcnJheU9mU2l6ZSgzKQorCQlhcnJheS5zZXQoMCwgSW50ZWdlci52YWx1ZU9mKDApKQorCQlhcnJheS5zZXQoMSwgSW50ZWdlci52YWx1ZU9mKDEpKQorCQlhcnJheS5zZXQoMiwgbnVsbCkKKwkJcmV0dXJuIGFycmF5CisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0U2V0R2V0X19PYmplY3QoKSB7CisJCWFzc2VydFNhbWUoSW50ZWdlci52YWx1ZU9mKDApLCBkYXRhLmdldCgwKSkKKwkJYXNzZXJ0U2FtZShJbnRlZ2VyLnZhbHVlT2YoMSksIGRhdGEuZ2V0KDEpKQorCQlhc3NlcnROdWxsKG51bGwsIGRhdGEuZ2V0KDIpKQorCX0KKworCUBUZXN0CisJZGVmIHZvaWQgdGVzdENsb25lX19PYmplY3QoKSB7CisJCXZhbCBjbG9uZWREYXRhID0gZGF0YS5jbG9uZSgpOworCisJCWFzc2VydFNhbWUoSW50ZWdlci52YWx1ZU9mKDApLCBjbG9uZWREYXRhLmdldCgwKSkKKwkJYXNzZXJ0U2FtZShJbnRlZ2VyLnZhbHVlT2YoMSksIGNsb25lZERhdGEuZ2V0KDEpKQorCQlhc3NlcnROdWxsKG51bGwsIGRhdGEuZ2V0KDIpKQorCX0KKworCUBUZXN0CisJZGVmIHZvaWQgdGVzdExlbmd0aF9fT2JqZWN0KCkgeworCQlhc3NlcnRFcXVhbHMoMywgZGF0YS5sZW5ndGgpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0SGFzaENvZGVfX09iamVjdCgpIHsKKwkJYXNzZXJ0RXF1YWxzKE9iamVjdHMuaGFzaENvZGUoZGF0YSksIGRhdGEuaGFzaENvZGUpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0RXF1YWxzX19PYmplY3QoKSB7CisJCWFzc2VydFRydWUoZGF0YS5lcXVhbHMoZGF0YSkpCisKKwkJYXNzZXJ0RmFsc2UoZGF0YS5lcXVhbHMoY3JlYXRlRGF0YSgpKSkKKwkJYXNzZXJ0RmFsc2UoZGF0YS5lcXVhbHMobmV3QXJyYXlPZlNpemUoMykpKQorCQlhc3NlcnRGYWxzZShkYXRhLmVxdWFscyhudWxsKSkKKworCQl2YWwgbmV3RGF0YSA9IGNyZWF0ZURhdGEoKSA9PiBbaXQuc2V0KDEsICJIZWxsbyBXb3JsZCIpXQorCQlhc3NlcnRGYWxzZShkYXRhLmVxdWFscyhuZXdEYXRhKSkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RDb250YWluc19fT2JqZWN0KCkgeworCQlhc3NlcnRUcnVlKGRhdGEuY29udGFpbnMoSW50ZWdlci52YWx1ZU9mKDApKSkKKwkJYXNzZXJ0VHJ1ZShkYXRhLmNvbnRhaW5zKEludGVnZXIudmFsdWVPZigxKSkpCisJCWFzc2VydFRydWUoZGF0YS5jb250YWlucyhudWxsKSkKKworCQlhc3NlcnRGYWxzZShkYXRhLmNvbnRhaW5zKEludGVnZXIudmFsdWVPZigzKSkpCisJCWFzc2VydEZhbHNlKGRhdGEuY29udGFpbnMoSW50ZWdlci52YWx1ZU9mKDQpKSkKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zU2hvcnRUZXN0LmphdmEgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc1Nob3J0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNTJmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0FycmF5RXh0ZW5zaW9uc1Nob3J0VGVzdC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE5IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqIAorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50ZXN0cy5saWI7CisKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuQXJyYXlFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5PYmplY3RFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzLlByb2NlZHVyZTE7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgTWF0aGlhcyBSaWVkZXIgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEFycmF5RXh0ZW5zaW9uc1Nob3J0VGVzdCB7CisgIHByaXZhdGUgc2hvcnRbXSBkYXRhOworICAKKyAgcHJpdmF0ZSBmaW5hbCBzaG9ydCBfMTAgPSAoKHNob3J0KSAxMCk7CisgIAorICBwcml2YXRlIGZpbmFsIHNob3J0IF8yMCA9ICgoc2hvcnQpIDIwKTsKKyAgCisgIHByaXZhdGUgZmluYWwgc2hvcnQgXzMwID0gKChzaG9ydCkgMzApOworICAKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgIHRoaXMuZGF0YSA9IHRoaXMuY3JlYXRlRGF0YSgpOworICB9CisgIAorICBwcml2YXRlIHNob3J0W10gY3JlYXRlRGF0YSgpIHsKKyAgICBmaW5hbCBzaG9ydFtdIGFycmF5ID0gbmV3IHNob3J0WzNdOworICAgIGFycmF5WzBdID0gdGhpcy5fMTA7CisgICAgYXJyYXlbMV0gPSB0aGlzLl8yMDsKKyAgICBhcnJheVsyXSA9IHRoaXMuXzMwOworICAgIHJldHVybiBhcnJheTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFNldEdldF9fc2hvcnQoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0aGlzLl8xMCwgdGhpcy5kYXRhWzBdKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRoaXMuXzIwLCB0aGlzLmRhdGFbMV0pOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGhpcy5fMzAsIHRoaXMuZGF0YVsyXSk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDbG9uZV9fc2hvcnQoKSB7CisgICAgZmluYWwgc2hvcnRbXSBjbG9uZWREYXRhID0gdGhpcy5kYXRhLmNsb25lKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0aGlzLl8xMCwgY2xvbmVkRGF0YVswXSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0aGlzLl8yMCwgY2xvbmVkRGF0YVsxXSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0aGlzLl8zMCwgY2xvbmVkRGF0YVsyXSk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RMZW5ndGhfX3Nob3J0KCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgdGhpcy5kYXRhLmxlbmd0aCk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZV9fc2hvcnQoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhPYmplY3RzLmhhc2hDb2RlKHRoaXMuZGF0YSksIHRoaXMuZGF0YS5oYXNoQ29kZSgpKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEVxdWFsc19fc2hvcnQoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUodGhpcy5kYXRhLmVxdWFscyh0aGlzLmRhdGEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhLmVxdWFscyh0aGlzLmNyZWF0ZURhdGEoKSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZSh0aGlzLmRhdGEuZXF1YWxzKG5ldyBPYmplY3RbM10pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodGhpcy5kYXRhLmVxdWFscyhudWxsKSk7CisgICAgc2hvcnRbXSBfY3JlYXRlRGF0YSA9IHRoaXMuY3JlYXRlRGF0YSgpOworICAgIGZpbmFsIFByb2NlZHVyZTE8c2hvcnRbXT4gX2Z1bmN0aW9uID0gKHNob3J0W10gaXQpIC0+IHsKKyAgICAgIGl0WzFdID0gKChzaG9ydCkgMCk7CisgICAgfTsKKyAgICBmaW5hbCBzaG9ydFtdIG5ld0RhdGEgPSBPYmplY3RFeHRlbnNpb25zLjxzaG9ydFtdPm9wZXJhdG9yX2RvdWJsZUFycm93KF9jcmVhdGVEYXRhLCBfZnVuY3Rpb24pOworICAgIEFzc2VydC5hc3NlcnRGYWxzZSh0aGlzLmRhdGEuZXF1YWxzKG5ld0RhdGEpKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zX19zaG9ydCgpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCAoKHNob3J0KSAxMCkpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCAoKHNob3J0KSAyMCkpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcnJheUV4dGVuc2lvbnMuY29udGFpbnModGhpcy5kYXRhLCAoKHNob3J0KSAzMCkpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQXJyYXlFeHRlbnNpb25zLmNvbnRhaW5zKHRoaXMuZGF0YSwgKChzaG9ydCkgNDApKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zU2hvcnRUZXN0Lnh0ZW5kIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9BcnJheUV4dGVuc2lvbnNTaG9ydFRlc3QueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxNTM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQXJyYXlFeHRlbnNpb25zU2hvcnRUZXN0Lnh0ZW5kCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UudGVzdHMubGliCisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlCitpbXBvcnQgb3JnLmp1bml0LlRlc3QKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LioKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0cworCisvKioKKyAqIEBhdXRob3IgTWF0aGlhcyBSaWVkZXIgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKi8KK2NsYXNzIEFycmF5RXh0ZW5zaW9uc1Nob3J0VGVzdCB7CisKKwl2YXIgc2hvcnRbXSBkYXRhCisKKwl2YWwgc2hvcnQgXzEwID0gMTAgYXMgc2hvcnQKKwl2YWwgc2hvcnQgXzIwID0gMjAgYXMgc2hvcnQKKwl2YWwgc2hvcnQgXzMwID0gMzAgYXMgc2hvcnQKKworCUBCZWZvcmUKKwlkZWYgdm9pZCBpbml0KCkgeworCQlkYXRhID0gY3JlYXRlRGF0YSgpCisJfQorCisJcHJpdmF0ZSBkZWYgc2hvcnRbXSBjcmVhdGVEYXRhKCkgeworCQl2YWwgc2hvcnRbXSBhcnJheSA9IG5ld1Nob3J0QXJyYXlPZlNpemUoMykKKwkJYXJyYXkuc2V0KDAsIF8xMCkKKwkJYXJyYXkuc2V0KDEsIF8yMCkKKwkJYXJyYXkuc2V0KDIsIF8zMCkKKwkJcmV0dXJuIGFycmF5CisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0U2V0R2V0X19zaG9ydCgpIHsKKwkJYXNzZXJ0RXF1YWxzKF8xMCwgZGF0YS5nZXQoMCkpCisJCWFzc2VydEVxdWFscyhfMjAsIGRhdGEuZ2V0KDEpKQorCQlhc3NlcnRFcXVhbHMoXzMwLCBkYXRhLmdldCgyKSkKKwl9CisKKwlAVGVzdAorCWRlZiB2b2lkIHRlc3RDbG9uZV9fc2hvcnQoKSB7CisJCXZhbCBjbG9uZWREYXRhID0gZGF0YS5jbG9uZSgpOworCisJCWFzc2VydEVxdWFscyhfMTAsIGNsb25lZERhdGEuZ2V0KDApKQorCQlhc3NlcnRFcXVhbHMoXzIwLCBjbG9uZWREYXRhLmdldCgxKSkKKwkJYXNzZXJ0RXF1YWxzKF8zMCwgY2xvbmVkRGF0YS5nZXQoMikpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0TGVuZ3RoX19zaG9ydCgpIHsKKwkJYXNzZXJ0RXF1YWxzKDMsIGRhdGEubGVuZ3RoKQorCX0KKworCUBUZXN0CisJZGVmIHZvaWQgdGVzdEhhc2hDb2RlX19zaG9ydCgpIHsKKwkJYXNzZXJ0RXF1YWxzKE9iamVjdHMuaGFzaENvZGUoZGF0YSksIGRhdGEuaGFzaENvZGUpCisJfQorCisJQFRlc3QKKwlkZWYgdm9pZCB0ZXN0RXF1YWxzX19zaG9ydCgpIHsKKwkJYXNzZXJ0VHJ1ZShkYXRhLmVxdWFscyhkYXRhKSkKKworCQlhc3NlcnRGYWxzZShkYXRhLmVxdWFscyhjcmVhdGVEYXRhKCkpKQorCQlhc3NlcnRGYWxzZShkYXRhLmVxdWFscyhuZXdBcnJheU9mU2l6ZSgzKSkpCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKG51bGwpKQorCisJCXZhbCBuZXdEYXRhID0gY3JlYXRlRGF0YSgpID0+IFtpdC5zZXQoMSwgMCBhcyBzaG9ydCldCisJCWFzc2VydEZhbHNlKGRhdGEuZXF1YWxzKG5ld0RhdGEpKQorCX0KKworCUBUZXN0IAorCWRlZiB2b2lkIHRlc3RDb250YWluc19fc2hvcnQoKSB7CisJCWFzc2VydFRydWUoZGF0YS5jb250YWlucygxMCBhcyBzaG9ydCkpCisJCWFzc2VydFRydWUoZGF0YS5jb250YWlucygyMCBhcyBzaG9ydCkpCisJCWFzc2VydFRydWUoZGF0YS5jb250YWlucygzMCBhcyBzaG9ydCkpCisJCQorCQlhc3NlcnRGYWxzZShkYXRhLmNvbnRhaW5zKDQwIGFzIHNob3J0KSkKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQmFzZUl0ZXJhYmxlc0l0ZXJhdG9yc1Rlc3QuamF2YSBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvQmFzZUl0ZXJhYmxlc0l0ZXJhdG9yc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQxOGUwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9CYXNlSXRlcmFibGVzSXRlcmF0b3JzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExIGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnRlc3RzLmxpYjsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlczsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5PcmRlcmluZzsKKworLyoqCisgKiBAYXV0aG9yIFNlYmFzdGlhbiBaYXJuZWtvdyAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VJdGVyYWJsZXNJdGVyYXRvcnNUZXN0PEl0ZXJhYmxlT3JJdGVyYXRvcj4gZXh0ZW5kcyBBc3NlcnQgeworCisJcHJvdGVjdGVkIEludGVnZXIgZmlyc3QgPSBJbnRlZ2VyLnZhbHVlT2YoMSk7CisJcHJvdGVjdGVkIEludGVnZXIgc2Vjb25kID0gSW50ZWdlci52YWx1ZU9mKDIpOworCXByb3RlY3RlZCBJbnRlZ2VyIHRoaXJkID0gSW50ZWdlci52YWx1ZU9mKDMpOworCXByb3RlY3RlZCBJbnRlZ2VyIGZvcnRoID0gSW50ZWdlci52YWx1ZU9mKDQpOworCXByb3RlY3RlZCBJbnRlZ2VyIGZpZnRoID0gSW50ZWdlci52YWx1ZU9mKDUpOworCQorCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYWJsZU9ySXRlcmF0b3JbXSB0ZXN0RGF0YShJbnRlZ2VyLi4uIGVsZW1lbnRzKTsKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmFibGVPckl0ZXJhdG9yW10gbnVsbGFibGVUZXN0RGF0YShJbnRlZ2VyLi4uIGVsZW1lbnRzKTsKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmFibGVPckl0ZXJhdG9yIGR1bW15KCk7CisJcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXMoSXRlcmFibGVPckl0ZXJhdG9yIGlucHV0LCBJbnRlZ2VyLi4uIGVsZW1lbnRzKTsKKworCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYWJsZU9ySXRlcmF0b3Igb3BlcmF0b3JfcGx1cyhJdGVyYWJsZU9ySXRlcmF0b3IgZmlyc3QsIEl0ZXJhYmxlT3JJdGVyYXRvciBzZWNvbmQpOworCXByb3RlY3RlZCBib29sZWFuIGNhbkl0ZXJhdGVUd2ljZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RPcGVyYXRvclBsdXNfU2FtZSgpIHsKKwkJSXRlcmFibGVPckl0ZXJhdG9yW10gZGF0YSA9IHRlc3REYXRhKGZpcnN0LCBzZWNvbmQpOworCQlmb3IoaW50IGkgPSAwO2kgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoY2FuSXRlcmF0ZVR3aWNlKCkpCisJCQkJYXNzZXJ0VHJ1ZShpcyhvcGVyYXRvcl9wbHVzKGRhdGFbaV0sIGRhdGFbaV0pLCBmaXJzdCwgc2Vjb25kLCBmaXJzdCwgc2Vjb25kKSk7CisJCQllbHNlCisJCQkJYXNzZXJ0VHJ1ZShpcyhvcGVyYXRvcl9wbHVzKGRhdGFbaV0sIGRhdGFbaV0pLCBmaXJzdCwgc2Vjb25kKSk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE9wZXJhdG9yUGx1cygpIHsKKwkJSXRlcmFibGVPckl0ZXJhdG9yW10gZmlyc3REYXRhID0gdGVzdERhdGEoZmlyc3QsIHNlY29uZCk7CisJCUl0ZXJhYmxlT3JJdGVyYXRvcltdIHNlY29uZERhdGEgPSB0ZXN0RGF0YSh0aGlyZCwgZm9ydGgpOworCQlmb3IoaW50IGkgPSAwO2kgPCBmaXJzdERhdGEubGVuZ3RoOyBpKyspIHsKKwkJCWFzc2VydFRydWUoaXMob3BlcmF0b3JfcGx1cyhmaXJzdERhdGFbaV0sIHNlY29uZERhdGFbaV0pLCBmaXJzdCwgc2Vjb25kLCB0aGlyZCwgZm9ydGgpKTsKKwkJfQorCX0KKwkKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0T3BlcmF0b3JQbHVzX05QRV9sZWZ0KCkgeworCQl0cnkgeworCQkJb3BlcmF0b3JfcGx1cyhudWxsLCBkdW1teSgpKTsKKwkJCWZhaWwoImV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIik7CisJCX0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisJCQkvLyBleHBlY3RlZAorCQl9CisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RPcGVyYXRvclBsdXNfTlBFX3JpZ2h0KCkgeworCQl0cnkgeworCQkJb3BlcmF0b3JfcGx1cyhkdW1teSgpLCBudWxsKTsKKwkJCWZhaWwoImV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIik7CisJCX0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisJCQkvLyBleHBlY3RlZAorCQl9CisJfQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBJbnRlZ2VyIGZpbmRGaXJzdChJdGVyYWJsZU9ySXRlcmF0b3IgaW5wdXQsIEZ1bmN0aW9ucy5GdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4gZmlsdGVyKTsKKwkKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RmluZEZpcnN0X2VtcHR5KCkgeworCQlGdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4gZmlsdGVyID0gbmV3IEZ1bmN0aW9ucy5GdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBCb29sZWFuIGFwcGx5KEludGVnZXIgcCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9OworCQlmb3IoSXRlcmFibGVPckl0ZXJhdG9yIHRlc3RNZTogdGVzdERhdGEoKSkgeworCQkJSW50ZWdlciBsYXN0ID0gZmluZEZpcnN0KHRlc3RNZSwgZmlsdGVyKTsKKwkJCWFzc2VydE51bGwoImVtcHR5IGlucHV0IHlpZWxkcyBudWxsIiwgbGFzdCk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEZpbmRGaXJzdF9ub01hdGNoKCkgeworCQlGdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4gZmlsdGVyID0gbmV3IEZ1bmN0aW9ucy5GdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBCb29sZWFuIGFwcGx5KEludGVnZXIgcCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfTsKKwkJZm9yKEl0ZXJhYmxlT3JJdGVyYXRvciB0ZXN0TWU6IHRlc3REYXRhKGZpcnN0LCBzZWNvbmQsIHRoaXJkKSkgeworCQkJSW50ZWdlciBsYXN0ID0gZmluZEZpcnN0KHRlc3RNZSwgZmlsdGVyKTsKKwkJCWFzc2VydE51bGwoInVubWF0Y2hlZCBpbnB1dCB5aWVsZHMgbnVsbCIsIGxhc3QpOworCQl9CisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RGaW5kRmlyc3RfYWxsTWF0Y2hlcygpIHsKKwkJRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+IGZpbHRlciA9IG5ldyBGdW5jdGlvbnMuRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQm9vbGVhbiBhcHBseShJbnRlZ2VyIHApIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfTsKKwkJZm9yKEl0ZXJhYmxlT3JJdGVyYXRvciB0ZXN0TWU6IHRlc3REYXRhKGZpcnN0LCBzZWNvbmQsIHRoaXJkKSkgeworCQkJSW50ZWdlciBsYXN0ID0gZmluZEZpcnN0KHRlc3RNZSwgZmlsdGVyKTsKKwkJCWFzc2VydEVxdWFscyhmaXJzdCwgbGFzdCk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEZpbmRGaXJzdF9vbmVNYXRjaCgpIHsKKwkJRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+IGZpbHRlciA9IG5ldyBGdW5jdGlvbnMuRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQm9vbGVhbiBhcHBseShJbnRlZ2VyIHApIHsKKwkJCQlyZXR1cm4gc2Vjb25kLmVxdWFscyhwKTsKKwkJCX0KKwkJfTsKKwkJZm9yKEl0ZXJhYmxlT3JJdGVyYXRvciB0ZXN0TWU6IHRlc3REYXRhKGZpcnN0LCBzZWNvbmQsIHRoaXJkKSkgeworCQkJSW50ZWdlciBsYXN0ID0gZmluZEZpcnN0KHRlc3RNZSwgZmlsdGVyKTsKKwkJCWFzc2VydEVxdWFscyhzZWNvbmQsIGxhc3QpOworCQl9CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEZpbmRGaXJzdF9leGNlcHRpb25JbkZpbHRlcigpIHsKKwkJZmluYWwgUnVudGltZUV4Y2VwdGlvbiBleHBlY3RlZEV4Y2VwdGlvbiA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCUZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPiBmaWx0ZXIgPSBuZXcgRnVuY3Rpb25zLkZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEJvb2xlYW4gYXBwbHkoSW50ZWdlciBwKSB7CisJCQkJdGhyb3cgZXhwZWN0ZWRFeGNlcHRpb247CisJCQl9CisJCX07CisJCWZvcihJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lOiB0ZXN0RGF0YShmaXJzdCwgc2Vjb25kLCB0aGlyZCkpIHsKKwkJCXRyeSB7CisJCQkJZmluZEZpcnN0KHRlc3RNZSwgZmlsdGVyKTsKKwkJCQlmYWlsKCJleHBlY3RlZCBleGNlcHRpb24iKTsKKwkJCX0gY2F0Y2goUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQkJYXNzZXJ0U2FtZShleHBlY3RlZEV4Y2VwdGlvbiwgZSk7CisJCQl9CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEZpbmRGaXJzdF9leGNlcHRpb25JbkZpbHRlcl9lbXB0eUlucHV0KCkgeworCQlmaW5hbCBSdW50aW1lRXhjZXB0aW9uIGV4cGVjdGVkRXhjZXB0aW9uID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+IGZpbHRlciA9IG5ldyBGdW5jdGlvbnMuRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQm9vbGVhbiBhcHBseShJbnRlZ2VyIHApIHsKKwkJCQl0aHJvdyBleHBlY3RlZEV4Y2VwdGlvbjsKKwkJCX0KKwkJfTsKKwkJZm9yKEl0ZXJhYmxlT3JJdGVyYXRvciB0ZXN0TWU6IHRlc3REYXRhKCkpIHsKKwkJCWFzc2VydE51bGwoZmluZEZpcnN0KHRlc3RNZSwgZmlsdGVyKSk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEZpbmRGaXJzdF9OUEVfbm9GaWx0ZXIoKSB7CisJCWZvcihJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lOiB0ZXN0RGF0YSgpKSB7CisJCQl0cnkgeworCQkJCWZpbmRGaXJzdCh0ZXN0TWUsIG51bGwpOworCQkJCWZhaWwoIkV4cGVjdGVkIE5QRSIpOworCQkJfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKwkJCQkvLyBleHBlY3RlZAorCQkJfQorCQl9CisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RGaW5kRmlyc3RfTlBFX25vSW5wdXQoKSB7CisJCXRyeSB7CisJCQlmaW5kTGFzdChudWxsLCBuZXcgRnVuY3Rpb25zLkZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPigpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgQm9vbGVhbiBhcHBseShJbnRlZ2VyIHApIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfSk7CisJCQlmYWlsKCJFeHBlY3RlZCBOUEUiKTsKKwkJfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKwkJCS8vIGV4cGVjdGVkCisJCX0KKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IEludGVnZXIgZmluZExhc3QoSXRlcmFibGVPckl0ZXJhdG9yIGlucHV0LCBGdW5jdGlvbnMuRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+IGZpbHRlcik7CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEZpbmRMYXN0X2VtcHR5KCkgeworCQlGdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4gZmlsdGVyID0gbmV3IEZ1bmN0aW9ucy5GdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBCb29sZWFuIGFwcGx5KEludGVnZXIgcCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9OworCQlmb3IoSXRlcmFibGVPckl0ZXJhdG9yIHRlc3RNZTogdGVzdERhdGEoKSkgeworCQkJSW50ZWdlciBsYXN0ID0gZmluZExhc3QodGVzdE1lLCBmaWx0ZXIpOworCQkJYXNzZXJ0TnVsbCgiZW1wdHkgaW5wdXQgeWllbGRzIG51bGwiLCBsYXN0KTsKKwkJfQorCX0KKwkKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RmluZExhc3Rfbm9NYXRjaCgpIHsKKwkJRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+IGZpbHRlciA9IG5ldyBGdW5jdGlvbnMuRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQm9vbGVhbiBhcHBseShJbnRlZ2VyIHApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX07CisJCWZvcihJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lOiB0ZXN0RGF0YShmaXJzdCwgc2Vjb25kLCB0aGlyZCkpIHsKKwkJCUludGVnZXIgbGFzdCA9IGZpbmRMYXN0KHRlc3RNZSwgZmlsdGVyKTsKKwkJCWFzc2VydE51bGwoInVubWF0Y2hlZCBpbnB1dCB5aWVsZHMgbnVsbCIsIGxhc3QpOworCQl9CisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RGaW5kTGFzdF9hbGxNYXRjaGVzKCkgeworCQlGdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4gZmlsdGVyID0gbmV3IEZ1bmN0aW9ucy5GdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBCb29sZWFuIGFwcGx5KEludGVnZXIgcCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9OworCQlmb3IoSXRlcmFibGVPckl0ZXJhdG9yIHRlc3RNZTogdGVzdERhdGEoZmlyc3QsIHNlY29uZCwgdGhpcmQpKSB7CisJCQlJbnRlZ2VyIGxhc3QgPSBmaW5kTGFzdCh0ZXN0TWUsIGZpbHRlcik7CisJCQlhc3NlcnRFcXVhbHModGhpcmQsIGxhc3QpOworCQl9CisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RGaW5kTGFzdF9vbmVNYXRjaCgpIHsKKwkJRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+IGZpbHRlciA9IG5ldyBGdW5jdGlvbnMuRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQm9vbGVhbiBhcHBseShJbnRlZ2VyIHApIHsKKwkJCQlyZXR1cm4gc2Vjb25kLmVxdWFscyhwKTsKKwkJCX0KKwkJfTsKKwkJZm9yKEl0ZXJhYmxlT3JJdGVyYXRvciB0ZXN0TWU6IHRlc3REYXRhKGZpcnN0LCBzZWNvbmQsIHRoaXJkKSkgeworCQkJSW50ZWdlciBsYXN0ID0gZmluZExhc3QodGVzdE1lLCBmaWx0ZXIpOworCQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgbGFzdCk7CisJCX0KKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RmluZExhc3RfZXhjZXB0aW9uSW5GaWx0ZXIoKSB7CisJCWZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gZXhwZWN0ZWRFeGNlcHRpb24gPSBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQlGdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4gZmlsdGVyID0gbmV3IEZ1bmN0aW9ucy5GdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBCb29sZWFuIGFwcGx5KEludGVnZXIgcCkgeworCQkJCXRocm93IGV4cGVjdGVkRXhjZXB0aW9uOworCQkJfQorCQl9OworCQlmb3IoSXRlcmFibGVPckl0ZXJhdG9yIHRlc3RNZTogdGVzdERhdGEoZmlyc3QsIHNlY29uZCwgdGhpcmQpKSB7CisJCQl0cnkgeworCQkJCWZpbmRMYXN0KHRlc3RNZSwgZmlsdGVyKTsKKwkJCQlmYWlsKCJleHBlY3RlZCBleGNlcHRpb24iKTsKKwkJCX0gY2F0Y2goUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQkJYXNzZXJ0U2FtZShleHBlY3RlZEV4Y2VwdGlvbiwgZSk7CisJCQl9CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEZpbmRMYXN0X2V4Y2VwdGlvbkluRmlsdGVyX2VtcHR5SW5wdXQoKSB7CisJCWZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gZXhwZWN0ZWRFeGNlcHRpb24gPSBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQlGdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4gZmlsdGVyID0gbmV3IEZ1bmN0aW9ucy5GdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBCb29sZWFuIGFwcGx5KEludGVnZXIgcCkgeworCQkJCXRocm93IGV4cGVjdGVkRXhjZXB0aW9uOworCQkJfQorCQl9OworCQlmb3IoSXRlcmFibGVPckl0ZXJhdG9yIHRlc3RNZTogdGVzdERhdGEoKSkgeworCQkJSW50ZWdlciBsYXN0ID0gZmluZExhc3QodGVzdE1lLCBmaWx0ZXIpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGxhc3QpOworCQl9CisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RGaW5kTGFzdF9OUEVfbm9GaWx0ZXIoKSB7CisJCWZvcihJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lOiB0ZXN0RGF0YSgpKSB7CisJCQl0cnkgeworCQkJCWZpbmRMYXN0KHRlc3RNZSwgbnVsbCk7CisJCQkJZmFpbCgiRXhwZWN0ZWQgTlBFIik7CisJCQl9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworCQkJCS8vIGV4cGVjdGVkCisJCQl9CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEZpbmRMYXN0X05QRV9ub0lucHV0KCkgeworCQl0cnkgeworCQkJZmluZExhc3QobnVsbCwgbmV3IEZ1bmN0aW9ucy5GdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4oKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIEJvb2xlYW4gYXBwbHkoSW50ZWdlciBwKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0pOworCQkJZmFpbCgiRXhwZWN0ZWQgTlBFIik7CisJCX0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisJCQkvLyBleHBlY3RlZAorCQl9CisJfQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBJbnRlZ2VyIGxhc3QoSXRlcmFibGVPckl0ZXJhdG9yIGlucHV0KTsKKwkKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGFzdF9lbXB0eSgpIHsKKwkJZm9yKEl0ZXJhYmxlT3JJdGVyYXRvciB0ZXN0TWU6IHRlc3REYXRhKCkpIHsKKwkJCUludGVnZXIgbGFzdCA9IGxhc3QodGVzdE1lKTsKKwkJCWFzc2VydE51bGwoImVtcHR5IGlucHV0IHlpZWxkcyBudWxsIiwgbGFzdCk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExhc3Rfb25lRW50cnkoKSB7CisJCWZvcihJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lOiB0ZXN0RGF0YShmaXJzdCkpIHsKKwkJCUludGVnZXIgbGFzdCA9IGxhc3QodGVzdE1lKTsKKwkJCWFzc2VydEVxdWFscyhmaXJzdCwgbGFzdCk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExhc3RfZW50cnlJc051bGwoKSB7CisJCWZvcihJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lOiBudWxsYWJsZVRlc3REYXRhKChJbnRlZ2VyKW51bGwpKSB7CisJCQlJbnRlZ2VyIGxhc3QgPSBsYXN0KHRlc3RNZSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgbGFzdCk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExhc3RfbW9yZUVudHJpZXMoKSB7CisJCWZvcihJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lOiB0ZXN0RGF0YShmaXJzdCwgc2Vjb25kLCB0aGlyZCkpIHsKKwkJCUludGVnZXIgbGFzdCA9IGxhc3QodGVzdE1lKTsKKwkJCWFzc2VydEVxdWFscyh0aGlyZCwgbGFzdCk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExhc3RfTlBFKCkgeworCQl0cnkgeworCQkJbGFzdChudWxsKTsKKwkJCWZhaWwoImV4cGVjZWQgTlBFIik7CisJCX0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisJCQkvLyBleHBlY3RlZAorCQl9CisJfQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBJbnRlZ2VyIGhlYWQoSXRlcmFibGVPckl0ZXJhdG9yIGlucHV0KTsKKwkKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SGVhZF9lbXB0eSgpIHsKKwkJZm9yKEl0ZXJhYmxlT3JJdGVyYXRvciB0ZXN0TWU6IHRlc3REYXRhKCkpIHsKKwkJCUludGVnZXIgaGVhZCA9IGhlYWQodGVzdE1lKTsKKwkJCWFzc2VydE51bGwoImVtcHR5IGlucHV0IHlpZWxkcyBudWxsIiwgaGVhZCk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEhlYWRfb25lRW50cnkoKSB7CisJCWZvcihJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lOiB0ZXN0RGF0YShmaXJzdCkpIHsKKwkJCUludGVnZXIgaGVhZCA9IGhlYWQodGVzdE1lKTsKKwkJCWFzc2VydEVxdWFscyhmaXJzdCwgaGVhZCk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEhlYWRfZW50cnlJc051bGwoKSB7CisJCWZvcihJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lOiBudWxsYWJsZVRlc3REYXRhKChJbnRlZ2VyKW51bGwpKSB7CisJCQlJbnRlZ2VyIGhlYWQgPSBoZWFkKHRlc3RNZSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgaGVhZCk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEhlYWRfbW9yZUVudHJpZXMoKSB7CisJCWZvcihJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lOiB0ZXN0RGF0YShmaXJzdCwgc2Vjb25kLCB0aGlyZCkpIHsKKwkJCUludGVnZXIgaGVhZCA9IGhlYWQodGVzdE1lKTsKKwkJCWFzc2VydEVxdWFscyhmaXJzdCwgaGVhZCk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEhlYWRfTlBFKCkgeworCQl0cnkgeworCQkJaGVhZChudWxsKTsKKwkJCWZhaWwoImV4cGVjZWQgTlBFIik7CisJCX0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisJCQkvLyBleHBlY3RlZAorCQl9CisJfQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZvckVhY2goSXRlcmFibGVPckl0ZXJhdG9yIGlucHV0LCBQcm9jZWR1cmVzLlByb2NlZHVyZTI8SW50ZWdlciwgSW50ZWdlcj4gcHJvYyk7CisJCisJc3RhdGljIGNsYXNzIEZvckVhY2hMb29wQ291bnRlciBpbXBsZW1lbnRzIFByb2NlZHVyZXMuUHJvY2VkdXJlMjxJbnRlZ2VyLCBJbnRlZ2VyPiB7CisKKwkJcHJpdmF0ZSBpbnQgZXhwZWN0ZWRJbmRleCA9IDA7CisJCXByaXZhdGUgZmluYWwgSW50ZWdlcltdIHZhbHVlczsKKwkJCisJCUZvckVhY2hMb29wQ291bnRlcihJbnRlZ2VyLi4uIHZhbHVlcykgeworCQkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBhcHBseShJbnRlZ2VyIHZhbHVlLCBJbnRlZ2VyIGluZGV4KSB7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRJbmRleCwgaW5kZXguaW50VmFsdWUoKSk7CisJCQlhc3NlcnRFcXVhbHModmFsdWVzW2V4cGVjdGVkSW5kZXhdLCB2YWx1ZSk7CisJCQlleHBlY3RlZEluZGV4Kys7CisJCX0KKwkJCisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RGb3JFYWNoV2l0aEluZGV4X2VtcHR5KCkgeworCQlmb3IoSXRlcmFibGVPckl0ZXJhdG9yIHRlc3RNZTogdGVzdERhdGEoKSkgeworCQkJRm9yRWFjaExvb3BDb3VudGVyIGNvdW50ZXIgPSBuZXcgRm9yRWFjaExvb3BDb3VudGVyKCk7CisJCQlmb3JFYWNoKHRlc3RNZSwgY291bnRlcik7CisJCQlhc3NlcnRFcXVhbHMoMCwgY291bnRlci5leHBlY3RlZEluZGV4KTsKKwkJfQorCX0KKwkKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Rm9yRWFjaFdpdGhJbmRleF9lbXB0eV9ub1Byb2NlZHVyZSgpIHsKKwkJZm9yKEl0ZXJhYmxlT3JJdGVyYXRvciB0ZXN0TWU6IHRlc3REYXRhKCkpIHsKKwkJCXRyeSB7CisJCQkJZm9yRWFjaCh0ZXN0TWUsIG51bGwpOworCQkJCWZhaWwoImV4cGVjZWQgTlBFIik7CisJCQl9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBleHBlY3RlZAorCQkJfQorCQl9CisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RGb3JFYWNoV2l0aEluZGV4X29uZUVudHJ5KCkgeworCQlmb3IoSXRlcmFibGVPckl0ZXJhdG9yIHRlc3RNZTogdGVzdERhdGEoZmlyc3QpKSB7CisJCQlGb3JFYWNoTG9vcENvdW50ZXIgY291bnRlciA9IG5ldyBGb3JFYWNoTG9vcENvdW50ZXIoZmlyc3QpOworCQkJZm9yRWFjaCh0ZXN0TWUsIGNvdW50ZXIpOworCQkJYXNzZXJ0RXF1YWxzKDEsIGNvdW50ZXIuZXhwZWN0ZWRJbmRleCk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEZvckVhY2hXaXRoSW5kZXhfZW50cnlJc051bGwoKSB7CisJCWZvcihJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lOiBudWxsYWJsZVRlc3REYXRhKChJbnRlZ2VyKW51bGwpKSB7CisJCQlGb3JFYWNoTG9vcENvdW50ZXIgY291bnRlciA9IG5ldyBGb3JFYWNoTG9vcENvdW50ZXIoKEludGVnZXIpbnVsbCk7CisJCQlmb3JFYWNoKHRlc3RNZSwgY291bnRlcik7CisJCQlhc3NlcnRFcXVhbHMoMSwgY291bnRlci5leHBlY3RlZEluZGV4KTsKKwkJfQorCX0KKwkKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Rm9yRWFjaFdpdGhJbmRleF9tb3JlRW50cmllcygpIHsKKwkJZm9yKEl0ZXJhYmxlT3JJdGVyYXRvciB0ZXN0TWU6IHRlc3REYXRhKGZpcnN0LCBzZWNvbmQsIGZvcnRoKSkgeworCQkJRm9yRWFjaExvb3BDb3VudGVyIGNvdW50ZXIgPSBuZXcgRm9yRWFjaExvb3BDb3VudGVyKGZpcnN0LCBzZWNvbmQsIGZvcnRoKTsKKwkJCWZvckVhY2godGVzdE1lLCBjb3VudGVyKTsKKwkJCWFzc2VydEVxdWFscygzLCBjb3VudGVyLmV4cGVjdGVkSW5kZXgpOworCQl9CisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RGb3JFYWNoV2l0aEluZGV4X05QRSgpIHsKKwkJdHJ5IHsKKwkJCWZvckVhY2gobnVsbCwgbmV3IEZvckVhY2hMb29wQ291bnRlcigpKTsKKwkJCWZhaWwoImV4cGVjZWQgTlBFIik7CisJCX0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisJCQkvLyBleHBlY3RlZAorCQl9CisJfQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYWJsZU9ySXRlcmF0b3IgdGFrZVdoaWxlKEl0ZXJhYmxlT3JJdGVyYXRvciBpbnB1dCwgRnVuY3Rpb25zLkZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPiBmaWx0ZXIpOworCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYWJsZU9ySXRlcmF0b3IgZHJvcFdoaWxlKEl0ZXJhYmxlT3JJdGVyYXRvciBpbnB1dCwgRnVuY3Rpb25zLkZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPiBmaWx0ZXIpOworCXByb3RlY3RlZCBhYnN0cmFjdCBJbnRlZ2VyIG1pbihJdGVyYWJsZU9ySXRlcmF0b3IgaW5wdXQpOworCXByb3RlY3RlZCBhYnN0cmFjdCBJbnRlZ2VyIG1heChJdGVyYWJsZU9ySXRlcmF0b3IgaW5wdXQpOworCXByb3RlY3RlZCBhYnN0cmFjdCBJbnRlZ2VyIG1pbihJdGVyYWJsZU9ySXRlcmF0b3IgaW5wdXQsIENvbXBhcmF0b3I8PyBzdXBlciBJbnRlZ2VyPiBjb21wYXJhdG9yKTsKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgSW50ZWdlciBtYXgoSXRlcmFibGVPckl0ZXJhdG9yIGlucHV0LCBDb21wYXJhdG9yPD8gc3VwZXIgSW50ZWdlcj4gY29tcGFyYXRvcik7CisJcHJvdGVjdGVkIGFic3RyYWN0IEludGVnZXIgbWluQnkoSXRlcmFibGVPckl0ZXJhdG9yIGlucHV0LCBGdW5jdGlvbnMuRnVuY3Rpb24xPD8gc3VwZXIgSW50ZWdlciwgU3RyaW5nPiBjb21wYXJlQnkpOworCXByb3RlY3RlZCBhYnN0cmFjdCBJbnRlZ2VyIG1heEJ5KEl0ZXJhYmxlT3JJdGVyYXRvciBpbnB1dCwgRnVuY3Rpb25zLkZ1bmN0aW9uMTw/IHN1cGVyIEludGVnZXIsIFN0cmluZz4gY29tcGFyZUJ5KTsKKwkKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VGFrZVdoaWxlKCkgeworCQlmb3IgKEl0ZXJhYmxlT3JJdGVyYXRvciB0ZXN0TWUgOiB0ZXN0RGF0YShmaXJzdCwgc2Vjb25kLCB0aGlyZCwgZm9ydGgsIGZpZnRoKSkgeworCQkJSXRlcmFibGVPckl0ZXJhdG9yIHRha2VuID0gdGFrZVdoaWxlKHRlc3RNZSwgbmV3IEZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPigpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgQm9vbGVhbiBhcHBseShJbnRlZ2VyIHApIHsKKwkJCQkJcmV0dXJuIHAgPD0gMzsKKwkJCQl9CisJCQl9KTsKKwkJCWFzc2VydFRydWUoaXModGFrZW4sIGZpcnN0LCBzZWNvbmQsIHRoaXJkKSk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdERyb3BXaGlsZSgpIHsKKwkJZm9yIChJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lIDogdGVzdERhdGEoZmlyc3QsIHNlY29uZCwgdGhpcmQsIGZvcnRoLCBmaWZ0aCkpIHsKKwkJCUl0ZXJhYmxlT3JJdGVyYXRvciB0YWlsID0gZHJvcFdoaWxlKHRlc3RNZSwgbmV3IEZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPigpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgQm9vbGVhbiBhcHBseShJbnRlZ2VyIHApIHsKKwkJCQkJcmV0dXJuIHAgPD0gMzsKKwkJCQl9CisJCQl9KTsKKwkJCWFzc2VydFRydWUoaXModGFpbCwgZm9ydGgsIGZpZnRoKSk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE1pbkNvbXBhcmFibGUoKSB7CisJCWZvciAoSXRlcmFibGVPckl0ZXJhdG9yIHRlc3RNZSA6IHRlc3REYXRhKGZpcnN0LCBzZWNvbmQsIHRoaXJkLCBmb3J0aCwgZmlmdGgpKSB7CisJCQlJbnRlZ2VyIG1pbiA9IG1pbih0ZXN0TWUpOworCQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBtaW4pOworCQl9CisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNYXhDb21wYXJhYmxlKCkgeworCQlmb3IgKEl0ZXJhYmxlT3JJdGVyYXRvciB0ZXN0TWUgOiB0ZXN0RGF0YShmaXJzdCwgc2Vjb25kLCB0aGlyZCwgZm9ydGgsIGZpZnRoKSkgeworCQkJSW50ZWdlciBtYXggPSBtYXgodGVzdE1lKTsKKwkJCWFzc2VydEVxdWFscyhmaWZ0aCwgbWF4KTsKKwkJfQorCX0KKwkKKwlAVGVzdChleHBlY3RlZCA9IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uY2xhc3MpIAorCXB1YmxpYyB2b2lkIHRlc3RNaW5FbXB0eSgpIHsKKwkJZm9yIChJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lIDogdGVzdERhdGEoKSkgeworCQkJbWluKHRlc3RNZSk7CisJCX0KKwl9CisJCisJQFRlc3QoZXhwZWN0ZWQgPSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RNYXhFbXB0eSgpIHsKKwkJZm9yIChJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lIDogdGVzdERhdGEoKSkgeworCQkJbWF4KHRlc3RNZSk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE1pbkNvbXBhcmF0b3IoKSB7CisJCWZvciAoSXRlcmFibGVPckl0ZXJhdG9yIHRlc3RNZSA6IHRlc3REYXRhKGZpcnN0LCBzZWNvbmQsIHRoaXJkLCBmb3J0aCwgZmlmdGgpKSB7CisJCQlJbnRlZ2VyIG1pbiA9IG1pbih0ZXN0TWUsIE9yZGVyaW5nLm5hdHVyYWwoKS5yZXZlcnNlKCkpOworCQkJYXNzZXJ0RXF1YWxzKGZpZnRoLCBtaW4pOworCQl9CisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNYXhDb21wYXJhdG9yKCkgeworCQlmb3IgKEl0ZXJhYmxlT3JJdGVyYXRvciB0ZXN0TWUgOiB0ZXN0RGF0YShmaXJzdCwgc2Vjb25kLCB0aGlyZCwgZm9ydGgsIGZpZnRoKSkgeworCQkJSW50ZWdlciBtYXggPSBtYXgodGVzdE1lLCBPcmRlcmluZy5uYXR1cmFsKCkucmV2ZXJzZSgpKTsKKwkJCWFzc2VydEVxdWFscyhmaXJzdCwgbWF4KTsKKwkJfQorCX0KKwkKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TWluQnkoKSB7CisJCWZvciAoSXRlcmFibGVPckl0ZXJhdG9yIHRlc3RNZSA6IHRlc3REYXRhKGZpcnN0LCBzZWNvbmQsIHRoaXJkLCBmb3J0aCwgZmlmdGgpKSB7CisJCQlJbnRlZ2VyIG1pbiA9IG1pbkJ5KHRlc3RNZSwgbmV3IEZ1bmN0aW9uMTxJbnRlZ2VyLCBTdHJpbmc+KCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyBTdHJpbmcgYXBwbHkoSW50ZWdlciBwKSB7CisJCQkJCXJldHVybiBJbnRlZ2VyLnRvQmluYXJ5U3RyaW5nKHApOworCQkJCX0KKwkJCX0pOworCQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBtaW4pOworCQl9CisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNYXhCeSgpIHsKKwkJZm9yIChJdGVyYWJsZU9ySXRlcmF0b3IgdGVzdE1lIDogdGVzdERhdGEoZmlyc3QsIHNlY29uZCwgdGhpcmQsIGZvcnRoLCBmaWZ0aCkpIHsKKwkJCUludGVnZXIgbWF4ID0gbWF4QnkodGVzdE1lLCBuZXcgRnVuY3Rpb24xPEludGVnZXIsIFN0cmluZz4oKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIFN0cmluZyBhcHBseShJbnRlZ2VyIHApIHsKKwkJCQkJcmV0dXJuIEludGVnZXIudG9CaW5hcnlTdHJpbmcocCk7CisJCQkJfQorCQkJfSk7CisJCQlhc3NlcnRFcXVhbHModGhpcmQsIG1heCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0V4Y2x1c2l2ZVJhbmdlVGVzdC5qYXZhIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9FeGNsdXNpdmVSYW5nZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDVmYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9FeGNsdXNpdmVSYW5nZVRlc3QuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnRlc3RzLmxpYjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5FeGNsdXNpdmVSYW5nZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkl0ZXJhYmxlRXh0ZW5zaW9ucy5qb2luOworCisvKioKKyAqIEBhdXRob3IgSmFuIEtvZWhubGVpbgorICovCitwdWJsaWMgY2xhc3MgRXhjbHVzaXZlUmFuZ2VUZXN0IHsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENvbnRlbnQoKSB7CisJCWFzc2VydEVxdWFscygiMSwyLDMsNCIsIGpvaW4obmV3IEV4Y2x1c2l2ZVJhbmdlKDEsIDUsIHRydWUpLCAiLCIpKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLCBqb2luKG5ldyBFeGNsdXNpdmVSYW5nZSgwLCAwLCB0cnVlKSwgIiwiKSk7CisJCWFzc2VydEVxdWFscygiIiwgam9pbihuZXcgRXhjbHVzaXZlUmFuZ2UoMCwgLTEsIHRydWUpLCAiLCIpKTsKKwkJYXNzZXJ0RXF1YWxzKCItMSIsIGpvaW4obmV3IEV4Y2x1c2l2ZVJhbmdlKC0xLCAwLCB0cnVlKSwgIiwiKSk7CisJCWFzc2VydEVxdWFscygiNCwzLDIsMSIsIGpvaW4obmV3IEV4Y2x1c2l2ZVJhbmdlKDUsIDEsIGZhbHNlKSwgIiwiKSk7CisJCWFzc2VydEVxdWFscygiIiwgam9pbihuZXcgRXhjbHVzaXZlUmFuZ2UoMCwgMCwgZmFsc2UpLCAiLCIpKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLCBqb2luKG5ldyBFeGNsdXNpdmVSYW5nZSgtMSwgMCwgZmFsc2UpLCAiLCIpKTsKKwkJYXNzZXJ0RXF1YWxzKCItMSIsIGpvaW4obmV3IEV4Y2x1c2l2ZVJhbmdlKDAsIC0xLCBmYWxzZSksICIsIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNpemUoKSB7CisJCWFzc2VydEVxdWFscyg0LCBuZXcgRXhjbHVzaXZlUmFuZ2UoMSwgNSwgdHJ1ZSkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG5ldyBFeGNsdXNpdmVSYW5nZSgwLCAwLCB0cnVlKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgbmV3IEV4Y2x1c2l2ZVJhbmdlKDAsIC0xLCB0cnVlKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgbmV3IEV4Y2x1c2l2ZVJhbmdlKC0xLCAwLCB0cnVlKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNCwgbmV3IEV4Y2x1c2l2ZVJhbmdlKDUsIDEsIGZhbHNlKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgbmV3IEV4Y2x1c2l2ZVJhbmdlKDAsIDAsIGZhbHNlKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgbmV3IEV4Y2x1c2l2ZVJhbmdlKC0xLCAwLCBmYWxzZSkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG5ldyBFeGNsdXNpdmVSYW5nZSgwLCAtMSwgZmFsc2UpLnNpemUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKKwkJYXNzZXJ0RmFsc2UobmV3IEV4Y2x1c2l2ZVJhbmdlKDEsIDUsIHRydWUpLmlzRW1wdHkoKSk7CisJCWFzc2VydFRydWUobmV3IEV4Y2x1c2l2ZVJhbmdlKDAsIDAsIHRydWUpLmlzRW1wdHkoKSk7CisJCWFzc2VydFRydWUobmV3IEV4Y2x1c2l2ZVJhbmdlKDAsIC0xLCB0cnVlKS5pc0VtcHR5KCkpOworCQlhc3NlcnRGYWxzZShuZXcgRXhjbHVzaXZlUmFuZ2UoLTEsIDAsIHRydWUpLmlzRW1wdHkoKSk7CisJCWFzc2VydEZhbHNlKG5ldyBFeGNsdXNpdmVSYW5nZSg1LCAxLCBmYWxzZSkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0VHJ1ZShuZXcgRXhjbHVzaXZlUmFuZ2UoMCwgMCwgZmFsc2UpLmlzRW1wdHkoKSk7CisJCWFzc2VydFRydWUobmV3IEV4Y2x1c2l2ZVJhbmdlKC0xLCAwLCBmYWxzZSkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RmFsc2UobmV3IEV4Y2x1c2l2ZVJhbmdlKDAsIC0xLCBmYWxzZSkuaXNFbXB0eSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKKwkJYXNzZXJ0RmFsc2UobmV3IEV4Y2x1c2l2ZVJhbmdlKDEsIDUsIHRydWUpLmNvbnRhaW5zKDApKTsKKwkJYXNzZXJ0VHJ1ZShuZXcgRXhjbHVzaXZlUmFuZ2UoMSwgNSwgdHJ1ZSkuY29udGFpbnMoMSkpOworCQlhc3NlcnRUcnVlKG5ldyBFeGNsdXNpdmVSYW5nZSgxLCA1LCB0cnVlKS5jb250YWlucygyKSk7CisJCWFzc2VydFRydWUobmV3IEV4Y2x1c2l2ZVJhbmdlKDEsIDUsIHRydWUpLmNvbnRhaW5zKDMpKTsKKwkJYXNzZXJ0VHJ1ZShuZXcgRXhjbHVzaXZlUmFuZ2UoMSwgNSwgdHJ1ZSkuY29udGFpbnMoNCkpOworCQlhc3NlcnRGYWxzZShuZXcgRXhjbHVzaXZlUmFuZ2UoMSwgNSwgdHJ1ZSkuY29udGFpbnMoNSkpOworCisJCWFzc2VydEZhbHNlKG5ldyBFeGNsdXNpdmVSYW5nZSgwLCAwLCB0cnVlKS5jb250YWlucygwKSk7CisKKwkJYXNzZXJ0RmFsc2UobmV3IEV4Y2x1c2l2ZVJhbmdlKDAsIC0xLCB0cnVlKS5jb250YWlucygwKSk7CisJCWFzc2VydEZhbHNlKG5ldyBFeGNsdXNpdmVSYW5nZSgwLCAtMSwgdHJ1ZSkuY29udGFpbnMoLTEpKTsKKworCQlhc3NlcnRGYWxzZShuZXcgRXhjbHVzaXZlUmFuZ2UoLTEsIDAsIHRydWUpLmNvbnRhaW5zKC0yKSk7CisJCWFzc2VydFRydWUobmV3IEV4Y2x1c2l2ZVJhbmdlKC0xLCAwLCB0cnVlKS5jb250YWlucygtMSkpOworCQlhc3NlcnRGYWxzZShuZXcgRXhjbHVzaXZlUmFuZ2UoLTEsIDAsIHRydWUpLmNvbnRhaW5zKC0wKSk7CisKKwkJYXNzZXJ0RmFsc2UobmV3IEV4Y2x1c2l2ZVJhbmdlKDUsIDEsIGZhbHNlKS5jb250YWlucygwKSk7CisJCWFzc2VydFRydWUobmV3IEV4Y2x1c2l2ZVJhbmdlKDUsIDEsIGZhbHNlKS5jb250YWlucygxKSk7CisJCWFzc2VydFRydWUobmV3IEV4Y2x1c2l2ZVJhbmdlKDUsIDEsIGZhbHNlKS5jb250YWlucygyKSk7CisJCWFzc2VydFRydWUobmV3IEV4Y2x1c2l2ZVJhbmdlKDUsIDEsIGZhbHNlKS5jb250YWlucygzKSk7CisJCWFzc2VydFRydWUobmV3IEV4Y2x1c2l2ZVJhbmdlKDUsIDEsIGZhbHNlKS5jb250YWlucyg0KSk7CisJCWFzc2VydEZhbHNlKG5ldyBFeGNsdXNpdmVSYW5nZSg1LCAxLCBmYWxzZSkuY29udGFpbnMoNSkpOworCisJCWFzc2VydEZhbHNlKG5ldyBFeGNsdXNpdmVSYW5nZSgwLCAwLCBmYWxzZSkuY29udGFpbnMoMCkpOworCisJCWFzc2VydEZhbHNlKG5ldyBFeGNsdXNpdmVSYW5nZSgtMSwgMCwgZmFsc2UpLmNvbnRhaW5zKDApKTsKKwkJYXNzZXJ0RmFsc2UobmV3IEV4Y2x1c2l2ZVJhbmdlKC0xLCAwLCBmYWxzZSkuY29udGFpbnMoLTEpKTsKKworCQlhc3NlcnRGYWxzZShuZXcgRXhjbHVzaXZlUmFuZ2UoMCwgLTEsIGZhbHNlKS5jb250YWlucygtMikpOworCQlhc3NlcnRUcnVlKG5ldyBFeGNsdXNpdmVSYW5nZSgwLCAtMSwgZmFsc2UpLmNvbnRhaW5zKC0xKSk7CisJCWFzc2VydEZhbHNlKG5ldyBFeGNsdXNpdmVSYW5nZSgwLCAtMSwgZmFsc2UpLmNvbnRhaW5zKC0wKSk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9GdW5jdGlvbkNvbXBvc2l0aW9uVGVzdC5qYXZhIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9GdW5jdGlvbkNvbXBvc2l0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTMwNzEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0Z1bmN0aW9uQ29tcG9zaXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UudGVzdHMubGliOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25FeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5GdW5jdGlvbnMuRnVuY3Rpb24xOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5GdW5jdGlvbnMuRnVuY3Rpb24yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzLlByb2NlZHVyZTE7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIGVmZnRpbmdlIC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBGdW5jdGlvbkNvbXBvc2l0aW9uVGVzdCB7CisJCisJcHJpdmF0ZSBGdW5jdGlvbjI8SW50ZWdlciwgSW50ZWdlciwgSW50ZWdlcj4gYmluYXJ5RnVuID0gKEludGVnZXIgZSwgSW50ZWdlciBlMikgLT4geworCQlyZXR1cm4gZSAqIGUyOworCX07CisKKwlwcml2YXRlIEZ1bmN0aW9uMTxJbnRlZ2VyLCBJbnRlZ2VyPiB0aW1lczIgPSAoSW50ZWdlciBlKSAtPiB7CisJCXJldHVybiBlICogMjsKKwl9OworCisJcHJpdmF0ZSBGdW5jdGlvbjE8SW50ZWdlciwgSW50ZWdlcj4gc3F1YXJlZCA9IChJbnRlZ2VyIGUpIC0+IHsKKwkJcmV0dXJuIGUgKiBlOworCX07CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDb21wb3NlKCkgeworCQlpbnQgYWN0dWFsID0gRnVuY3Rpb25FeHRlbnNpb25zLmNvbXBvc2UodGltZXMyLCBzcXVhcmVkKS5hcHBseSg0KTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygzMiwgYWN0dWFsKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBbmRUaGVuKCkgeworCQlpbnQgYWN0dWFsID0gRnVuY3Rpb25FeHRlbnNpb25zLmFuZFRoZW4odGltZXMyLCBzcXVhcmVkKS5hcHBseSg0KTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyg2NCwgYWN0dWFsKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBbmRUaGVuMigpIHsKKwkJaW50IGFjdHVhbCA9IEZ1bmN0aW9uRXh0ZW5zaW9ucy5hbmRUaGVuKGJpbmFyeUZ1biwgc3F1YXJlZCkuYXBwbHkoMiwgMSk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoNCwgYWN0dWFsKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBbmRUaGVuUHJvY2VkdXJlKCkgeworCQlQcm9jZWR1cmUxPEF0b21pY0ludGVnZXI+IGluY3JlbWVudGVyID0gKEF0b21pY0ludGVnZXIgaXQpIC0+IHsKKwkJCWl0LmluY3JlbWVudEFuZEdldCgpOworCQl9OworCQkKKwkJUHJvY2VkdXJlMTxBdG9taWNJbnRlZ2VyPiBmdW5jdGlvbiA9IChBdG9taWNJbnRlZ2VyIGl0KSAtPiB7CisJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIGl0LmluY3JlbWVudEFuZEdldCgpKTsKKwkJfTsKKwkJCisJCUF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisJCUZ1bmN0aW9uRXh0ZW5zaW9ucy5hbmRUaGVuKGluY3JlbWVudGVyLCBmdW5jdGlvbikuYXBwbHkoY291bnRlcik7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvSW50ZWdlckV4dGVuc2lvbnNUZXN0LmphdmEgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0ludGVnZXJFeHRlbnNpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Mjk1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0ludGVnZXJFeHRlbnNpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UudGVzdHMubGliOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlZ2VyRXh0ZW5zaW9uc1Rlc3QgeworCQorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE9wZXJhdG9yX3VwVG9fMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSXRlcmF0b3I8SW50ZWdlcj4gaXRlcmF0b3IgPSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuSW50ZWdlckV4dGVuc2lvbnMub3BlcmF0b3JfdXBUbygwLCAwKS5pdGVyYXRvcigpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGl0ZXJhdG9yLm5leHQoKS5pbnRWYWx1ZSgpKTsKKwkJQXNzZXJ0LmFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7CisJfQorCQorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE9wZXJhdG9yX3VwVG9fMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSXRlcmF0b3I8SW50ZWdlcj4gaXRlcmF0b3IgPSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuSW50ZWdlckV4dGVuc2lvbnMub3BlcmF0b3JfdXBUbyg0LCA2KS5pdGVyYXRvcigpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDQsIGl0ZXJhdG9yLm5leHQoKS5pbnRWYWx1ZSgpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyg1LCBpdGVyYXRvci5uZXh0KCkuaW50VmFsdWUoKSk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoNiwgaXRlcmF0b3IubmV4dCgpLmludFZhbHVlKCkpOworCQlBc3NlcnQuYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKKwl9CisJCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0T3BlcmF0b3JfdXBUb18wMygpIHRocm93cyBFeGNlcHRpb24geworCQlJdGVyYXRvcjxJbnRlZ2VyPiBpdGVyYXRvciA9IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5JbnRlZ2VyRXh0ZW5zaW9ucy5vcGVyYXRvcl91cFRvKDEyLCA5KS5pdGVyYXRvcigpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDEyLCBpdGVyYXRvci5uZXh0KCkuaW50VmFsdWUoKSk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoMTEsIGl0ZXJhdG9yLm5leHQoKS5pbnRWYWx1ZSgpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygxMCwgaXRlcmF0b3IubmV4dCgpLmludFZhbHVlKCkpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDksIGl0ZXJhdG9yLm5leHQoKS5pbnRWYWx1ZSgpKTsKKwkJQXNzZXJ0LmFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7CisJfQorCQorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE9wZXJhdG9yX3VwVG9fMDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSXRlcmF0b3I8SW50ZWdlcj4gaXRlcmF0b3IgPSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuSW50ZWdlckV4dGVuc2lvbnMub3BlcmF0b3JfdXBUbygtMTIsIC05KS5pdGVyYXRvcigpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xMiwgaXRlcmF0b3IubmV4dCgpLmludFZhbHVlKCkpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xMSwgaXRlcmF0b3IubmV4dCgpLmludFZhbHVlKCkpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xMCwgaXRlcmF0b3IubmV4dCgpLmludFZhbHVlKCkpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKC05LCBpdGVyYXRvci5uZXh0KCkuaW50VmFsdWUoKSk7CisJCUFzc2VydC5hc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvSW50ZWdlclJhbmdlVGVzdC5qYXZhIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9JbnRlZ2VyUmFuZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1ZWQzNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvSW50ZWdlclJhbmdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnRlc3RzLmxpYjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkludGVnZXJSYW5nZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIEphbiBLb2VobmxlaW4gLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKiBAYXV0aG9yIEthcnN0ZW4gVGhvbXMgLSBCdWcjMzgxMTQwCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlZ2VyUmFuZ2VUZXN0IHsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFZhbGlkaXR5KCkgeworCQluZXcgSW50ZWdlclJhbmdlKDAsIDAsIDEpOworCQluZXcgSW50ZWdlclJhbmdlKDAsIDAsIC0xKTsKKwkJbmV3IEludGVnZXJSYW5nZSgwLCAyLCAxKTsKKwkJbmV3IEludGVnZXJSYW5nZSgtMSwgMiwgMSk7CisJCW5ldyBJbnRlZ2VyUmFuZ2UoLTIsIC0xLCAxKTsKKwkJbmV3IEludGVnZXJSYW5nZSgyLCAwLCAtMSk7CisJCW5ldyBJbnRlZ2VyUmFuZ2UoMiwgLTEsIC0xKTsKKwkJbmV3IEludGVnZXJSYW5nZSgtMSwgLTIsIC0xKTsKKwkJbmV3IEludGVnZXJSYW5nZSgtMiwgMCwgMSk7CisJCW5ldyBJbnRlZ2VyUmFuZ2UoSW50ZWdlci5NSU5fVkFMVUUsIDAsIDEpOworCQluZXcgSW50ZWdlclJhbmdlKEludGVnZXIuTUFYX1ZBTFVFLCAwLCAtMSk7CisKKwkJYXNzZXJ0SW52YWxpZCgwLCAxLCAwKTsKKwkJYXNzZXJ0SW52YWxpZCgwLCAyLCAtMSk7CisJCWFzc2VydEludmFsaWQoLTEsIDIsIC0xKTsKKwkJYXNzZXJ0SW52YWxpZCgtMiwgLTEsIC0xKTsKKwkJYXNzZXJ0SW52YWxpZCgyLCAwLCAxKTsKKwkJYXNzZXJ0SW52YWxpZCgyLCAtMSwgMSk7CisJCWFzc2VydEludmFsaWQoLTEsIC0yLCAxKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRJbnZhbGlkKGludCBzdGFydCwgaW50IGVuZCwgaW50IHN0ZXApIHsKKwkJdHJ5IHsKKwkJCW5ldyBJbnRlZ2VyUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCk7CisJCQlmYWlsKCJJbnZhbGlkIHN0ZXAgbm90IGRldGVjdGVkIik7CisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBleHBlY3RlZCBleGNlcHRpb24KKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRTdGVwKCkgeworCQlhc3NlcnRFcXVhbHMoMSwgbmV3IEludGVnZXJSYW5nZSgwLCAxMCkuZ2V0U3RlcCgpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBuZXcgSW50ZWdlclJhbmdlKDEwLCAwKS5nZXRTdGVwKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgbmV3IEludGVnZXJSYW5nZSgxMCwgMTApLmdldFN0ZXAoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNfMCgpIHsKKwkJSW50ZWdlclJhbmdlIHJhbmdlID0gbmV3IEludGVnZXJSYW5nZSgtMSwgMSwgMik7CisJCWFzc2VydEZhbHNlKHJhbmdlLmNvbnRhaW5zKC0yKSk7CisJCWFzc2VydFRydWUocmFuZ2UuY29udGFpbnMoLTEpKTsKKwkJYXNzZXJ0RmFsc2UocmFuZ2UuY29udGFpbnMoMCkpOworCQlhc3NlcnRUcnVlKHJhbmdlLmNvbnRhaW5zKDEpKTsKKwkJYXNzZXJ0RmFsc2UocmFuZ2UuY29udGFpbnMoMikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENvbnRhaW5zXzEoKSB7CisJCUludGVnZXJSYW5nZSByYW5nZSA9IG5ldyBJbnRlZ2VyUmFuZ2UoLTEsIDIsIDIpOworCQlhc3NlcnRGYWxzZShyYW5nZS5jb250YWlucygtMikpOworCQlhc3NlcnRUcnVlKHJhbmdlLmNvbnRhaW5zKC0xKSk7CisJCWFzc2VydEZhbHNlKHJhbmdlLmNvbnRhaW5zKDApKTsKKwkJYXNzZXJ0VHJ1ZShyYW5nZS5jb250YWlucygxKSk7CisJCWFzc2VydEZhbHNlKHJhbmdlLmNvbnRhaW5zKDIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgeworCQlmaW5hbCBJbnRlZ2VyUmFuZ2UgbXlSYW5nZSA9IG5ldyBJbnRlZ2VyUmFuZ2UoLTEsIDEpOworCQlhc3NlcnRFcXVhbHMoMywgbXlSYW5nZS5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgbXlSYW5nZS53aXRoU3RlcCgyKS5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgbXlSYW5nZS53aXRoU3RlcCgzKS5nZXRTaXplKCkpOworCQkKKwkJZmluYWwgSW50ZWdlclJhbmdlIG15UmFuZ2UyID0gbmV3IEludGVnZXJSYW5nZSgxLCAtMSk7CisJCWFzc2VydEVxdWFscygzLCBteVJhbmdlMi5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgbXlSYW5nZTIud2l0aFN0ZXAoLTIpLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBteVJhbmdlMi53aXRoU3RlcCgtMykuZ2V0U2l6ZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKKwkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IGl0ZXJhdG9yID0gbmV3IEludGVnZXJSYW5nZSgtMiwgMiwgMikuaXRlcmF0b3IoKTsKKwkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzUHJldmlvdXMoKSk7CisJCWFzc2VydFRydWUoaXRlcmF0b3IuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGl0ZXJhdG9yLm5leHRJbmRleCgpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBpdGVyYXRvci5wcmV2aW91c0luZGV4KCkpOworCQl0cnkgeworCQkJaXRlcmF0b3IucHJldmlvdXMoKTsKKwkJCWZhaWwoIkV4cGVjdGVkIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24iKTsKKwkJfSBjYXRjaChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKKwkJCS8vIGV4cGVjdGVkIGV4Y2VwdGlvbjsKKwkJfQorCQkKKwkJYXNzZXJ0RXF1YWxzKC0yLCBpdGVyYXRvci5uZXh0KCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoaXRlcmF0b3IuaGFzUHJldmlvdXMoKSk7CisJCWFzc2VydFRydWUoaXRlcmF0b3IuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGl0ZXJhdG9yLm5leHRJbmRleCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDAsIGl0ZXJhdG9yLm5leHQoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNQcmV2aW91cygpKTsKKwkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoMiwgaXRlcmF0b3IubmV4dEluZGV4KCkpOworCQlhc3NlcnRFcXVhbHMoMSwgaXRlcmF0b3IucHJldmlvdXNJbmRleCgpKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgaXRlcmF0b3IubmV4dCgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc1ByZXZpb3VzKCkpOworCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoMywgaXRlcmF0b3IubmV4dEluZGV4KCkpOworCQlhc3NlcnRFcXVhbHMoMiwgaXRlcmF0b3IucHJldmlvdXNJbmRleCgpKTsKKwkJdHJ5IHsKKwkJCWl0ZXJhdG9yLm5leHQoKTsKKwkJCWZhaWwoIkV4cGVjdGVkIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24iKTsKKwkJfSBjYXRjaChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKKwkJCS8vIGV4cGVjdGVkIGV4Y2VwdGlvbjsKKwkJfQorCisJCWFzc2VydEVxdWFscygyLCBpdGVyYXRvci5wcmV2aW91cygpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc1ByZXZpb3VzKCkpOworCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygyLCBpdGVyYXRvci5uZXh0SW5kZXgoKSk7CisJCWFzc2VydEVxdWFscygxLCBpdGVyYXRvci5wcmV2aW91c0luZGV4KCkpOworCisJCWFzc2VydEVxdWFscygwLCBpdGVyYXRvci5wcmV2aW91cygpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc1ByZXZpb3VzKCkpOworCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygxLCBpdGVyYXRvci5uZXh0SW5kZXgoKSk7CisJCWFzc2VydEVxdWFscygwLCBpdGVyYXRvci5wcmV2aW91c0luZGV4KCkpOworCisJCWFzc2VydEVxdWFscygtMiwgaXRlcmF0b3IucHJldmlvdXMoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzUHJldmlvdXMoKSk7CisJCWFzc2VydFRydWUoaXRlcmF0b3IuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGl0ZXJhdG9yLm5leHRJbmRleCgpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBpdGVyYXRvci5wcmV2aW91c0luZGV4KCkpOworCisJCXRyeSB7CisJCQlpdGVyYXRvci5wcmV2aW91cygpOworCQkJZmFpbCgiRXhwZWN0ZWQgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiIpOworCQl9IGNhdGNoKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgeworCQkJLy8gZXhwZWN0ZWQgZXhjZXB0aW9uOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9JdGVyYWJsZUV4dGVuc2lvbnNUZXN0LmphdmEgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL0l0ZXJhYmxlRXh0ZW5zaW9uc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjY2MjhjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9JdGVyYWJsZUV4dGVuc2lvbnNUZXN0LmphdmEKQEAgLTAsMCArMSwzNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTcgaXRlbWlzIEFHIChodHRwOi8vd3d3Lml0ZW1pcy5ldSkgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UudGVzdHMubGliOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHMuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5GdW5jdGlvbnMuRnVuY3Rpb24xOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5JdGVyYWJsZUV4dGVuc2lvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlBhaXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXMuUHJvY2VkdXJlMjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuRm9yd2FyZGluZ0NvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CisKKy8qKgorICogQGF1dGhvciBTZWJhc3RpYW4gWmFybmVrb3cgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKiBAYXV0aG9yIEthcnN0ZW4gVGhvbXMgLSB0ZXN0TWFwLCB0ZXN0RmxhdE1hcAorICovCitwdWJsaWMgY2xhc3MgSXRlcmFibGVFeHRlbnNpb25zVGVzdCBleHRlbmRzIEJhc2VJdGVyYWJsZXNJdGVyYXRvcnNUZXN0PEl0ZXJhYmxlPEludGVnZXI+PiB7CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSXRlcmFibGU8SW50ZWdlcj5bXSB0ZXN0RGF0YShJbnRlZ2VyLi4uIGVsZW1lbnRzKSB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlJdGVyYWJsZTxJbnRlZ2VyPltdIHJlc3VsdCA9IG5ldyBJdGVyYWJsZVtdIHsKKwkJCUxpc3RzLm5ld0FycmF5TGlzdChlbGVtZW50cyksCisJCQlMaXN0cy5uZXdMaW5rZWRMaXN0KExpc3RzLm5ld0FycmF5TGlzdChlbGVtZW50cykpLAorCQkJU2V0cy5uZXdMaW5rZWRIYXNoU2V0KExpc3RzLm5ld0FycmF5TGlzdChlbGVtZW50cykpLAorCQkJU2V0cy5uZXdUcmVlU2V0KExpc3RzLm5ld0FycmF5TGlzdChlbGVtZW50cykpCisJCX07CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJdGVyYWJsZTxJbnRlZ2VyPltdIG51bGxhYmxlVGVzdERhdGEoSW50ZWdlci4uLiBlbGVtZW50cykgeworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJSXRlcmFibGU8SW50ZWdlcj5bXSByZXN1bHQgPSBuZXcgSXRlcmFibGVbXSB7CisJCQlMaXN0cy5uZXdBcnJheUxpc3QoZWxlbWVudHMpLAorCQkJTGlzdHMubmV3TGlua2VkTGlzdChMaXN0cy5uZXdBcnJheUxpc3QoZWxlbWVudHMpKSwKKwkJCVNldHMubmV3TGlua2VkSGFzaFNldChMaXN0cy5uZXdBcnJheUxpc3QoZWxlbWVudHMpKSwKKy8vCQkJU2V0cy5uZXdUcmVlU2V0KExpc3RzLm5ld0FycmF5TGlzdChlbGVtZW50cykpIG51bGwgaXMgbm90IGFsbG93ZWQKKwkJfTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSXRlcmFibGU8SW50ZWdlcj4gZHVtbXkoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpcyhJdGVyYWJsZTxJbnRlZ2VyPiBpbnB1dCwgSW50ZWdlci4uLiBlbGVtZW50cykgeworCQlyZXR1cm4gSXRlcmFibGVzLmVsZW1lbnRzRXF1YWwoaW5wdXQsIExpc3RzLm5ld0FycmF5TGlzdChlbGVtZW50cykpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJdGVyYWJsZTxJbnRlZ2VyPiBvcGVyYXRvcl9wbHVzKEl0ZXJhYmxlPEludGVnZXI+IGZpcnN0LCBJdGVyYWJsZTxJbnRlZ2VyPiBzZWNvbmQpIHsKKwkJcmV0dXJuIEl0ZXJhYmxlRXh0ZW5zaW9ucy5vcGVyYXRvcl9wbHVzKGZpcnN0LCBzZWNvbmQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJbnRlZ2VyIGZpbmRGaXJzdChJdGVyYWJsZTxJbnRlZ2VyPiBpbnB1dCwgRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+IGZpbHRlcikgeworCQlyZXR1cm4gSXRlcmFibGVFeHRlbnNpb25zLmZpbmRGaXJzdChpbnB1dCwgZmlsdGVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSW50ZWdlciBmaW5kTGFzdChJdGVyYWJsZTxJbnRlZ2VyPiBpbnB1dCwgRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+IGZpbHRlcikgeworCQlyZXR1cm4gSXRlcmFibGVFeHRlbnNpb25zLmZpbmRMYXN0KGlucHV0LCBmaWx0ZXIpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJbnRlZ2VyIGxhc3QoSXRlcmFibGU8SW50ZWdlcj4gaW5wdXQpIHsKKwkJcmV0dXJuIEl0ZXJhYmxlRXh0ZW5zaW9ucy5sYXN0KGlucHV0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSW50ZWdlciBoZWFkKEl0ZXJhYmxlPEludGVnZXI+IGlucHV0KSB7CisJCXJldHVybiBJdGVyYWJsZUV4dGVuc2lvbnMuaGVhZChpbnB1dCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGZvckVhY2goSXRlcmFibGU8SW50ZWdlcj4gaW5wdXQsIFByb2NlZHVyZTI8SW50ZWdlciwgSW50ZWdlcj4gcHJvYykgeworCQlJdGVyYWJsZUV4dGVuc2lvbnMuZm9yRWFjaChpbnB1dCwgcHJvYyk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJdGVyYWJsZTxJbnRlZ2VyPiB0YWtlV2hpbGUoSXRlcmFibGU8SW50ZWdlcj4gaW5wdXQsIEZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPiBmaWx0ZXIpIHsKKwkJcmV0dXJuIEl0ZXJhYmxlRXh0ZW5zaW9ucy50YWtlV2hpbGUoaW5wdXQsIGZpbHRlcik7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJdGVyYWJsZTxJbnRlZ2VyPiBkcm9wV2hpbGUoSXRlcmFibGU8SW50ZWdlcj4gaW5wdXQsIEZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPiBmaWx0ZXIpIHsKKwkJcmV0dXJuIEl0ZXJhYmxlRXh0ZW5zaW9ucy5kcm9wV2hpbGUoaW5wdXQsIGZpbHRlcik7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJbnRlZ2VyIG1heChJdGVyYWJsZTxJbnRlZ2VyPiBpbnB1dCkgeworCQlyZXR1cm4gSXRlcmFibGVFeHRlbnNpb25zLm1heChpbnB1dCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJbnRlZ2VyIG1heChJdGVyYWJsZTxJbnRlZ2VyPiBpbnB1dCwgQ29tcGFyYXRvcjw/IHN1cGVyIEludGVnZXI+IGNvbXBhcmF0b3IpIHsKKwkJcmV0dXJuIEl0ZXJhYmxlRXh0ZW5zaW9ucy5tYXgoaW5wdXQsIGNvbXBhcmF0b3IpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSW50ZWdlciBtYXhCeShJdGVyYWJsZTxJbnRlZ2VyPiBpbnB1dCwgRnVuY3Rpb24xPD8gc3VwZXIgSW50ZWdlciwgU3RyaW5nPiBjb21wYXJlQnkpIHsKKwkJcmV0dXJuIEl0ZXJhYmxlRXh0ZW5zaW9ucy5tYXhCeShpbnB1dCwgY29tcGFyZUJ5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEludGVnZXIgbWluKEl0ZXJhYmxlPEludGVnZXI+IGlucHV0KSB7CisJCXJldHVybiBJdGVyYWJsZUV4dGVuc2lvbnMubWluKGlucHV0KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEludGVnZXIgbWluKEl0ZXJhYmxlPEludGVnZXI+IGlucHV0LCBDb21wYXJhdG9yPD8gc3VwZXIgSW50ZWdlcj4gY29tcGFyYXRvcikgeworCQlyZXR1cm4gSXRlcmFibGVFeHRlbnNpb25zLm1pbihpbnB1dCwgY29tcGFyYXRvcik7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJbnRlZ2VyIG1pbkJ5KEl0ZXJhYmxlPEludGVnZXI+IGlucHV0LCBGdW5jdGlvbjE8PyBzdXBlciBJbnRlZ2VyLCBTdHJpbmc+IGNvbXBhcmVCeSkgeworCQlyZXR1cm4gSXRlcmFibGVFeHRlbnNpb25zLm1pbkJ5KGlucHV0LCBjb21wYXJlQnkpOworCX0KKwkKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Sm9pbldpdGhOdWxsKCkgeworCQlMaXN0PFN0cmluZz4gbGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgiYSIsIG51bGwsICJjIik7CisJCVN0cmluZyBzdHJpbmcgPSBJdGVyYWJsZUV4dGVuc2lvbnMuam9pbihsaXN0LCAiLCIpOworCQlhc3NlcnRFcXVhbHMoImEsbnVsbCxjIiwgc3RyaW5nKTsKKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNvcnRCeSgpIHRocm93cyBFeGNlcHRpb24geworCQlMaXN0PD8gZXh0ZW5kcyBDaGFyU2VxdWVuY2U+IGxpc3QgPSBuZXdBcnJheUxpc3QoImZvbyIsImJhciIsImJheiIpOworCQlMaXN0PD8gZXh0ZW5kcyBDaGFyU2VxdWVuY2U+IHNvcnRlZCA9IEl0ZXJhYmxlRXh0ZW5zaW9ucy5zb3J0QnkobGlzdCwgbmV3IEZ1bmN0aW9ucy5GdW5jdGlvbjE8Q2hhclNlcXVlbmNlLCBTdHJpbmc+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIGFwcGx5KENoYXJTZXF1ZW5jZSBwKSB7CisJCQkJcmV0dXJuIHAudG9TdHJpbmcoKTsKKwkJCX0KKwkJfSk7CisJCWFzc2VydE5vdFNhbWUobGlzdCwgc29ydGVkKTsKKwkJYXNzZXJ0RXF1YWxzKHNvcnRlZCwgbmV3QXJyYXlMaXN0KCJiYXIiLCJiYXoiLCJmb28iKSk7CisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IEl0ZXJhYmxlRXh0ZW5zaW9ucy5maWx0ZXJOdWxsKG5ld0FycmF5TGlzdCgiZm9vIiwgbnVsbCwgImJhciIpKS5pdGVyYXRvcigpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGl0ZXIubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBpdGVyLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsKKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEpvaW5XaXRoQmVmb3JlQW5kQWZ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ld0FycmF5TGlzdCgiZm9vIiwgImJhciIpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBzaW5nbGV0b25MaXN0ID0gbmV3QXJyYXlMaXN0KCJmb28iKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZW1wdHlsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQorCQlmaW5hbCBGdW5jdGlvbnMuRnVuY3Rpb24xPFN0cmluZywgU3RyaW5nPiBmdW5jdGlvbiA9IG5ldyBGdW5jdGlvbnMuRnVuY3Rpb24xPFN0cmluZywgU3RyaW5nPigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyBhcHBseShTdHJpbmcgcCkgeworCQkJCXJldHVybiBwOworCQkJfQorCQl9OworCQlhc3NlcnRFcXVhbHMoIjxmb28sYmFyPiIsIEl0ZXJhYmxlRXh0ZW5zaW9ucy5qb2luKGxpc3QsICI8IiwgIiwiLCAiPiIsIGZ1bmN0aW9uKSk7CisJCWFzc2VydEVxdWFscygiPGZvbz4iLCBJdGVyYWJsZUV4dGVuc2lvbnMuam9pbihzaW5nbGV0b25MaXN0LCAiPCIsICIsIiwgIj4iLCBmdW5jdGlvbikpOworCQlhc3NlcnRFcXVhbHMoIiIsIEl0ZXJhYmxlRXh0ZW5zaW9ucy5qb2luKGVtcHR5bGlzdCwgIjwiLCAiLCIsICI+IiwgZnVuY3Rpb24pKTsKKwkJCisJCWFzc2VydEVxdWFscygiZm9vLGJhcj4iLCBJdGVyYWJsZUV4dGVuc2lvbnMuam9pbihsaXN0LCBudWxsLCAiLCIsICI+IiwgZnVuY3Rpb24pKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28+IiwgSXRlcmFibGVFeHRlbnNpb25zLmpvaW4oc2luZ2xldG9uTGlzdCwgbnVsbCwgIiwiLCAiPiIsIGZ1bmN0aW9uKSk7CisJCWFzc2VydEVxdWFscygiIiwgSXRlcmFibGVFeHRlbnNpb25zLmpvaW4oZW1wdHlsaXN0LCBudWxsLCAiLCIsICI+IiwgZnVuY3Rpb24pKTsKKwkJCisJCWFzc2VydEVxdWFscygiPGZvb2Jhcj4iLCBJdGVyYWJsZUV4dGVuc2lvbnMuam9pbihsaXN0LCAiPCIsIG51bGwsICI+IiwgZnVuY3Rpb24pKTsKKwkJYXNzZXJ0RXF1YWxzKCI8Zm9vPiIsIEl0ZXJhYmxlRXh0ZW5zaW9ucy5qb2luKHNpbmdsZXRvbkxpc3QsICI8IiwgbnVsbCwgIj4iLCBmdW5jdGlvbikpOworCQlhc3NlcnRFcXVhbHMoIiIsIEl0ZXJhYmxlRXh0ZW5zaW9ucy5qb2luKGVtcHR5bGlzdCwgIjwiLCBudWxsLCAiPiIsIGZ1bmN0aW9uKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoIjxmb28sYmFyIiwgSXRlcmFibGVFeHRlbnNpb25zLmpvaW4obGlzdCwgIjwiLCAiLCIsIG51bGwsIGZ1bmN0aW9uKSk7CisJCWFzc2VydEVxdWFscygiPGZvbyIsIEl0ZXJhYmxlRXh0ZW5zaW9ucy5qb2luKHNpbmdsZXRvbkxpc3QsICI8IiwgIiwiLCBudWxsLCBmdW5jdGlvbikpOworCQlhc3NlcnRFcXVhbHMoIiIsIEl0ZXJhYmxlRXh0ZW5zaW9ucy5qb2luKGVtcHR5bGlzdCwgIjwiLCAiLCIsIG51bGwsIGZ1bmN0aW9uKSk7CisJfQorCQorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbmRleGVkKCkgeworCQlJdGVyYXRvcjxQYWlyPEludGVnZXIsIFN0cmluZz4+IHJlc3VsdCA9IEl0ZXJhYmxlRXh0ZW5zaW9ucy5pbmRleGVkKG5ld0FycmF5TGlzdCgiZm9vIiwgImJhciIpKS5pdGVyYXRvcigpOworCQlhc3NlcnRFcXVhbHMobmV3IFBhaXI8SW50ZWdlciwgU3RyaW5nPigwLCAiZm9vIiksIHJlc3VsdC5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMobmV3IFBhaXI8SW50ZWdlciwgU3RyaW5nPigxLCAiYmFyIiksIHJlc3VsdC5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShyZXN1bHQuaGFzTmV4dCgpKTsKKwl9CisKKwljbGFzcyBBIHt9CisJaW50ZXJmYWNlIEMge30KKwljbGFzcyBCIGV4dGVuZHMgQSBpbXBsZW1lbnRzIEMge30KKwljbGFzcyBEIGV4dGVuZHMgQSB7fQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlamVjdCgpIHsKKwkJTGlzdDxJbnRlZ2VyPiBudWxsTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQludWxsTGlzdC5hZGQobnVsbCk7CisJCUxpc3Q8T2JqZWN0PiBvYmplY3RzID0gbmV3QXJyYXlMaXN0KDEsIDIsIG51bGwsIDRsLCAiU3RyaW5nIik7CisJCWFzc2VydEVxdWFscyhuZXdBcnJheUxpc3QoMSwgMiwgbnVsbCwgNGwpLCBuZXdBcnJheUxpc3QoSXRlcmFibGVFeHRlbnNpb25zLnJlamVjdChvYmplY3RzLCBTdHJpbmcuY2xhc3MpKSk7CisJCWFzc2VydEVxdWFscyhudWxsTGlzdCwgbmV3QXJyYXlMaXN0KEl0ZXJhYmxlRXh0ZW5zaW9ucy5yZWplY3Qob2JqZWN0cywgT2JqZWN0LmNsYXNzKSkpOworCQkKKwkJTGlzdDxJbnRlZ2VyPiBpbnRlZ2VyT2JqZWN0cyA9IG5ld0FycmF5TGlzdCgxLCAyLCBudWxsLCA0KTsKKwkJYXNzZXJ0RXF1YWxzKG51bGxMaXN0LCBuZXdBcnJheUxpc3QoSXRlcmFibGVFeHRlbnNpb25zLnJlamVjdChpbnRlZ2VyT2JqZWN0cywgSW50ZWdlci5jbGFzcykpKTsKKwkJCisJCUxpc3Q8QT4gYk9iamVjdHMgPSBuZXdBcnJheUxpc3QobmV3IEIoKSwgbmV3IEIoKSwgbmV3IEQoKSk7CisJCWFzc2VydEVxdWFscygwLCBJdGVyYWJsZUV4dGVuc2lvbnMuc2l6ZShJdGVyYWJsZUV4dGVuc2lvbnMucmVqZWN0KGJPYmplY3RzLCBBLmNsYXNzKSkpOworCQlhc3NlcnRFcXVhbHMoMSwgSXRlcmFibGVFeHRlbnNpb25zLnNpemUoSXRlcmFibGVFeHRlbnNpb25zLnJlamVjdChiT2JqZWN0cywgQi5jbGFzcykpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIEl0ZXJhYmxlRXh0ZW5zaW9ucy5zaXplKEl0ZXJhYmxlRXh0ZW5zaW9ucy5yZWplY3QoYk9iamVjdHMsIEMuY2xhc3MpKSk7CisJCWFzc2VydEVxdWFscygyLCBJdGVyYWJsZUV4dGVuc2lvbnMuc2l6ZShJdGVyYWJsZUV4dGVuc2lvbnMucmVqZWN0KGJPYmplY3RzLCBELmNsYXNzKSkpOworCQkKKwkJRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+IGZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEJvb2xlYW4gYXBwbHkoSW50ZWdlciBwKSB7CisJCQkJcmV0dXJuIHAgJSAyID09IDA7CisJCQl9CisJCX07CisJCWFzc2VydEVxdWFscyhuZXdBcnJheUxpc3QoMSwzLDUpLG5ld0FycmF5TGlzdChJdGVyYWJsZUV4dGVuc2lvbnMucmVqZWN0KG5ld0FycmF5TGlzdCgxLDIsMyw0LDUpLCBmdW5jdGlvbikpKTsKKwkJRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+IGZ1bmN0aW9uTnVsbFNhZmUgPSBuZXcgRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQm9vbGVhbiBhcHBseShJbnRlZ2VyIHApIHsKKwkJCQlyZXR1cm4gcCA9PSBudWxsIHx8IHAgJSAyID09IDA7CisJCQl9CisJCX07CisJCWFzc2VydEVxdWFscyhuZXdBcnJheUxpc3QoMSw1KSxuZXdBcnJheUxpc3QoSXRlcmFibGVFeHRlbnNpb25zLnJlamVjdChuZXdBcnJheUxpc3QoMSwyLG51bGwsNCw1KSwgZnVuY3Rpb25OdWxsU2FmZSkpKTsKKwkJdHJ5IHsKKwkJCW5ld0FycmF5TGlzdChJdGVyYWJsZUV4dGVuc2lvbnMucmVqZWN0KG51bGwsIGZ1bmN0aW9uKSk7CisJCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCIpOworCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisJCQkvLyBleHBlY3RlZCBOUEUKKwkJfQorCQl0cnkgeworCQkJRnVuY3Rpb24xPD8gc3VwZXIgSW50ZWdlciwgQm9vbGVhbj4gbnVsbEZuID0gbnVsbDsKKwkJCW5ld0FycmF5TGlzdChJdGVyYWJsZUV4dGVuc2lvbnMucmVqZWN0KG5ld0FycmF5TGlzdCgxLDIsMyksIG51bGxGbikpOworCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKwkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworCQkJLy8gZXhwZWN0ZWQgTlBFCisJCX0KKwkJdHJ5IHsKKwkJCUNsYXNzPEludGVnZXI+IG51bGxDbGFzcyA9IG51bGw7CisJCQluZXdBcnJheUxpc3QoSXRlcmFibGVFeHRlbnNpb25zLnJlamVjdChuZXdBcnJheUxpc3QoMSwyLDMpLCBudWxsQ2xhc3MpKTsKKwkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIik7CisJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGV4cGVjdGVkIE5QRQorCQl9CisJCUZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPiBicm9rZW5GdW5jdGlvbiA9IG5ldyBGdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBCb29sZWFuIGFwcGx5KEludGVnZXIgcCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9OworCQl0cnkgeworCQkJbmV3QXJyYXlMaXN0KEl0ZXJhYmxlRXh0ZW5zaW9ucy5yZWplY3QobmV3QXJyYXlMaXN0KDEsMiwzKSwgYnJva2VuRnVuY3Rpb24pKTsKKwkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIik7CisJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGV4cGVjdGVkIE5QRQorCQl9CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE1hcCAoKSB7CisJCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXdBcnJheUxpc3QoImZvbyIsICJiYXIiKTsKKwkJCisJCWZpbmFsIEZ1bmN0aW9ucy5GdW5jdGlvbjE8U3RyaW5nLCBTdHJpbmc+IGZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9ucy5GdW5jdGlvbjE8U3RyaW5nLCBTdHJpbmc+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIGFwcGx5KFN0cmluZyBwKSB7CisJCQkJcmV0dXJuICJIZWxsbyAiK3A7CisJCQl9CisJCX07CisJCQorCQlhc3NlcnRFcXVhbHMobmV3QXJyYXlMaXN0KCJIZWxsbyBmb28iLCAiSGVsbG8gYmFyIiksIG5ld0FycmF5TGlzdChJdGVyYWJsZUV4dGVuc2lvbnMubWFwKGxpc3QsIGZ1bmN0aW9uKSkpOworCQorCQkvLyB0ZXN0IHRoYXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yIHN1cHBvcnRzIHJlbW92ZSBvbiB0aGUgdW5kZXJ5bGluZyBsaXN0CisJCS8vIHRoZXJlZm9yZSB3ZSBuZWVkIGEgZnVuY3Rpb24gdGhhdCBtYXBzIHRvIHRoZSBzYW1lIG9iamVjdCBjb250YWluZWQgaW4gdGhlIGxpc3QKKwkJZmluYWwgRnVuY3Rpb25zLkZ1bmN0aW9uMTxTdHJpbmcsIFN0cmluZz4gZnVuY3Rpb25Gb3JSZW1vdmUgPSBuZXcgRnVuY3Rpb25zLkZ1bmN0aW9uMTxTdHJpbmcsIFN0cmluZz4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgYXBwbHkoU3RyaW5nIHApIHsKKwkJCQlyZXR1cm4gImZvbyIuZXF1YWxzKHApID8gcCA6ICJIZWxsbyAiK3A7CisJCQl9CisJCX07CisKKwkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJmb28iKSk7CisJCWFzc2VydEVxdWFscygyLCBsaXN0LnNpemUoKSk7CisJCWFzc2VydEVxdWFscyhuZXdBcnJheUxpc3QoImZvbyIsICJIZWxsbyBiYXIiKSwgbmV3QXJyYXlMaXN0KEl0ZXJhYmxlRXh0ZW5zaW9ucy5tYXAobGlzdCwgZnVuY3Rpb25Gb3JSZW1vdmUpKSk7CisJCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBJdGVyYWJsZUV4dGVuc2lvbnMubWFwKGxpc3QsIGZ1bmN0aW9uRm9yUmVtb3ZlKS5pdGVyYXRvcigpOworCQlpdGVyYXRvci5uZXh0KCk7CisJCWl0ZXJhdG9yLnJlbW92ZSgpOworCQkKKwkJYXNzZXJ0VHJ1ZSghbGlzdC5jb250YWlucygiZm9vIikpOworCQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RGbGF0TWFwICgpIHsKKwkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ld0FycmF5TGlzdCgiZm9vIiwgImJhciIpOworCQkKKwkJZmluYWwgRnVuY3Rpb25zLkZ1bmN0aW9uMTxTdHJpbmcsIEl0ZXJhYmxlPFN0cmluZz4+IGZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9ucy5GdW5jdGlvbjE8U3RyaW5nLCBJdGVyYWJsZTxTdHJpbmc+PigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gYXBwbHkoU3RyaW5nIHApIHsKKwkJCQlyZXR1cm4gbmV3QXJyYXlMaXN0KCJIZWxsbyIsIHApOworCQkJfQorCQl9OworCQlhc3NlcnRFcXVhbHMobmV3QXJyYXlMaXN0KCJIZWxsbyIsICJmb28iLCAiSGVsbG8iLCAiYmFyIiksIG5ld0FycmF5TGlzdChJdGVyYWJsZUV4dGVuc2lvbnMuZmxhdE1hcChsaXN0LCBmdW5jdGlvbikpKTsKKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zKCkgeworCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3QXJyYXlMaXN0KCJlbGVtZW50MSIsICJlbGVtZW50MiIsICJlbGVtZW50MyIsIG51bGwpOworCQkKKwkJYXNzZXJ0VHJ1ZShJdGVyYWJsZUV4dGVuc2lvbnMuY29udGFpbnMobGlzdCwgImVsZW1lbnQzIikpOworCQlhc3NlcnRUcnVlKEl0ZXJhYmxlRXh0ZW5zaW9ucy5jb250YWlucyhsaXN0LCBuZXcgU3RyaW5nKCJlbGVtZW50MyIpKSk7CisJCWFzc2VydFRydWUoSXRlcmFibGVFeHRlbnNpb25zLmNvbnRhaW5zKGxpc3QsIG51bGwpKTsKKwkJCisJCWFzc2VydEZhbHNlKEl0ZXJhYmxlRXh0ZW5zaW9ucy5jb250YWlucyhsaXN0LCAiZWxlbWVudDQiKSk7CisJCWFzc2VydEZhbHNlKEl0ZXJhYmxlRXh0ZW5zaW9ucy5jb250YWlucyhsaXN0LCBuZXcgU3RyaW5nKCJlbGVtZW50NCIpKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RhYmxlQ29sbGVjdGlvbjxUPiBleHRlbmRzIEZvcndhcmRpbmdDb2xsZWN0aW9uPFQ+IHsKKworCQlwcml2YXRlIENvbGxlY3Rpb248VD4gb3JpZ2luYWw7CisJCWJvb2xlYW4gY29udGFpbnNXYXNDYWxsZWQ7CisJCU9iamVjdCBjb250YWluc1BhcmFtZXRlcjsKKwkJCisJCXB1YmxpYyBUZXN0YWJsZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxUPiBvcmlnaW5hbCkgeworCQkJc3VwZXIoKTsKKwkJCXRoaXMub3JpZ2luYWwgPSBvcmlnaW5hbDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxUPiBkZWxlZ2F0ZSgpIHsKKwkJCXJldHVybiBvcmlnaW5hbDsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpIHsKKwkJCWNvbnRhaW5zV2FzQ2FsbGVkID0gdHJ1ZTsKKwkJCWNvbnRhaW5zUGFyYW1ldGVyID0gb2JqZWN0OworCQkJcmV0dXJuIHN1cGVyLmNvbnRhaW5zKG9iamVjdCk7CisJCX0KKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT25Db2xsZWN0aW9uKCkgeworCQkvL0dJVkVOIGEgY29sbGVjdGlvbiwgZGVjbGFyZWQgYXMgYW4gaXRlcmFibGUKKwkJVGVzdGFibGVDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IG5ldyBUZXN0YWJsZUNvbGxlY3Rpb248U3RyaW5nPihuZXdIYXNoU2V0KCJlbGVtZW50MSIsICJlbGVtZW50MiIsICJlbGVtZW50MyIpKTsKKwkJCisJCS8vV0hFTiB3ZSBjYWxsIHRoZSBjb250YWlucyBtZXRob2QgdmlhIHRoZSBJdGVyYWJsZUV4dGVuc2lvbnMKKwkJSXRlcmFibGVFeHRlbnNpb25zLmNvbnRhaW5zKGNvbGxlY3Rpb24sICJlbGVtZW50MSIpOworCQkKKwkJLy9USEVOIHdlIGV4cGVjdCB0aGF0IHRoZSBjb2xsZWN0aW9uJ3MgbmF0aXZlIGNvbnRhaW5zIG1ldGhvZCB3YXMgdXNlZAorCQlhc3NlcnRUcnVlKCJJdGVyYWJsZUV4dGVuc2lvbnMuY29udGFpbnMgZGlkbid0IHVzZSB0aGUgY29sbGVjdGlvbidzIG5hdGl2ZSBjb250YWlucyBtZXRob2QiLAorCQkJCQljb2xsZWN0aW9uLmNvbnRhaW5zV2FzQ2FsbGVkKTsKKwkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50MSIsIGNvbGxlY3Rpb24uY29udGFpbnNQYXJhbWV0ZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvSXRlcmF0b3JFeHRlbnNpb25zVGVzdC5qYXZhIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9JdGVyYXRvckV4dGVuc2lvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2Yzc0YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvSXRlcmF0b3JFeHRlbnNpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE3IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnRlc3RzLmxpYjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5GdW5jdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjE7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkl0ZXJhdG9yRXh0ZW5zaW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUGFpcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHJvY2VkdXJlcy5Qcm9jZWR1cmUyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhdG9yczsKKworLyoqCisgKiBAYXV0aG9yIFN2ZW4gRWZmdGluZ2UgLSBJbml0aWFsIGNvbnRyaWJ1dGlvbiBhbmQgQVBJCisgKiBAYXV0aG9yIEthcnN0ZW4gVGhvbXMgLSB0ZXN0TWFwLCB0ZXN0RmxhdE1hcAorICovCitwdWJsaWMgY2xhc3MgSXRlcmF0b3JFeHRlbnNpb25zVGVzdCBleHRlbmRzIEJhc2VJdGVyYWJsZXNJdGVyYXRvcnNUZXN0PEl0ZXJhdG9yPEludGVnZXI+PiB7CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRvSXRlcmFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ld0FycmF5TGlzdCgiQSIsIkIiKTsKKwkJZm9yIChTdHJpbmcgcyA6IEl0ZXJhdG9yRXh0ZW5zaW9ucy50b0l0ZXJhYmxlKGxpc3QuaXRlcmF0b3IoKSkpIHsKKwkJCWFzc2VydFRydWUobGlzdC5jb250YWlucyhzKSk7CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gY2FuSXRlcmF0ZVR3aWNlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEl0ZXJhdG9yPEludGVnZXI+W10gdGVzdERhdGEoSW50ZWdlci4uLiBlbGVtZW50cykgeworCQlyZXR1cm4gbmV3IEl0ZXJhdG9yW10geyBJdGVyYXRvcnMuZm9yQXJyYXkoZWxlbWVudHMpIH07CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJdGVyYXRvcjxJbnRlZ2VyPltdIG51bGxhYmxlVGVzdERhdGEoSW50ZWdlci4uLiBlbGVtZW50cykgeworCQlyZXR1cm4gbmV3IEl0ZXJhdG9yW10geyBJdGVyYXRvcnMuZm9yQXJyYXkoZWxlbWVudHMpIH07CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEl0ZXJhdG9yPEludGVnZXI+IGR1bW15KCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMuPEludGVnZXI+ZW1wdHlMaXN0KCkuaXRlcmF0b3IoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpcyhJdGVyYXRvcjxJbnRlZ2VyPiBpbnB1dCwgSW50ZWdlci4uLiBlbGVtZW50cykgeworCQlyZXR1cm4gSXRlcmF0b3JzLmVsZW1lbnRzRXF1YWwoaW5wdXQsIEl0ZXJhdG9ycy5mb3JBcnJheShlbGVtZW50cykpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJdGVyYXRvcjxJbnRlZ2VyPiBvcGVyYXRvcl9wbHVzKEl0ZXJhdG9yPEludGVnZXI+IGZpcnN0LCBJdGVyYXRvcjxJbnRlZ2VyPiBzZWNvbmQpIHsKKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5vcGVyYXRvcl9wbHVzKGZpcnN0LCBzZWNvbmQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJbnRlZ2VyIGZpbmRGaXJzdChJdGVyYXRvcjxJbnRlZ2VyPiBpbnB1dCwgRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+IGZpbHRlcikgeworCQlyZXR1cm4gSXRlcmF0b3JFeHRlbnNpb25zLmZpbmRGaXJzdChpbnB1dCwgZmlsdGVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSW50ZWdlciBmaW5kTGFzdChJdGVyYXRvcjxJbnRlZ2VyPiBpbnB1dCwgRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+IGZpbHRlcikgeworCQlyZXR1cm4gSXRlcmF0b3JFeHRlbnNpb25zLmZpbmRMYXN0KGlucHV0LCBmaWx0ZXIpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJbnRlZ2VyIGxhc3QoSXRlcmF0b3I8SW50ZWdlcj4gaW5wdXQpIHsKKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5sYXN0KGlucHV0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSW50ZWdlciBoZWFkKEl0ZXJhdG9yPEludGVnZXI+IGlucHV0KSB7CisJCXJldHVybiBJdGVyYXRvckV4dGVuc2lvbnMuaGVhZChpbnB1dCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGZvckVhY2goSXRlcmF0b3I8SW50ZWdlcj4gaW5wdXQsIFByb2NlZHVyZTI8SW50ZWdlciwgSW50ZWdlcj4gcHJvYykgeworCQlJdGVyYXRvckV4dGVuc2lvbnMuZm9yRWFjaChpbnB1dCwgcHJvYyk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJdGVyYXRvcjxJbnRlZ2VyPiB0YWtlV2hpbGUoSXRlcmF0b3I8SW50ZWdlcj4gaW5wdXQsIEZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPiBmaWx0ZXIpIHsKKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy50YWtlV2hpbGUoaW5wdXQsIGZpbHRlcik7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJdGVyYXRvcjxJbnRlZ2VyPiBkcm9wV2hpbGUoSXRlcmF0b3I8SW50ZWdlcj4gaW5wdXQsIEZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPiBmaWx0ZXIpIHsKKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5kcm9wV2hpbGUoaW5wdXQsIGZpbHRlcik7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJbnRlZ2VyIG1heChJdGVyYXRvcjxJbnRlZ2VyPiBpbnB1dCkgeworCQlyZXR1cm4gSXRlcmF0b3JFeHRlbnNpb25zLm1heChpbnB1dCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJbnRlZ2VyIG1heChJdGVyYXRvcjxJbnRlZ2VyPiBpbnB1dCwgQ29tcGFyYXRvcjw/IHN1cGVyIEludGVnZXI+IGNvbXBhcmF0b3IpIHsKKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5tYXgoaW5wdXQsIGNvbXBhcmF0b3IpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSW50ZWdlciBtYXhCeShJdGVyYXRvcjxJbnRlZ2VyPiBpbnB1dCwgRnVuY3Rpb24xPD8gc3VwZXIgSW50ZWdlciwgU3RyaW5nPiBjb21wYXJlQnkpIHsKKwkJcmV0dXJuIEl0ZXJhdG9yRXh0ZW5zaW9ucy5tYXhCeShpbnB1dCwgY29tcGFyZUJ5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEludGVnZXIgbWluKEl0ZXJhdG9yPEludGVnZXI+IGlucHV0KSB7CisJCXJldHVybiBJdGVyYXRvckV4dGVuc2lvbnMubWluKGlucHV0KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEludGVnZXIgbWluKEl0ZXJhdG9yPEludGVnZXI+IGlucHV0LCBDb21wYXJhdG9yPD8gc3VwZXIgSW50ZWdlcj4gY29tcGFyYXRvcikgeworCQlyZXR1cm4gSXRlcmF0b3JFeHRlbnNpb25zLm1pbihpbnB1dCwgY29tcGFyYXRvcik7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJbnRlZ2VyIG1pbkJ5KEl0ZXJhdG9yPEludGVnZXI+IGlucHV0LCBGdW5jdGlvbjE8PyBzdXBlciBJbnRlZ2VyLCBTdHJpbmc+IGNvbXBhcmVCeSkgeworCQlyZXR1cm4gSXRlcmF0b3JFeHRlbnNpb25zLm1pbkJ5KGlucHV0LCBjb21wYXJlQnkpOworCX0KKwkKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW5kZXhlZCgpIHsKKwkJSXRlcmF0b3I8UGFpcjxJbnRlZ2VyLCBTdHJpbmc+PiByZXN1bHQgPSBJdGVyYXRvckV4dGVuc2lvbnMuaW5kZXhlZChuZXdBcnJheUxpc3QoImZvbyIsICJiYXIiKS5pdGVyYXRvcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBQYWlyPEludGVnZXIsIFN0cmluZz4oMCwgImZvbyIpLCByZXN1bHQubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBQYWlyPEludGVnZXIsIFN0cmluZz4oMSwgImJhciIpLCByZXN1bHQubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2UocmVzdWx0Lmhhc05leHQoKSk7CisJfQorCQorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvTWFwKCkgeworCQlMaXN0PFBhaXI8SW50ZWdlciwgU3RyaW5nPj4gcGFpcnMgPSBuZXcgQXJyYXlMaXN0PFBhaXI8SW50ZWdlciwgU3RyaW5nPj4oKTsKKwkJcGFpcnMuYWRkKG5ldyBQYWlyPEludGVnZXIsIFN0cmluZz4oMSwgIkEiKSk7CisJCXBhaXJzLmFkZChuZXcgUGFpcjxJbnRlZ2VyLCBTdHJpbmc+KDEsICJhIikpOworCQlwYWlycy5hZGQobmV3IFBhaXI8SW50ZWdlciwgU3RyaW5nPigyLCAiQiIpKTsKKwkJcGFpcnMuYWRkKG5ldyBQYWlyPEludGVnZXIsIFN0cmluZz4oMiwgImIiKSk7CisJCUZ1bmN0aW9uMTxQYWlyPEludGVnZXIsIFN0cmluZz4sIEludGVnZXI+IGNvbXB1dGVLZXlzID0gbmV3IEZ1bmN0aW9uMTxQYWlyPEludGVnZXIsIFN0cmluZz4sIEludGVnZXI+KCkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJbnRlZ2VyIGFwcGx5KFBhaXI8SW50ZWdlciwgU3RyaW5nPiBwKSB7CisJCQkJcmV0dXJuIHAuZ2V0S2V5KCk7CisJCQl9CisJCX07CisJCU1hcDxJbnRlZ2VyLCBQYWlyPEludGVnZXIsIFN0cmluZz4+IG1hcCA9IEl0ZXJhdG9yRXh0ZW5zaW9ucy50b01hcChwYWlycy5pdGVyYXRvcigpLCBjb21wdXRlS2V5cyk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGdyb3VwZWQgbWFwIHNpemUiLCAyLCBtYXAuc2l6ZSgpKTsKKwkJQXNzZXJ0LmFzc2VydFRydWUoIkNvbnRhaW5zIDEgYXMga2V5IiwgbWFwLmtleVNldCgpLmNvbnRhaW5zKDEpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiQ29udGFpbnMgZW50cnkgMS0+YSBmb3Iga2V5IDEiLCBtYXAuZ2V0KDEpLCBuZXcgUGFpcjxJbnRlZ2VyLCBTdHJpbmc+KDEsICJhIikpOworCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ29udGFpbnMgMiBhcyBrZXkiLCBtYXAua2V5U2V0KCkuY29udGFpbnMoMikpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJDb250YWlucyBlbnRyeSAyLT5iIGZvciBrZXkgMiIsIG1hcC5nZXQoMiksIG5ldyBQYWlyPEludGVnZXIsIFN0cmluZz4oMiwgImIiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9NYXBfX1doZW5FbXB0eUxpc3QoKSB7CisJCUxpc3Q8UGFpcjxJbnRlZ2VyLCBTdHJpbmc+PiBwYWlycyA9IG5ldyBBcnJheUxpc3Q8UGFpcjxJbnRlZ2VyLCBTdHJpbmc+PigpOworCQlGdW5jdGlvbjE8UGFpcjxJbnRlZ2VyLCBTdHJpbmc+LCBJbnRlZ2VyPiBjb21wdXRlS2V5cyA9IG5ldyBGdW5jdGlvbjE8UGFpcjxJbnRlZ2VyLCBTdHJpbmc+LCBJbnRlZ2VyPigpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSW50ZWdlciBhcHBseShQYWlyPEludGVnZXIsIFN0cmluZz4gcCkgeworCQkJCXJldHVybiBwLmdldEtleSgpOworCQkJfQorCQl9OworCQlNYXA8SW50ZWdlciwgUGFpcjxJbnRlZ2VyLCBTdHJpbmc+PiBtYXAgPSBJdGVyYXRvckV4dGVuc2lvbnMudG9NYXAocGFpcnMuaXRlcmF0b3IoKSwgY29tcHV0ZUtleXMpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBncm91cGVkIG1hcCBzaXplIiwgMCwgbWFwLnNpemUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9NYXBfX1doZW5DYWxjdWxhdGVkS2V5TnVsbCgpIHsKKwkJTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCW5hbWVzLmFkZCgiTXVlbGxlciIpOworCQluYW1lcy5hZGQoIlNjaG5laWRlciIpOworCQluYW1lcy5hZGQoIlNjaG1pZHQiKTsKKwkJbmFtZXMuYWRkKCJLb2NoIik7CisJCUZ1bmN0aW9uMTxTdHJpbmcsIFN0cmluZz4gY29tcHV0ZUtleXMgPSBuZXcgRnVuY3Rpb24xPFN0cmluZywgU3RyaW5nPigpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIGFwcGx5KFN0cmluZyBwKSB7CisJCQkJcmV0dXJuIHAuY29udGFpbnMoInkiKSA/ICJ5IiA6IG51bGw7CisJCQl9CisJCX07CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gSXRlcmF0b3JFeHRlbnNpb25zLnRvTWFwKG5hbWVzLml0ZXJhdG9yKCksIGNvbXB1dGVLZXlzKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiRXhwZWN0ZWQgZ3JvdXBlZCBtYXAgc2l6ZSIsIDEsIG1hcC5zaXplKCkpOworCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ29udGFpbnMgbnVsbCBhcyBrZXkiLCBtYXAua2V5U2V0KCkuY29udGFpbnMobnVsbCkpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJDb250YWlucyBlbnRyeSBLb2NoIGZvciBrZXkgbnVsbCIsICJLb2NoIiwgbWFwLmdldChudWxsKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9NYXBfX1doZW5Ob1ZhbHVlc0ZvcktleSgpIHsKKwkJTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCW5hbWVzLmFkZCgiTXVlbGxlciIpOworCQluYW1lcy5hZGQoIlNjaG5laWRlciIpOworCQluYW1lcy5hZGQoIlNjaG1pZHQiKTsKKwkJbmFtZXMuYWRkKCJLb2NoIik7CisJCUZ1bmN0aW9uMTxTdHJpbmcsIEJvb2xlYW4+IGNvbXB1dGVLZXlzID0gbmV3IEZ1bmN0aW9uMTxTdHJpbmcsIEJvb2xlYW4+KCkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBCb29sZWFuIGFwcGx5KFN0cmluZyBwKSB7CisJCQkJcmV0dXJuIHAuY29udGFpbnMoInkiKTsKKwkJCX0KKwkJfTsKKwkJTWFwPEJvb2xlYW4sIFN0cmluZz4gbWFwID0gSXRlcmF0b3JFeHRlbnNpb25zLnRvTWFwKG5hbWVzLml0ZXJhdG9yKCksIGNvbXB1dGVLZXlzKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiRXhwZWN0ZWQgZ3JvdXBlZCBtYXAgc2l6ZSIsIDEsIG1hcC5zaXplKCkpOworCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ29udGFpbnMgRkFMU0UgYXMga2V5IiwgbWFwLmtleVNldCgpLmNvbnRhaW5zKEJvb2xlYW4uRkFMU0UpKTsKKwkJQXNzZXJ0LmFzc2VydFRydWUoIkNvbnRhaW5zIGVudHJ5IE11ZWxsZXIgZm9yIGtleSBGQUxTRSIsIG1hcC5nZXQoQm9vbGVhbi5GQUxTRSkuZXF1YWxzKCJLb2NoIikpOworCQlBc3NlcnQuYXNzZXJ0TnVsbCgiQ29udGFpbnMgbm8gZW50cnkgZm9yIGtleSBCb29sZWFuLlRSVUUiLCBtYXAuZ2V0KEJvb2xlYW4uVFJVRSkpOworCX0KKworCUBUZXN0KGV4cGVjdGVkID0gTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgdGVzdFRvTWFwX19XaGVuRnVuY3Rpb25OdWxsKCkgeworCQlMaXN0PFBhaXI8SW50ZWdlciwgU3RyaW5nPj4gcGFpcnMgPSBuZXcgQXJyYXlMaXN0PFBhaXI8SW50ZWdlciwgU3RyaW5nPj4oKTsKKwkJRnVuY3Rpb24xPFBhaXI8SW50ZWdlciwgU3RyaW5nPiwgSW50ZWdlcj4gY29tcHV0ZUtleXMgPSBudWxsOworCQlJdGVyYXRvckV4dGVuc2lvbnMudG9NYXAocGFpcnMuaXRlcmF0b3IoKSwgY29tcHV0ZUtleXMpOworCX0JCisJCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R3JvdXBCeSgpIHsKKwkJTGlzdDxQYWlyPEludGVnZXIsIFN0cmluZz4+IHBhaXJzID0gbmV3IEFycmF5TGlzdDxQYWlyPEludGVnZXIsIFN0cmluZz4+KCk7CisJCXBhaXJzLmFkZChuZXcgUGFpcjxJbnRlZ2VyLCBTdHJpbmc+KDEsICJBIikpOworCQlwYWlycy5hZGQobmV3IFBhaXI8SW50ZWdlciwgU3RyaW5nPigxLCAiYSIpKTsKKwkJcGFpcnMuYWRkKG5ldyBQYWlyPEludGVnZXIsIFN0cmluZz4oMiwgIkIiKSk7CisJCXBhaXJzLmFkZChuZXcgUGFpcjxJbnRlZ2VyLCBTdHJpbmc+KDIsICJiIikpOworCQlGdW5jdGlvbjE8UGFpcjxJbnRlZ2VyLCBTdHJpbmc+LCBJbnRlZ2VyPiBjb21wdXRlS2V5cyA9IG5ldyBGdW5jdGlvbjE8UGFpcjxJbnRlZ2VyLCBTdHJpbmc+LCBJbnRlZ2VyPigpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSW50ZWdlciBhcHBseShQYWlyPEludGVnZXIsIFN0cmluZz4gcCkgeworCQkJCXJldHVybiBwLmdldEtleSgpOworCQkJfQorCQl9OworCQlNYXA8SW50ZWdlciwgTGlzdDxQYWlyPEludGVnZXIsIFN0cmluZz4+PiBtYXAgPSBJdGVyYXRvckV4dGVuc2lvbnMuZ3JvdXBCeShwYWlycy5pdGVyYXRvcigpLCBjb21wdXRlS2V5cyk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGdyb3VwZWQgbWFwIHNpemUiLCAyLCBtYXAuc2l6ZSgpKTsKKwkJQXNzZXJ0LmFzc2VydFRydWUoIkNvbnRhaW5zIDEgYXMga2V5IiwgbWFwLmtleVNldCgpLmNvbnRhaW5zKDEpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiQ29udGFpbnMgMiBlbnRyaWVzIGZvciBrZXkgMSIsIDIsIG1hcC5nZXQoMSkuc2l6ZSgpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiQ29udGFpbnMgZW50cnkgMS0+QSBmb3Iga2V5IDEiLCBuZXcgUGFpcjxJbnRlZ2VyLCBTdHJpbmc+KDEsICJBIiksIG1hcC5nZXQoMSkuZ2V0KDApKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiQ29udGFpbnMgZW50cnkgMS0+YSBmb3Iga2V5IDEiLCBuZXcgUGFpcjxJbnRlZ2VyLCBTdHJpbmc+KDEsICJhIiksIG1hcC5nZXQoMSkuZ2V0KDEpKTsKKwkJQXNzZXJ0LmFzc2VydFRydWUoIkNvbnRhaW5zIDIgYXMga2V5IiwgbWFwLmtleVNldCgpLmNvbnRhaW5zKDIpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiQ29udGFpbnMgMiBlbnRyaWVzIGZvciBrZXkgMiIsIDIsIG1hcC5nZXQoMikuc2l6ZSgpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiQ29udGFpbnMgZW50cnkgMi0+QiBmb3Iga2V5IDIiLCBuZXcgUGFpcjxJbnRlZ2VyLCBTdHJpbmc+KDIsICJCIiksIG1hcC5nZXQoMikuZ2V0KDApKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiQ29udGFpbnMgZW50cnkgMi0+YiBmb3Iga2V5IDIiLCBuZXcgUGFpcjxJbnRlZ2VyLCBTdHJpbmc+KDIsICJiIiksIG1hcC5nZXQoMikuZ2V0KDEpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHcm91cEJ5X19XaGVuRW1wdHlMaXN0KCkgeworCQlMaXN0PFBhaXI8SW50ZWdlciwgU3RyaW5nPj4gcGFpcnMgPSBuZXcgQXJyYXlMaXN0PFBhaXI8SW50ZWdlciwgU3RyaW5nPj4oKTsKKwkJRnVuY3Rpb24xPFBhaXI8SW50ZWdlciwgU3RyaW5nPiwgSW50ZWdlcj4gY29tcHV0ZUtleXMgPSBuZXcgRnVuY3Rpb24xPFBhaXI8SW50ZWdlciwgU3RyaW5nPiwgSW50ZWdlcj4oKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEludGVnZXIgYXBwbHkoUGFpcjxJbnRlZ2VyLCBTdHJpbmc+IHApIHsKKwkJCQlyZXR1cm4gcC5nZXRLZXkoKTsKKwkJCX0KKwkJfTsKKwkJTWFwPEludGVnZXIsIExpc3Q8UGFpcjxJbnRlZ2VyLCBTdHJpbmc+Pj4gbWFwID0gSXRlcmF0b3JFeHRlbnNpb25zLmdyb3VwQnkocGFpcnMuaXRlcmF0b3IoKSwgY29tcHV0ZUtleXMpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBncm91cGVkIG1hcCBzaXplIiwgMCwgbWFwLnNpemUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R3JvdXBCeV9fV2hlbkNhbGN1bGF0ZWRLZXlOdWxsKCkgeworCQlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJbmFtZXMuYWRkKCJNdWVsbGVyIik7CisJCW5hbWVzLmFkZCgiU2NobmVpZGVyIik7CisJCW5hbWVzLmFkZCgiU2NobWlkdCIpOworCQluYW1lcy5hZGQoIktvY2giKTsKKwkJRnVuY3Rpb24xPFN0cmluZywgU3RyaW5nPiBjb21wdXRlS2V5cyA9IG5ldyBGdW5jdGlvbjE8U3RyaW5nLCBTdHJpbmc+KCkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgYXBwbHkoU3RyaW5nIHApIHsKKwkJCQlyZXR1cm4gcC5jb250YWlucygieSIpID8gInkiIDogbnVsbDsKKwkJCX0KKwkJfTsKKwkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBtYXAgPSBJdGVyYXRvckV4dGVuc2lvbnMuZ3JvdXBCeShuYW1lcy5pdGVyYXRvcigpLCBjb21wdXRlS2V5cyk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGdyb3VwZWQgbWFwIHNpemUiLCAxLCBtYXAuc2l6ZSgpKTsKKwkJQXNzZXJ0LmFzc2VydFRydWUoIkNvbnRhaW5zIG51bGwgYXMga2V5IiwgbWFwLmtleVNldCgpLmNvbnRhaW5zKG51bGwpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiQ29udGFpbnMgNCBlbnRyaWVzIGZvciBrZXkgbnVsbCIsIDQsIG1hcC5nZXQobnVsbCkuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHcm91cEJ5X19XaGVuTm9WYWx1ZXNGb3JLZXkoKSB7CisJCUxpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQluYW1lcy5hZGQoIk11ZWxsZXIiKTsKKwkJbmFtZXMuYWRkKCJTY2huZWlkZXIiKTsKKwkJbmFtZXMuYWRkKCJTY2htaWR0Iik7CisJCW5hbWVzLmFkZCgiS29jaCIpOworCQlGdW5jdGlvbjE8U3RyaW5nLCBCb29sZWFuPiBjb21wdXRlS2V5cyA9IG5ldyBGdW5jdGlvbjE8U3RyaW5nLCBCb29sZWFuPigpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQm9vbGVhbiBhcHBseShTdHJpbmcgcCkgeworCQkJCXJldHVybiBwLmNvbnRhaW5zKCJ5Iik7CisJCQl9CisJCX07CisJCU1hcDxCb29sZWFuLCBMaXN0PFN0cmluZz4+IG1hcCA9IEl0ZXJhdG9yRXh0ZW5zaW9ucy5ncm91cEJ5KG5hbWVzLml0ZXJhdG9yKCksIGNvbXB1dGVLZXlzKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiRXhwZWN0ZWQgZ3JvdXBlZCBtYXAgc2l6ZSIsIDEsIG1hcC5zaXplKCkpOworCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ29udGFpbnMgRkFMU0UgYXMga2V5IiwgbWFwLmtleVNldCgpLmNvbnRhaW5zKEJvb2xlYW4uRkFMU0UpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiQ29udGFpbnMgNCBlbnRyaWVzIGZvciBrZXkgQm9vbGVhbi5GQUxTRSIsIDQsIG1hcC5nZXQoQm9vbGVhbi5GQUxTRSkuc2l6ZSgpKTsKKwkJQXNzZXJ0LmFzc2VydFRydWUoIkNvbnRhaW5zIGVudHJ5IE11ZWxsZXIgZm9yIGtleSBGQUxTRSIsIG1hcC5nZXQoQm9vbGVhbi5GQUxTRSkuY29udGFpbnMoIk11ZWxsZXIiKSk7CisJCUFzc2VydC5hc3NlcnROdWxsKCJDb250YWlucyBubyBlbnRyeSBmb3Iga2V5IEJvb2xlYW4uVFJVRSIsIG1hcC5nZXQoQm9vbGVhbi5UUlVFKSk7CisJfQorCisJQFRlc3QoZXhwZWN0ZWQgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0R3JvdXBCeV9fV2hlbkZ1bmN0aW9uTnVsbCgpIHsKKwkJTGlzdDxQYWlyPEludGVnZXIsIFN0cmluZz4+IHBhaXJzID0gbmV3IEFycmF5TGlzdDxQYWlyPEludGVnZXIsIFN0cmluZz4+KCk7CisJCUZ1bmN0aW9uMTxQYWlyPEludGVnZXIsIFN0cmluZz4sIEludGVnZXI+IGNvbXB1dGVLZXlzID0gbnVsbDsKKwkJSXRlcmF0b3JFeHRlbnNpb25zLmdyb3VwQnkocGFpcnMuaXRlcmF0b3IoKSwgY29tcHV0ZUtleXMpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZWplY3QoKSB7CisJCUZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPiBmdW5jdGlvbiA9IG5ldyBGdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBCb29sZWFuIGFwcGx5KEludGVnZXIgcCkgeworCQkJCXJldHVybiBwICUgMiA9PSAwOworCQkJfQorCQl9OworCQlhc3NlcnRFcXVhbHMobmV3QXJyYXlMaXN0KDEsMyw1KSxuZXdBcnJheUxpc3QoSXRlcmF0b3JFeHRlbnNpb25zLnJlamVjdChuZXdBcnJheUxpc3QoMSwyLDMsNCw1KS5pdGVyYXRvcigpLCBmdW5jdGlvbikpKTsKKwkJRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+IGZ1bmN0aW9uTnVsbFNhZmUgPSBuZXcgRnVuY3Rpb24xPEludGVnZXIsIEJvb2xlYW4+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQm9vbGVhbiBhcHBseShJbnRlZ2VyIHApIHsKKwkJCQlyZXR1cm4gcCA9PSBudWxsIHx8IHAgJSAyID09IDA7CisJCQl9CisJCX07CisJCWFzc2VydEVxdWFscyhuZXdBcnJheUxpc3QoMSw1KSxuZXdBcnJheUxpc3QoSXRlcmF0b3JFeHRlbnNpb25zLnJlamVjdChuZXdBcnJheUxpc3QoMSwyLG51bGwsNCw1KS5pdGVyYXRvcigpLCBmdW5jdGlvbk51bGxTYWZlKSkpOworCQl0cnkgeworCQkJbmV3QXJyYXlMaXN0KEl0ZXJhdG9yRXh0ZW5zaW9ucy5yZWplY3QobnVsbCwgZnVuY3Rpb24pKTsKKwkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIik7CisJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGV4cGVjdGVkIE5QRQorCQl9CisJCXRyeSB7CisJCQluZXdBcnJheUxpc3QoSXRlcmF0b3JFeHRlbnNpb25zLnJlamVjdChuZXdBcnJheUxpc3QoMSwyLDMpLml0ZXJhdG9yKCksIG51bGwpKTsKKwkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIik7CisJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGV4cGVjdGVkIE5QRQorCQl9CisJCUZ1bmN0aW9uMTxJbnRlZ2VyLCBCb29sZWFuPiBicm9rZW5GdW5jdGlvbiA9IG5ldyBGdW5jdGlvbjE8SW50ZWdlciwgQm9vbGVhbj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBCb29sZWFuIGFwcGx5KEludGVnZXIgcCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9OworCQl0cnkgeworCQkJbmV3QXJyYXlMaXN0KEl0ZXJhdG9yRXh0ZW5zaW9ucy5yZWplY3QobmV3QXJyYXlMaXN0KDEsMiwzKS5pdGVyYXRvcigpLCBicm9rZW5GdW5jdGlvbikpOworCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKwkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworCQkJLy8gZXhwZWN0ZWQgTlBFCisJCX0KKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TWFwICgpIHsKKwkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ld0FycmF5TGlzdCgiZm9vIiwgImJhciIpOworCQkKKwkJZmluYWwgRnVuY3Rpb25zLkZ1bmN0aW9uMTxTdHJpbmcsIFN0cmluZz4gZnVuY3Rpb24gPSBuZXcgRnVuY3Rpb25zLkZ1bmN0aW9uMTxTdHJpbmcsIFN0cmluZz4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgYXBwbHkoU3RyaW5nIHApIHsKKwkJCQlyZXR1cm4gIkhlbGxvICIrcDsKKwkJCX0KKwkJfTsKKwkJCisJCWFzc2VydEVxdWFscyhuZXdBcnJheUxpc3QoIkhlbGxvIGZvbyIsICJIZWxsbyBiYXIiKSwgbmV3QXJyYXlMaXN0KEl0ZXJhdG9yRXh0ZW5zaW9ucy5tYXAobGlzdC5pdGVyYXRvcigpLCBmdW5jdGlvbikpKTsKKworCQorCQkvLyB0ZXN0IHRoYXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yIHN1cHBvcnRzIHJlbW92ZSBvbiB0aGUgdW5kZXJ5bGluZyBsaXN0CisJCS8vIHRoZXJlZm9yZSB3ZSBuZWVkIGEgZnVuY3Rpb24gdGhhdCBtYXBzIHRvIHRoZSBzYW1lIG9iamVjdCBjb250YWluZWQgaW4gdGhlIGxpc3QKKwkJZmluYWwgRnVuY3Rpb25zLkZ1bmN0aW9uMTxTdHJpbmcsIFN0cmluZz4gZnVuY3Rpb25Gb3JSZW1vdmUgPSBuZXcgRnVuY3Rpb25zLkZ1bmN0aW9uMTxTdHJpbmcsIFN0cmluZz4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgYXBwbHkoU3RyaW5nIHApIHsKKwkJCQlyZXR1cm4gImZvbyIuZXF1YWxzKHApID8gcCA6ICJIZWxsbyAiK3A7CisJCQl9CisJCX07CisKKwkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJmb28iKSk7CisJCWFzc2VydEVxdWFscygyLCBsaXN0LnNpemUoKSk7CisJCWFzc2VydEVxdWFscyhuZXdBcnJheUxpc3QoImZvbyIsICJIZWxsbyBiYXIiKSwgbmV3QXJyYXlMaXN0KEl0ZXJhdG9yRXh0ZW5zaW9ucy5tYXAobGlzdC5pdGVyYXRvcigpLCBmdW5jdGlvbkZvclJlbW92ZSkpKTsKKwkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEl0ZXJhdG9yRXh0ZW5zaW9ucy5tYXAobGlzdC5pdGVyYXRvcigpLCBmdW5jdGlvbkZvclJlbW92ZSk7CisJCWl0ZXJhdG9yLm5leHQoKTsKKwkJaXRlcmF0b3IucmVtb3ZlKCk7CisJCQorCQlhc3NlcnRUcnVlKCFsaXN0LmNvbnRhaW5zKCJmb28iKSk7CisJCWFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEZsYXRNYXAgKCkgeworCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3QXJyYXlMaXN0KCJmb28iLCAiYmFyIik7CisJCQorCQlmaW5hbCBGdW5jdGlvbnMuRnVuY3Rpb24xPFN0cmluZywgSXRlcmF0b3I8U3RyaW5nPj4gZnVuY3Rpb24gPSBuZXcgRnVuY3Rpb25zLkZ1bmN0aW9uMTxTdHJpbmcsIEl0ZXJhdG9yPFN0cmluZz4+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhcHBseShTdHJpbmcgcCkgeworCQkJCXJldHVybiBuZXdBcnJheUxpc3QoIkhlbGxvIiwgcCkuaXRlcmF0b3IoKTsKKwkJCX0KKwkJfTsKKwkJYXNzZXJ0RXF1YWxzKG5ld0FycmF5TGlzdCgiSGVsbG8iLCAiZm9vIiwgIkhlbGxvIiwgImJhciIpLCBuZXdBcnJheUxpc3QoSXRlcmF0b3JFeHRlbnNpb25zLmZsYXRNYXAobGlzdC5pdGVyYXRvcigpLCBmdW5jdGlvbikpKTsKKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zKCkgeworCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3QXJyYXlMaXN0KCJlbGVtZW50MSIsICJlbGVtZW50MiIsICJlbGVtZW50MyIsIG51bGwpOworCQkKKwkJYXNzZXJ0VHJ1ZShJdGVyYXRvckV4dGVuc2lvbnMuY29udGFpbnMobGlzdC5pdGVyYXRvcigpLCAiZWxlbWVudDMiKSk7CisJCWFzc2VydFRydWUoSXRlcmF0b3JFeHRlbnNpb25zLmNvbnRhaW5zKGxpc3QuaXRlcmF0b3IoKSwgbmV3IFN0cmluZygiZWxlbWVudDMiKSkpOworCQkKKwkJYXNzZXJ0VHJ1ZShJdGVyYXRvckV4dGVuc2lvbnMuY29udGFpbnMobGlzdC5pdGVyYXRvcigpLCBudWxsKSk7CisJCQorCQlhc3NlcnRGYWxzZShJdGVyYXRvckV4dGVuc2lvbnMuY29udGFpbnMobGlzdC5pdGVyYXRvcigpLCAiZWxlbWVudDQiKSk7CisJCWFzc2VydEZhbHNlKEl0ZXJhdG9yRXh0ZW5zaW9ucy5jb250YWlucyhsaXN0Lml0ZXJhdG9yKCksIG5ldyBTdHJpbmcoImVsZW1lbnQ0IikpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL01hcEV4dGVuc2lvbnNUZXN0LmphdmEgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL01hcEV4dGVuc2lvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5MTc5NAotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvTWFwRXh0ZW5zaW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDQ3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNyBVbml2ZXJzaXRlIGRlIFRlY2hub2xvZ2llIGRlIEJlbGZvcnQtTW9udGJlbGlhcmQgKGh0dHA6Ly93d3cudXRibS5mcikgYW5kIG90aGVycy4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UudGVzdHMubGliOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5NYXBFeHRlbnNpb25zLio7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QudGVzdGluZy5NYXBUZXN0U3VpdGVCdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QudGVzdGluZy5UZXN0U3RyaW5nTWFwR2VuZXJhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QudGVzdGluZy5mZWF0dXJlcy5Db2xsZWN0aW9uRmVhdHVyZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LnRlc3RpbmcuZmVhdHVyZXMuQ29sbGVjdGlvblNpemU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC50ZXN0aW5nLmZlYXR1cmVzLk1hcEZlYXR1cmU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUGFpcjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGUuU3VpdGVDbGFzc2VzOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLmludGVybmFsLlVubW9kaWZpYWJsZU1lcmdpbmdNYXBWaWV3OworCisvKioKKyAqIEBhdXRob3IgU3RlcGhhbmUgR2FsbGFuZCAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqIEBzaW5jZSAyLjE1CisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorQFJ1bldpdGgoU3VpdGUuY2xhc3MpCitAU3VpdGVDbGFzc2VzKHsKKwlNYXBFeHRlbnNpb25zVGVzdC5NYW51YWxUZXN0LmNsYXNzLAorCU1hcEV4dGVuc2lvbnNUZXN0Lkd1YXZhVGVzdC5jbGFzcywKK30pCitwdWJsaWMgY2xhc3MgTWFwRXh0ZW5zaW9uc1Rlc3QgeworCisJcHVibGljIHN0YXRpYyBjbGFzcyBHdWF2YVRlc3QgeworCQlwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHsKKwkJCXJldHVybiBNYXBUZXN0U3VpdGVCdWlsZGVyCisJCQkJCS8vIFRoZSBjcmVhdGUgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGFuIGFycmF5IG9mIGVsZW1lbnRzCisJCQkJCS8vIHRoYXQgc2hvdWxkIHBvcHVsYXRlIHRoZSBjb2xsZWN0aW9uLgorCQkJCQkudXNpbmcobmV3IFRlc3RTdHJpbmdNYXBHZW5lcmF0b3IoKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGNyZWF0ZShFbnRyeTxTdHJpbmcsIFN0cmluZz5bXSBzb3VyY2UpIHsKKwkJCQkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGxlZnQgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKwkJCQkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHJpZ2h0ID0gTWFwcy5uZXdIYXNoTWFwKCk7CisJCQkJCQkJZm9yKGludCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgeworCQkJCQkJCQlFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBzb3VyY2VbaV07CisJCQkJCQkJCWlmIChyaWdodC5jb250YWluc0tleShlbnRyeS5nZXRLZXkoKSkpIHsKKwkJCQkJCQkJCWxlZnQucHV0KGVudHJ5LmdldEtleSgpLCByaWdodC5nZXQoZW50cnkuZ2V0S2V5KCkpKTsKKwkJCQkJCQkJCXJpZ2h0LnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCQkJCQkJCX0gZWxzZSBpZiAoaSAlIDIgIT0gMCkgeworCQkJCQkJCQkJbGVmdC5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwkKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXJpZ2h0LnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCQkJCQkJCQlpZiAoaSAlIDQgIT0gMCkgeworCQkJCQkJCQkJCWxlZnQucHV0KGVudHJ5LmdldEtleSgpLCAid2lsbCBiZSBpZ25vcmVkIik7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVNZXJnaW5nTWFwVmlldyhsZWZ0LCByaWdodCk7CisJCQkJCQl9CisJCQkJCX0pLm5hbWVkKCJHdWF2YS1iYXNlZCBVbm1vZGlmaWFibGVNZXJnaW5nTWFwVmlldyB0ZXN0cyIpCisJCQkJCS53aXRoRmVhdHVyZXMoCisJCQkJCQkJTWFwRmVhdHVyZS5BTExPV1NfTlVMTF9LRVlTLAorCQkJCQkJCU1hcEZlYXR1cmUuQUxMT1dTX05VTExfVkFMVUVTLAorCQkJCQkJCU1hcEZlYXR1cmUuQUxMT1dTX0FOWV9OVUxMX1FVRVJJRVMsCisJCQkJCQkJTWFwRmVhdHVyZS5GQUlMU19GQVNUX09OX0NPTkNVUlJFTlRfTU9ESUZJQ0FUSU9OLAorCQkJCQkJCUNvbGxlY3Rpb25GZWF0dXJlLkFMTE9XU19OVUxMX1FVRVJJRVMsCisJCQkJCQkJQ29sbGVjdGlvbkZlYXR1cmUuRkFJTFNfRkFTVF9PTl9DT05DVVJSRU5UX01PRElGSUNBVElPTiwKKwkJCQkJCQlDb2xsZWN0aW9uU2l6ZS5BTlkpCisJCQkJCS5jcmVhdGVUZXN0U3VpdGUoKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTWFudWFsVGVzdCB7CisKKwkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcDsKKwkJcHJpdmF0ZSBTdHJpbmcga2V5MTsKKwkJcHJpdmF0ZSBTdHJpbmcga2V5MjsKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWUxOworCQlwcml2YXRlIFN0cmluZyB2YWx1ZTI7CisJCisJCUBCZWZvcmUKKwkJcHVibGljIHZvaWQgc2V0VXAoKSB7CisJCQl0aGlzLm1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQkJdGhpcy5rZXkxID0gImsxIjsgLy8kTk9OLU5MUy0xJAorCQkJdGhpcy5rZXkyID0gImsyIjsgLy8kTk9OLU5MUy0xJAorCQkJdGhpcy52YWx1ZTEgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCQkJdGhpcy52YWx1ZTIgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCQkJdGhpcy5tYXAucHV0KHRoaXMua2V5MSwgdGhpcy52YWx1ZTEpOworCQkJdGhpcy5tYXAucHV0KHRoaXMua2V5MiwgdGhpcy52YWx1ZTIpOworCQl9CisJCisJCUBBZnRlcgorCQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKwkJCXRoaXMua2V5MSA9IHRoaXMudmFsdWUxID0gbnVsbDsKKwkJCXRoaXMua2V5MiA9IHRoaXMudmFsdWUyID0gbnVsbDsKKwkJCXRoaXMubWFwID0gbnVsbDsKKwkJfQorCQorCQlAVGVzdAorCQlwdWJsaWMgdm9pZCBvcGVyYXRvcl9hZGRfTWFwUGFpcl8wKCkgeworCQkJU3RyaW5nIHYgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCQkJU3RyaW5nIG87CisJCisJCQlvID0gb3BlcmF0b3JfYWRkKHRoaXMubWFwLCBuZXcgUGFpcjxTdHJpbmcsIFN0cmluZz4oImszIiwgdikpOworCQkJYXNzZXJ0TnVsbChvKTsKKwkJCWFzc2VydEVxdWFscygzLCB0aGlzLm1hcC5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUxLCB0aGlzLm1hcC5nZXQoImsxIikpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUyLCB0aGlzLm1hcC5nZXQoImsyIikpOworCQkJYXNzZXJ0RXF1YWxzKHYsIHRoaXMubWFwLmdldCgiazMiKSk7CisJCX0KKwkKKwkJQFRlc3QKKwkJcHVibGljIHZvaWQgb3BlcmF0b3JfYWRkX01hcFBhaXJfMSgpIHsKKwkJCVN0cmluZyB2ID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJCVN0cmluZyBvOworCQorCQkJbyA9IG9wZXJhdG9yX2FkZCh0aGlzLm1hcCwgbmV3IFBhaXI8U3RyaW5nLCBTdHJpbmc+KCJrMiIsIHYpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMiwgbyk7CisJCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5tYXAuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMSwgdGhpcy5tYXAuZ2V0KCJrMSIpKTsKKwkJCWFzc2VydEVxdWFscyh2LCB0aGlzLm1hcC5nZXQoImsyIikpOworCQl9CisJCisJCUBUZXN0CisJCXB1YmxpYyB2b2lkIG9wZXJhdG9yX3JlbW92ZV9NYXBQYWlyXzAoKSB7CisJCQlTdHJpbmcgdiA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisJCQlib29sZWFuIG87CisJCisJCQlvID0gb3BlcmF0b3JfcmVtb3ZlKHRoaXMubWFwLCBuZXcgUGFpcjxTdHJpbmcsIFN0cmluZz4oImszIiwgdikpOworCQkJYXNzZXJ0RmFsc2Uobyk7CisJCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5tYXAuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMSwgdGhpcy5tYXAuZ2V0KCJrMSIpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMiwgdGhpcy5tYXAuZ2V0KCJrMiIpKTsKKwkJfQorCQorCQlAVGVzdAorCQlwdWJsaWMgdm9pZCBvcGVyYXRvcl9yZW1vdmVfTWFwUGFpcl8xKCkgeworCQkJU3RyaW5nIHYgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCQkJYm9vbGVhbiBvOworCQorCQkJbyA9IG9wZXJhdG9yX3JlbW92ZSh0aGlzLm1hcCwgbmV3IFBhaXI8U3RyaW5nLCBTdHJpbmc+KCJrMiIsIHYpKTsKKwkJCWFzc2VydEZhbHNlKG8pOworCQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMubWFwLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTEsIHRoaXMubWFwLmdldCgiazEiKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTIsIHRoaXMubWFwLmdldCgiazIiKSk7CisJCX0KKwkKKwkJQFRlc3QKKwkJcHVibGljIHZvaWQgb3BlcmF0b3JfcmVtb3ZlX01hcFBhaXJfMigpIHsKKwkJCVN0cmluZyB2ID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJCWJvb2xlYW4gbzsKKwkKKwkJCW8gPSBvcGVyYXRvcl9yZW1vdmUodGhpcy5tYXAsIG5ldyBQYWlyPFN0cmluZywgU3RyaW5nPigiazIiLCBuZXcgU3RyaW5nKHRoaXMudmFsdWUyKSkpOworCQkJYXNzZXJ0VHJ1ZShvKTsKKwkJCWFzc2VydEVxdWFscygxLCB0aGlzLm1hcC5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUxLCB0aGlzLm1hcC5nZXQoImsxIikpOworCQkJYXNzZXJ0TnVsbCh0aGlzLm1hcC5nZXQoImsyIikpOworCQl9CisJCisJCUBUZXN0CisJCXB1YmxpYyB2b2lkIG9wZXJhdG9yX3BsdXNfTWFwUGFpcl8wKCkgeworCQkJU3RyaW5nIHYgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCQkJTWFwPFN0cmluZywgU3RyaW5nPiBvOworCQorCQkJbyA9IG9wZXJhdG9yX3BsdXModGhpcy5tYXAsIG5ldyBQYWlyPFN0cmluZywgU3RyaW5nPigiazMiLCB2KSk7CisJCQlhc3NlcnROb3ROdWxsKG8pOworCQkJYXNzZXJ0Tm90U2FtZSh0aGlzLm1hcCwgbyk7CisJCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5tYXAuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMSwgdGhpcy5tYXAuZ2V0KCJrMSIpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMiwgdGhpcy5tYXAuZ2V0KCJrMiIpKTsKKwkJCWFzc2VydEVxdWFscygzLCBvLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTEsIG8uZ2V0KCJrMSIpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMiwgby5nZXQoImsyIikpOworCQkJYXNzZXJ0RXF1YWxzKHYsIG8uZ2V0KCJrMyIpKTsKKwkJfQorCQorCQlAVGVzdAorCQlwdWJsaWMgdm9pZCBvcGVyYXRvcl9wbHVzX01hcFBhaXJfMSgpIHsKKwkJCVN0cmluZyB2ID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz4gbyA9IG9wZXJhdG9yX3BsdXModGhpcy5tYXAsIG5ldyBQYWlyPFN0cmluZywgU3RyaW5nPigiazIiLCB2KSk7CisJCQlhc3NlcnROb3ROdWxsKG8pOworCQkJYXNzZXJ0Tm90U2FtZSh0aGlzLm1hcCwgbyk7CisJCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5tYXAuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMSwgdGhpcy5tYXAuZ2V0KCJrMSIpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMiwgdGhpcy5tYXAuZ2V0KCJrMiIpKTsKKwkJCWFzc2VydE51bGwodGhpcy5tYXAuZ2V0KCJrMyIpKTsKKwkJCWFzc2VydEVxdWFscygyLCBvLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTEsIG8uZ2V0KCJrMSIpKTsKKwkJCWFzc2VydEVxdWFscyh2LCBvLmdldCgiazIiKSk7CisJCQlhc3NlcnROdWxsKG8uZ2V0KCJrMyIpKTsKKwkJfQorCQorCQlAVGVzdAorCQlwdWJsaWMgdm9pZCBvcGVyYXRvcl9taW51c19NYXBQYWlyXzAoKSB7CisJCQlTdHJpbmcgdiA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG87CisJCisJCQlvID0gb3BlcmF0b3JfbWludXModGhpcy5tYXAsIG5ldyBQYWlyPFN0cmluZywgU3RyaW5nPigiazMiLCB2KSk7CisJCisJCQlhc3NlcnROb3ROdWxsKG8pOworCQkJYXNzZXJ0Tm90U2FtZSh0aGlzLm1hcCwgbyk7CisJCQkKKwkJCWFzc2VydEVxdWFscygyLCB0aGlzLm1hcC5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUxLCB0aGlzLm1hcC5nZXQoImsxIikpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUyLCB0aGlzLm1hcC5nZXQoImsyIikpOworCQkJYXNzZXJ0TnVsbCh0aGlzLm1hcC5nZXQoImszIikpOworCQkJCisJCQlhc3NlcnRFcXVhbHMoMiwgby5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUxLCBvLmdldCgiazEiKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTIsIG8uZ2V0KCJrMiIpKTsKKwkJCWFzc2VydE51bGwoby5nZXQoImszIikpOworCQl9CisJCisJCUBUZXN0CisJCXB1YmxpYyB2b2lkIG9wZXJhdG9yX21pbnVzX01hcFBhaXJfMSgpIHsKKwkJCVN0cmluZyB2ID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz4gbyA9IG9wZXJhdG9yX21pbnVzKHRoaXMubWFwLCBuZXcgUGFpcjxTdHJpbmcsIFN0cmluZz4oImsyIiwgdikpOworCQkJCisJCQlhc3NlcnROb3ROdWxsKG8pOworCQkJYXNzZXJ0Tm90U2FtZSh0aGlzLm1hcCwgbyk7CisJCQkKKwkJCWFzc2VydEVxdWFscygyLCB0aGlzLm1hcC5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUxLCB0aGlzLm1hcC5nZXQoImsxIikpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUyLCB0aGlzLm1hcC5nZXQoImsyIikpOworCQkJYXNzZXJ0TnVsbCh0aGlzLm1hcC5nZXQoImszIikpOworCQkJCisJCQlhc3NlcnRFcXVhbHMoMiwgby5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUxLCBvLmdldCgiazEiKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTIsIG8uZ2V0KCJrMiIpKTsKKwkJCWFzc2VydE51bGwoby5nZXQoImszIikpOworCQl9CisJCisJCUBUZXN0CisJCXB1YmxpYyB2b2lkIG9wZXJhdG9yX21pbnVzX01hcFBhaXJfMigpIHsKKwkJCVN0cmluZyB2ID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz4gbyA9IG9wZXJhdG9yX21pbnVzKHRoaXMubWFwLCBuZXcgUGFpcjxTdHJpbmcsIFN0cmluZz4oImsyIiwgbmV3IFN0cmluZyh0aGlzLnZhbHVlMikpKTsKKwkJCQorCQkJYXNzZXJ0Tm90TnVsbChvKTsKKwkJCWFzc2VydE5vdFNhbWUodGhpcy5tYXAsIG8pOworCQkJCisJCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5tYXAuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMSwgdGhpcy5tYXAuZ2V0KCJrMSIpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMiwgdGhpcy5tYXAuZ2V0KCJrMiIpKTsKKwkJCWFzc2VydE51bGwodGhpcy5tYXAuZ2V0KCJrMyIpKTsKKwkJCQorCQkJYXNzZXJ0RXF1YWxzKDEsIG8uc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMSwgby5nZXQoImsxIikpOworCQkJYXNzZXJ0TnVsbChvLmdldCgiazIiKSk7CisJCQlhc3NlcnROdWxsKG8uZ2V0KCJrMyIpKTsKKwkJfQorCQorCQlAVGVzdAorCQlwdWJsaWMgdm9pZCBvcGVyYXRvcl9wbHVzX01hcE1hcF8wKCkgeworCQkJU3RyaW5nIHYxID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJCVN0cmluZyB2MiA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisJCQlTdHJpbmcgdjMgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCQkJTWFwPFN0cmluZywgU3RyaW5nPiBvOworCQorCQkJTWFwPFN0cmluZywgU3RyaW5nPiB0bXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJCXRtcC5wdXQoImszIiwgdjEpOworCQkJdG1wLnB1dCgiazQiLCB2Mik7CisJCQl0bXAucHV0KCJrNSIsIHYzKTsKKwkKKwkJCW8gPSBvcGVyYXRvcl9wbHVzKHRoaXMubWFwLCB0bXApOworCQkJYXNzZXJ0Tm90TnVsbChvKTsKKwkJCWFzc2VydE5vdFNhbWUodGhpcy5tYXAsIG8pOworCQkJYXNzZXJ0Tm90U2FtZSh0bXAsIG8pOworCQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMubWFwLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTEsIHRoaXMubWFwLmdldCgiazEiKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTIsIHRoaXMubWFwLmdldCgiazIiKSk7CisJCQlhc3NlcnRFcXVhbHMoMywgdG1wLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHModjEsIHRtcC5nZXQoImszIikpOworCQkJYXNzZXJ0RXF1YWxzKHYyLCB0bXAuZ2V0KCJrNCIpKTsKKwkJCWFzc2VydEVxdWFscyh2MywgdG1wLmdldCgiazUiKSk7CisJCQlhc3NlcnRFcXVhbHMoNSwgby5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUxLCBvLmdldCgiazEiKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTIsIG8uZ2V0KCJrMiIpKTsKKwkJCWFzc2VydEVxdWFscyh2MSwgby5nZXQoImszIikpOworCQkJYXNzZXJ0RXF1YWxzKHYyLCBvLmdldCgiazQiKSk7CisJCQlhc3NlcnRFcXVhbHModjMsIG8uZ2V0KCJrNSIpKTsKKwkJfQorCQorCQlAVGVzdAorCQlwdWJsaWMgdm9pZCBvcGVyYXRvcl9wbHVzX01hcE1hcF8xKCkgeworCQkJU3RyaW5nIHYxID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJCVN0cmluZyB2MiA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisJCQlTdHJpbmcgdjMgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCQkJTWFwPFN0cmluZywgU3RyaW5nPiBvOworCQorCQkJTWFwPFN0cmluZywgU3RyaW5nPiB0bXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJCXRtcC5wdXQoImszIiwgdjEpOworCQkJdG1wLnB1dCgiazQiLCB2Mik7CisJCQl0bXAucHV0KCJrNSIsIHYzKTsKKwkKKwkJCW8gPSBvcGVyYXRvcl9wbHVzKHRtcCwgdGhpcy5tYXApOworCQkJYXNzZXJ0Tm90TnVsbChvKTsKKwkJCWFzc2VydE5vdFNhbWUodGhpcy5tYXAsIG8pOworCQkJYXNzZXJ0Tm90U2FtZSh0bXAsIG8pOworCQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMubWFwLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTEsIHRoaXMubWFwLmdldCgiazEiKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTIsIHRoaXMubWFwLmdldCgiazIiKSk7CisJCQlhc3NlcnRFcXVhbHMoMywgdG1wLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHModjEsIHRtcC5nZXQoImszIikpOworCQkJYXNzZXJ0RXF1YWxzKHYyLCB0bXAuZ2V0KCJrNCIpKTsKKwkJCWFzc2VydEVxdWFscyh2MywgdG1wLmdldCgiazUiKSk7CisJCQlhc3NlcnRFcXVhbHMoNSwgby5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUxLCBvLmdldCgiazEiKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTIsIG8uZ2V0KCJrMiIpKTsKKwkJCWFzc2VydEVxdWFscyh2MSwgby5nZXQoImszIikpOworCQkJYXNzZXJ0RXF1YWxzKHYyLCBvLmdldCgiazQiKSk7CisJCQlhc3NlcnRFcXVhbHModjMsIG8uZ2V0KCJrNSIpKTsKKwkJfQorCQorCQlAVGVzdAorCQlwdWJsaWMgdm9pZCBvcGVyYXRvcl9wbHVzX01hcE1hcF8yKCkgeworCQkJU3RyaW5nIHYxID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJCVN0cmluZyB2MiA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisJCQlTdHJpbmcgdjMgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCQkJTWFwPFN0cmluZywgU3RyaW5nPiBvOworCQorCQkJTWFwPFN0cmluZywgU3RyaW5nPiB0bXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJCXRtcC5wdXQoImszIiwgdjEpOworCQkJdG1wLnB1dCgiazEiLCB2Mik7CisJCQl0bXAucHV0KCJrNSIsIHYzKTsKKwkKKwkJCW8gPSBvcGVyYXRvcl9wbHVzKHRoaXMubWFwLCB0bXApOworCQkJYXNzZXJ0Tm90TnVsbChvKTsKKwkJCWFzc2VydEVxdWFscyg0LCBvLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHModjIsIG8uZ2V0KCJrMSIpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMiwgby5nZXQoImsyIikpOworCQkJYXNzZXJ0RXF1YWxzKHYxLCBvLmdldCgiazMiKSk7CisJCQlhc3NlcnROdWxsKG8uZ2V0KCJrNCIpKTsKKwkJCWFzc2VydEVxdWFscyh2Mywgby5nZXQoIms1IikpOworCQl9CisJCisJCUBUZXN0CisJCXB1YmxpYyB2b2lkIG9wZXJhdG9yX3BsdXNfTWFwTWFwXzMoKSB7CisJCQlTdHJpbmcgdjEgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCQkJU3RyaW5nIHYyID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJCVN0cmluZyB2MyA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG87CisJCisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHRtcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQkJdG1wLnB1dCgiazMiLCB2MSk7CisJCQl0bXAucHV0KCJrMSIsIHYyKTsKKwkJCXRtcC5wdXQoIms1IiwgdjMpOworCQorCQkJbyA9IG9wZXJhdG9yX3BsdXModG1wLCB0aGlzLm1hcCk7CisJCQlhc3NlcnROb3ROdWxsKG8pOworCQkJYXNzZXJ0RXF1YWxzKDQsIG8uc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMSwgby5nZXQoImsxIikpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUyLCBvLmdldCgiazIiKSk7CisJCQlhc3NlcnRFcXVhbHModjEsIG8uZ2V0KCJrMyIpKTsKKwkJCWFzc2VydE51bGwoby5nZXQoIms0IikpOworCQkJYXNzZXJ0RXF1YWxzKHYzLCBvLmdldCgiazUiKSk7CisJCX0KKwkKKwkJQFRlc3QKKwkJcHVibGljIHZvaWQgb3BlcmF0b3JfcmVtb3ZlX01hcEtfMCgpIHsKKwkJCVN0cmluZyBvID0gb3BlcmF0b3JfcmVtb3ZlKHRoaXMubWFwLCAiazAiKTsKKwkJCWFzc2VydEVxdWFscygyLCB0aGlzLm1hcC5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUxLCB0aGlzLm1hcC5nZXQoImsxIikpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUyLCB0aGlzLm1hcC5nZXQoImsyIikpOworCQkJYXNzZXJ0TnVsbChvKTsKKwkJfQorCQorCQlAVGVzdAorCQlwdWJsaWMgdm9pZCBvcGVyYXRvcl9yZW1vdmVfTWFwS18xKCkgeworCQkJU3RyaW5nIG8gPSBvcGVyYXRvcl9yZW1vdmUodGhpcy5tYXAsICJrMSIpOworCQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMubWFwLnNpemUoKSk7CisJCQlhc3NlcnROdWxsKHRoaXMubWFwLmdldCgiazEiKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTIsIHRoaXMubWFwLmdldCgiazIiKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTEsIG8pOworCQl9CisJCisJCUBUZXN0CisJCXB1YmxpYyB2b2lkIG9wZXJhdG9yX3JlbW92ZV9NYXBLXzIoKSB7CisJCQlTdHJpbmcgbyA9IG9wZXJhdG9yX3JlbW92ZSh0aGlzLm1hcCwgImsyIik7CisJCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5tYXAuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMSwgdGhpcy5tYXAuZ2V0KCJrMSIpKTsKKwkJCWFzc2VydE51bGwodGhpcy5tYXAuZ2V0KCJrMiIpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMiwgbyk7CisJCX0KKwkKKwkJQFRlc3QKKwkJcHVibGljIHZvaWQgb3BlcmF0b3JfcmVtb3ZlX01hcEtfMygpIHsKKwkJCVN0cmluZyBvMSA9IG9wZXJhdG9yX3JlbW92ZSh0aGlzLm1hcCwgImsyIik7CisJCQlTdHJpbmcgbzIgPSBvcGVyYXRvcl9yZW1vdmUodGhpcy5tYXAsICJrMSIpOworCQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubWFwLnNpemUoKSk7CisJCQlhc3NlcnROdWxsKHRoaXMubWFwLmdldCgiazEiKSk7CisJCQlhc3NlcnROdWxsKHRoaXMubWFwLmdldCgiazIiKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTIsIG8xKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMSwgbzIpOworCQl9CisJCisJCUBUZXN0CisJCXB1YmxpYyB2b2lkIG9wZXJhdG9yX3JlbW92ZV9NYXBJdGVyYWJsZSgpIHsKKwkJCUxpc3Q8U3RyaW5nPiBtID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQltLmFkZCgiazAiKTsKKwkJCW0uYWRkKCJrMSIpOworCQkJb3BlcmF0b3JfcmVtb3ZlKHRoaXMubWFwLCBtKTsKKwkJCWFzc2VydEVxdWFscygxLCB0aGlzLm1hcC5zaXplKCkpOworCQkJYXNzZXJ0TnVsbCh0aGlzLm1hcC5nZXQoImsxIikpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUyLCB0aGlzLm1hcC5nZXQoImsyIikpOworCQl9CisJCisJCUBUZXN0CisJCXB1YmxpYyB2b2lkIG9wZXJhdG9yX21pbnVzX01hcEtfMCgpIHsKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz4gbyA9IG9wZXJhdG9yX21pbnVzKHRoaXMubWFwLCAiazAiKTsKKwkJCWFzc2VydEVxdWFscygyLCB0aGlzLm1hcC5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUxLCB0aGlzLm1hcC5nZXQoImsxIikpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUyLCB0aGlzLm1hcC5nZXQoImsyIikpOworCQkJYXNzZXJ0Tm90TnVsbChvKTsKKwkJCWFzc2VydE5vdFNhbWUodGhpcy5tYXAsIG8pOworCQkJYXNzZXJ0RXF1YWxzKDIsIG8uc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMSwgby5nZXQoImsxIikpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUyLCBvLmdldCgiazIiKSk7CisJCX0KKwkKKwkJQFRlc3QKKwkJcHVibGljIHZvaWQgb3BlcmF0b3JfbWludXNfTWFwS18xKCkgeworCQkJTWFwPFN0cmluZywgU3RyaW5nPiBvID0gb3BlcmF0b3JfbWludXModGhpcy5tYXAsICJrMiIpOworCQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMubWFwLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTEsIHRoaXMubWFwLmdldCgiazEiKSk7CisJCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZTIsIHRoaXMubWFwLmdldCgiazIiKSk7CisJCQlhc3NlcnROb3ROdWxsKG8pOworCQkJYXNzZXJ0Tm90U2FtZSh0aGlzLm1hcCwgbyk7CisJCQlhc3NlcnRFcXVhbHMoMSwgby5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUxLCBvLmdldCgiazEiKSk7CisJCQlhc3NlcnROdWxsKG8uZ2V0KCJrMiIpKTsKKwkJfQorCQorCQlAVGVzdAorCQlwdWJsaWMgdm9pZCBvcGVyYXRvcl9taW51c19NYXBLXzIoKSB7CisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG8xID0gb3BlcmF0b3JfbWludXModGhpcy5tYXAsICJrMiIpOworCQkJTWFwPFN0cmluZywgU3RyaW5nPiBvMiA9IG9wZXJhdG9yX21pbnVzKG8xLCAiazEiKTsKKwkJCWFzc2VydEVxdWFscygyLCB0aGlzLm1hcC5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUxLCB0aGlzLm1hcC5nZXQoImsxIikpOworCQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUyLCB0aGlzLm1hcC5nZXQoImsyIikpOworCQkJYXNzZXJ0Tm90TnVsbChvMSk7CisJCQlhc3NlcnROb3RTYW1lKHRoaXMubWFwLCBvMSk7CisJCQlhc3NlcnRFcXVhbHMoMSwgbzEuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlMSwgbzEuZ2V0KCJrMSIpKTsKKwkJCWFzc2VydE51bGwobzEuZ2V0KCJrMiIpKTsKKwkJCWFzc2VydE5vdE51bGwobzIpOworCQkJYXNzZXJ0Tm90U2FtZSh0aGlzLm1hcCwgbzIpOworCQkJYXNzZXJ0RXF1YWxzKDAsIG8yLnNpemUoKSk7CisJCQlhc3NlcnROdWxsKG8yLmdldCgiazEiKSk7CisJCQlhc3NlcnROdWxsKG8yLmdldCgiazIiKSk7CisJCX0KKworCX0KKworfQorCmRpZmYgLS1naXQgYS9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL1N0cmluZ0NvbmNhdGVuYXRpb25UZXN0LmphdmEgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL1N0cmluZ0NvbmNhdGVuYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwNjgwMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvU3RyaW5nQ29uY2F0ZW5hdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDMzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxNyBQYW50aGVvbiBUZWNobm9sb2dpZXMsIHMuci5vLiBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50ZXN0cy5saWI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQyLmxpYi5TdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgU3RyaW5nQ29uY2F0ZW5hdGlvblRlc3QgeworICAgIC8vIFV0aWxpdHkgY2xhc3Mgd3JhcHBpbmcgYSBTdHJpbmcKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTdHJpbmdPYmplY3QgZXh0ZW5kcyBPYmplY3QgeworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyaW5nOworCisgICAgICAgIFN0cmluZ09iamVjdChmaW5hbCBTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHN0cmluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQ9SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsRGVsaW1pdGVyKCkgeworICAgICAgICBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbihudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZD1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RGVsaW1pdGVyKCkgeworICAgICAgICBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigiIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kT2JqZWN0TnVsbCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQ29uY2F0ZW5hdGlvbiBjID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgYy5hcHBlbmQoKE9iamVjdCludWxsKTsKKyAgICAgICAgYy5hcHBlbmQoKE9iamVjdCludWxsLCAiIik7CisgICAgICAgIGMuYXBwZW5kKChPYmplY3QpbnVsbCwgIiAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZFN0cmluZ051bGwoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0NvbmNhdGVuYXRpb24gYyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIGMuYXBwZW5kKChTdHJpbmcpbnVsbCk7CisgICAgICAgIGMuYXBwZW5kKChTdHJpbmcpbnVsbCwgIiIpOworICAgICAgICBjLmFwcGVuZCgoU3RyaW5nKW51bGwsICIgIik7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgYy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRTdHJpbmdDb25jYXROdWxsKCkgeworICAgICAgICBmaW5hbCBTdHJpbmdDb25jYXRlbmF0aW9uIGMgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBjLmFwcGVuZCgoU3RyaW5nQ29uY2F0ZW5hdGlvbiludWxsKTsKKyAgICAgICAgYy5hcHBlbmQoKFN0cmluZ0NvbmNhdGVuYXRpb24pbnVsbCwgIiIpOworICAgICAgICBjLmFwcGVuZCgoU3RyaW5nQ29uY2F0ZW5hdGlvbiludWxsLCAiICIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGMudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kU3RyaW5nQ29uY2F0Q2xpZW50TnVsbCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQ29uY2F0ZW5hdGlvbiBjID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgYy5hcHBlbmQoKFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQpbnVsbCk7CisgICAgICAgIGMuYXBwZW5kKChTdHJpbmdDb25jYXRlbmF0aW9uQ2xpZW50KW51bGwsICIiKTsKKyAgICAgICAgYy5hcHBlbmQoKFN0cmluZ0NvbmNhdGVuYXRpb25DbGllbnQpbnVsbCwgIiAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZE51bGxUb1N0cmluZygpIHsKKyAgICAgICAgZmluYWwgT2JqZWN0IG8gPSBuZXcgU3RyaW5nT2JqZWN0KG51bGwpOworICAgICAgICBmaW5hbCBTdHJpbmdDb25jYXRlbmF0aW9uIGMgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBjLmFwcGVuZChvKTsKKyAgICAgICAgYy5hcHBlbmQobywgIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQ9TnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZFdpdGhOdWxsSW5kZW50KCkgeworICAgICAgICBmaW5hbCBTdHJpbmdDb25jYXRlbmF0aW9uIGMgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBjLmFwcGVuZCgiYSIsIG51bGwpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkPU51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmROdWxsV2l0aE51bGxJbmRlbnQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0NvbmNhdGVuYXRpb24gYyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIGMuYXBwZW5kKChPYmplY3QpbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uY2F0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmdDb25jYXRlbmF0aW9uIGMgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBjLmFwcGVuZCgiYSIpOworICAgICAgICBjLmFwcGVuZCgiYiIpOworICAgICAgICBjLmFwcGVuZCgiYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIGMudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFza2VkU3RyaW5nQ29uY2F0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmdDb25jYXRlbmF0aW9uIGMgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBjLmFwcGVuZCgoT2JqZWN0KSJhIik7CisgICAgICAgIGMuYXBwZW5kKChPYmplY3QpImIiKTsKKyAgICAgICAgYy5hcHBlbmQoKE9iamVjdCkiYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIGMudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRDb25jYXQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0NvbmNhdGVuYXRpb24gYyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIGMuYXBwZW5kKCJhIik7CisgICAgICAgIGMuYXBwZW5kKENoYXJhY3Rlci52YWx1ZU9mKCdiJykpOworICAgICAgICBjLmFwcGVuZChuZXcgU3RyaW5nT2JqZWN0KCJjIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIGMudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhclNlcXVlbmNlTWV0aG9kcygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQ29uY2F0ZW5hdGlvbiBjID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgYy5hcHBlbmQoImEiKTsKKyAgICAgICAgYy5hcHBlbmQoImIiKTsKKyAgICAgICAgYy5hcHBlbmQoImMiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMywgYy5sZW5ndGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygnYScsIGMuY2hhckF0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCdiJywgYy5jaGFyQXQoMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiIiwgYy5zdWJTZXF1ZW5jZSgwLCAyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmMiLCBjLnN1YlNlcXVlbmNlKDEsIDMpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb2luZGVudENvbmNhdCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQ29uY2F0ZW5hdGlvbiBjID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oIlxuIik7CisgICAgICAgIGMuYXBwZW5kKCJhXG4iKTsKKyAgICAgICAgYy5hcHBlbmQoImJcciIpOworICAgICAgICBjLmFwcGVuZCgiY1xuIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYVxuYlxuY1xuIiwgYy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRlbnRDb25jYXQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0NvbmNhdGVuYXRpb24gYyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCJcbiIpOworICAgICAgICBjLmFwcGVuZCgiYVxuIiwgIiAiKTsKKyAgICAgICAgYy5hcHBlbmQoImJcciIsICIgICIpOworICAgICAgICBjLmFwcGVuZCgiY1xuZCIsICIgICAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhXG4gYlxuICBjXG4gICBkIiwgYy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXNrZWRJbmRlbnRDb25jYXQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0NvbmNhdGVuYXRpb24gYyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCJcbiIpOworICAgICAgICBjLmFwcGVuZCgoT2JqZWN0KSJhXG4iLCAiICIpOworICAgICAgICBjLmFwcGVuZCgoT2JqZWN0KSJiXHIiLCAiICAiKTsKKyAgICAgICAgYy5hcHBlbmQoKE9iamVjdCkiY1xuZCIsICIgICAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhXG4gYlxuICBjXG4gICBkIiwgYy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPYmplY3RJbmRlbnRDb25jYXQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0NvbmNhdGVuYXRpb24gYyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCJcbiIpOworICAgICAgICBjLmFwcGVuZChuZXcgU3RyaW5nT2JqZWN0KCJhXG4iKSwgIiAiKTsKKyAgICAgICAgYy5hcHBlbmQobmV3IFN0cmluZ09iamVjdCgiYlxyIiksICIgICIpOworICAgICAgICBjLmFwcGVuZChuZXcgU3RyaW5nT2JqZWN0KCJjXG5kIiksICIgICAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhXG4gYlxuICBjXG4gICBkIiwgYy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdMaW5lKCkgeworICAgICAgICBmaW5hbCBTdHJpbmdDb25jYXRlbmF0aW9uIGMgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigiXG4iKTsKKyAgICAgICAgYy5uZXdMaW5lKCk7CisgICAgICAgIGMuYXBwZW5kKCJhIik7CisgICAgICAgIGMubmV3TGluZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxuYVxuIiwgYy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdMaW5lSWZOb3RFbXB0eSgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQ29uY2F0ZW5hdGlvbiBjID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oIlxuIik7CisgICAgICAgIGMubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgYy5hcHBlbmQoImEiKTsKKyAgICAgICAgYy5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBjLmFwcGVuZCgiYlxuIik7CisgICAgICAgIGMubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgYy5hcHBlbmQoIiAgIik7CisgICAgICAgIGMubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhXG5iXG4iLCBjLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhY2hlZFRvU3RyaW5nKCkgeworICAgICAgICBmaW5hbCBTdHJpbmdDb25jYXRlbmF0aW9uIGMgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBjLmFwcGVuZCgiYSIpOworICAgICAgICBjLmFwcGVuZCgiYlxuIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0ciA9IGMudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0U2FtZShzdHIsIGMudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kRW1wdHlDb25jYXQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0NvbmNhdGVuYXRpb24gYyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIGMuYXBwZW5kKG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGMudG9TdHJpbmcoKSk7CisgICAgICAgIGMuYXBwZW5kKG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCksICIgICIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGMudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kQ29uY2F0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmdDb25jYXRlbmF0aW9uIHRvQXBwZW5kID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oIlxuIik7CisgICAgICAgIHRvQXBwZW5kLmFwcGVuZCgiYVxuIik7CisgICAgICAgIHRvQXBwZW5kLmFwcGVuZCgiYiIpOworCisgICAgICAgIGZpbmFsIFN0cmluZ0NvbmNhdGVuYXRpb24gYyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCJcbiIpOworICAgICAgICBjLmFwcGVuZCh0b0FwcGVuZCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYVxuYiIsIGMudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kQ29uY2F0U2VwYXJhdG9yKCkgeworICAgICAgICBmaW5hbCBTdHJpbmdDb25jYXRlbmF0aW9uIHRvQXBwZW5kID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oIlx0Iik7CisgICAgICAgIHRvQXBwZW5kLmFwcGVuZCgiYVx0Iik7CisgICAgICAgIHRvQXBwZW5kLmFwcGVuZCgiYiIpOworCisgICAgICAgIGZpbmFsIFN0cmluZ0NvbmNhdGVuYXRpb24gYyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIGMuYXBwZW5kKHRvQXBwZW5kKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhXHRiIiwgYy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRFbXB0eUNvbmNhdFNlcGFyYXRvcigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQ29uY2F0ZW5hdGlvbiBjID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgYy5hcHBlbmQobmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oIlx0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGMudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kTWFza2VkQ29uY2F0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmdDb25jYXRlbmF0aW9uIHRvQXBwZW5kID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oIlxuIik7CisgICAgICAgIHRvQXBwZW5kLmFwcGVuZCgiYVxuIik7CisgICAgICAgIHRvQXBwZW5kLmFwcGVuZCgiYiIpOworCisgICAgICAgIGZpbmFsIFN0cmluZ0NvbmNhdGVuYXRpb24gYyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCJcbiIpOworICAgICAgICBjLmFwcGVuZCgoT2JqZWN0KXRvQXBwZW5kKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhXG5iIiwgYy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRNYXNrZWRJbmRlbnRDb25jYXQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0NvbmNhdGVuYXRpb24gdG9BcHBlbmQgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigiXG4iKTsKKyAgICAgICAgdG9BcHBlbmQuYXBwZW5kKCJhXG4iKTsKKyAgICAgICAgdG9BcHBlbmQuYXBwZW5kKCJiIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nQ29uY2F0ZW5hdGlvbiBjID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oIlxuIik7CisgICAgICAgIGMuYXBwZW5kKChPYmplY3QpdG9BcHBlbmQsICIgIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYVxuIGIiLCBjLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZEltbWVkaWF0ZVNpbXBsZSgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQ29uY2F0ZW5hdGlvbiBjID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgYy5hcHBlbmRJbW1lZGlhdGUoImEiLCAiICAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgYy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRJbW1lZGlhdGVDb21wbGV4KCkgeworICAgICAgICBmaW5hbCBTdHJpbmdDb25jYXRlbmF0aW9uIGMgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigiXG4iKTsKKyAgICAgICAgYy5hcHBlbmQoImFcbiIpOworICAgICAgICBjLmFwcGVuZCgiIGIgICAiKTsKKyAgICAgICAgYy5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBjLmFwcGVuZCgiICAgICIpOworICAgICAgICBjLmFwcGVuZEltbWVkaWF0ZSgiY1xuZCIsICIgICIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFcbiBiICAgY1xuICBkXG4iLCBjLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdyb3dJbkNodW5rcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBUaGlzIGlzIHJhdGhlciB1Z2x5LCBidXQgZ2V0cyB0aGUgam9iIGRvbmUuIEl0IHdvdWxkIGJlIG11Y2ggY2xlYW5lciBpZiB0aGlzIHRlc3Qgd2VyZSBpbiB0aGUgc2FtZQorICAgICAgICAvLyBwYWNrYWdlIGFzIHRoZSBjbGFzcyBiZWluZyB0ZXN0ZWQuLi4KKyAgICAgICAgZmluYWwgRmllbGQgbHNzID0gU3RyaW5nQ29uY2F0ZW5hdGlvbi5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJsYXN0U2VnbWVudHNTaXplIik7CisgICAgICAgIGxzcy5zZXRBY2Nlc3NpYmxlKHRydWUpOworCisgICAgICAgIGZpbmFsIFN0cmluZ0NvbmNhdGVuYXRpb24gYyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIGZpbmFsIGludCBpbml0aWFsU2l6ZSA9IGxzcy5nZXRJbnQoYyk7CisgICAgICAgIGFzc2VydFRydWUoaW5pdGlhbFNpemUgPj0gMCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0aWFsU2l6ZTsgKytpKSB7CisgICAgICAgICAgICBjLmFwcGVuZCgiYSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gcmVhbGxvY2F0aW9uIHNob3VsZCBoYXBwZW4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluaXRpYWxTaXplLCBsc3MuZ2V0SW50KGMpKTsKKworICAgICAgICAvLyBUaGlzIHNob3VsZCB0cmlnZ2VyIHByZS1hbGxvY2F0aW9uCisgICAgICAgIGMuYXBwZW5kKCJiIik7CisgICAgICAgIGZpbmFsIGludCBmaXJzdEdyb3duID0gbHNzLmdldEludChjKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaXJzdEdyb3duID4gaW5pdGlhbFNpemUpOworCisgICAgICAgIC8vIFRoZSBkZWx0YSBuZWVkcyB0byBiZSBhIHBvd2VyLW9mLXR3bworICAgICAgICBmaW5hbCBpbnQgZGVsdGFTaXplID0gZmlyc3RHcm93biAtIGluaXRpYWxTaXplOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgSW50ZWdlci5iaXRDb3VudChkZWx0YVNpemUpKTsKKworICAgICAgICAvLyBOb3cganVzdCB0byBtYWtlIHN1cmUsIGFwcGVuZCBhbm90aGVyIHNldAorICAgICAgICBmaW5hbCBTdHJpbmdDb25jYXRlbmF0aW9uIGJhdGNoID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBkZWx0YVNpemUgKiAyOyArK2kpIHsKKyAgICAgICAgICAgIGJhdGNoLm5ld0xpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBjLmFwcGVuZChiYXRjaCk7CisKKyAgICAgICAgZmluYWwgaW50IHNlY29uZEdyb3duID0gbHNzLmdldEludChjKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaXJzdEdyb3duIDwgc2Vjb25kR3Jvd24pOworICAgICAgICBhc3NlcnRFcXVhbHMoZGVsdGFTaXplLCBzZWNvbmRHcm93biAtIGZpcnN0R3Jvd24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvaW50ZXJuYWwvVG9TdHJpbmdCdWlsZGVyVGVzdC5qYXZhIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9pbnRlcm5hbC9Ub1N0cmluZ0J1aWxkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmMzRlMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvaW50ZXJuYWwvVG9TdHJpbmdCdWlsZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjcxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBpdGVtaXMgQUcgKGh0dHA6Ly93d3cuaXRlbWlzLmV1KSBhbmQgb3RoZXJzLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKiAKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UudGVzdHMubGliLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zLkFjY2Vzc29yczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnMuVG9TdHJpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQyLmxpYi5TdHJpbmdDb25jYXRlbmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Db2xsZWN0aW9uTGl0ZXJhbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlB1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLnV0aWwuVG9TdHJpbmdCdWlsZGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQGF1dGhvciBLYXJzdGVuIFRob21zIC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBUb1N0cmluZ0J1aWxkZXJUZXN0IHsKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBPdGhlckNsYXNzIHsKKyAgICBwdWJsaWMgVG9TdHJpbmdCdWlsZGVyVGVzdC5PdGhlckNsYXNzIG90aGVyOworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgfQorICAKKyAgQEFjY2Vzc29ycworICBAVG9TdHJpbmcKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBEYXRhQ2xhc3MgeworICAgIHB1YmxpYyBUb1N0cmluZ0J1aWxkZXJUZXN0LkRhdGFDbGFzcyBvdGhlcjsKKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgCisgICAgQFB1cmUKKyAgICBwdWJsaWMgVG9TdHJpbmdCdWlsZGVyVGVzdC5EYXRhQ2xhc3MgZ2V0T3RoZXIoKSB7CisgICAgICByZXR1cm4gdGhpcy5vdGhlcjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0T3RoZXIoZmluYWwgVG9TdHJpbmdCdWlsZGVyVGVzdC5EYXRhQ2xhc3Mgb3RoZXIpIHsKKyAgICAgIHRoaXMub3RoZXIgPSBvdGhlcjsKKyAgICB9CisgICAgCisgICAgQFB1cmUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBAUHVyZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBUb1N0cmluZ0J1aWxkZXIgYiA9IG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyk7CisgICAgICBiLmFkZCgib3RoZXIiLCB0aGlzLm90aGVyKTsKKyAgICAgIGIuYWRkKCJuYW1lIiwgdGhpcy5uYW1lKTsKKyAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RW50aXR5IHsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gYm9vbFByb3AgPSB0cnVlOworICAgIAorICAgIHByaXZhdGUgZmluYWwgaW50IGludFByb3AgPSA0MjsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG15TGlzdCA9IENvbGxlY3Rpb25MaXRlcmFscy48U3RyaW5nPm5ld0FycmF5TGlzdCgiZm9vIiwgImJhciIsICJiYXoiKTsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIFRvU3RyaW5nQnVpbGRlclRlc3QuTXlFbnRpdHkgZnJpZW5kOworICAgIAorICAgIHByaXZhdGUgZmluYWwgUmV0ZW50aW9uUG9saWN5IHBvbGljeSA9IFJldGVudGlvblBvbGljeS5DTEFTUzsKKyAgICAKKyAgICBwdWJsaWMgTXlFbnRpdHkoKSB7CisgICAgICB0aGlzLmZyaWVuZCA9IG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNeUVudGl0eShmaW5hbCBUb1N0cmluZ0J1aWxkZXJUZXN0Lk15RW50aXR5IGZyaWVuZCkgeworICAgICAgdGhpcy5mcmllbmQgPSBmcmllbmQ7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBTdHJpbmcgX3BsdXMgPSAoQm9vbGVhbi52YWx1ZU9mKHRoaXMuYm9vbFByb3ApICsgIlxuIik7CisgICAgICBTdHJpbmcgX3BsdXNfMSA9IChfcGx1cyArIEludGVnZXIudmFsdWVPZih0aGlzLmludFByb3ApKTsKKyAgICAgIFN0cmluZyBfcGx1c18yID0gKF9wbHVzXzEgKyAiXG4iKTsKKyAgICAgIFN0cmluZyBfcGx1c18zID0gKF9wbHVzXzIgKyB0aGlzLm15TGlzdCk7CisgICAgICBTdHJpbmcgX3BsdXNfNCA9IChfcGx1c18zICsgIlxuIik7CisgICAgICBTdHJpbmcgX3BsdXNfNSA9IChfcGx1c180ICsgdGhpcy5mcmllbmQpOworICAgICAgU3RyaW5nIF9wbHVzXzYgPSAoX3BsdXNfNSArICJcbiIpOworICAgICAgcmV0dXJuIChfcGx1c182ICsgdGhpcy5wb2xpY3kpOworICAgIH0KKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgIFRvU3RyaW5nQnVpbGRlclRlc3QuTXlFbnRpdHkgX215RW50aXR5ID0gbmV3IFRvU3RyaW5nQnVpbGRlclRlc3QuTXlFbnRpdHkoKTsKKyAgICBUb1N0cmluZ0J1aWxkZXJUZXN0Lk15RW50aXR5IF9teUVudGl0eV8xID0gbmV3IFRvU3RyaW5nQnVpbGRlclRlc3QuTXlFbnRpdHkoX215RW50aXR5KTsKKyAgICBmaW5hbCBUb1N0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIoX215RW50aXR5XzEpLmFkZEFsbEZpZWxkcygpOworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyLmFwcGVuZCgiTXlFbnRpdHkgWyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJib29sUHJvcCA9IHRydWUiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiaW50UHJvcCA9IDQyIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIm15TGlzdCA9IEFycmF5TGlzdCAoIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCJmb29cIiwiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcImJhclwiLCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiYmF6XCIiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiKSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJmcmllbmQgPSB0cnVlIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIjQyIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIltmb28sIGJhciwgYmF6XSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJudWxsIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIkNMQVNTIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInBvbGljeSA9IENMQVNTIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXSIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoCisgICAgICBUb1N0cmluZ0J1aWxkZXJUZXN0LnRvVW5peChfYnVpbGRlci50b1N0cmluZygpKSwgYnVpbGRlci50b1N0cmluZygpKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUxpbmUoKSB7CisgICAgVG9TdHJpbmdCdWlsZGVyVGVzdC5NeUVudGl0eSBfbXlFbnRpdHkgPSBuZXcgVG9TdHJpbmdCdWlsZGVyVGVzdC5NeUVudGl0eSgpOworICAgIGZpbmFsIFRvU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcihfbXlFbnRpdHkpLnNpbmdsZUxpbmUoKS5hZGRBbGxGaWVsZHMoKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKAorICAgICAgIk15RW50aXR5IFtib29sUHJvcCA9IHRydWUsIGludFByb3AgPSA0MiwgbXlMaXN0ID0gQXJyYXlMaXN0IChcImZvb1wiLFwiYmFyXCIsXCJiYXpcIiksIGZyaWVuZCA9IG51bGwsIHBvbGljeSA9IENMQVNTXSIsIAorICAgICAgYnVpbGRlci50b1N0cmluZygpKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEhpZGVGaWVsZE5hbWVzKCkgeworICAgIFRvU3RyaW5nQnVpbGRlclRlc3QuTXlFbnRpdHkgX215RW50aXR5ID0gbmV3IFRvU3RyaW5nQnVpbGRlclRlc3QuTXlFbnRpdHkoKTsKKyAgICBmaW5hbCBUb1N0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIoX215RW50aXR5KS5zaW5nbGVMaW5lKCkuaGlkZUZpZWxkTmFtZXMoKS5hZGRBbGxGaWVsZHMoKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJNeUVudGl0eSBbdHJ1ZSwgNDIsIEFycmF5TGlzdCAoXCJmb29cIixcImJhclwiLFwiYmF6XCIpLCBudWxsLCBDTEFTU10iLCBidWlsZGVyLnRvU3RyaW5nKCkpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0U2tpcE51bGxzKCkgeworICAgIFRvU3RyaW5nQnVpbGRlclRlc3QuTXlFbnRpdHkgX215RW50aXR5ID0gbmV3IFRvU3RyaW5nQnVpbGRlclRlc3QuTXlFbnRpdHkoKTsKKyAgICBmaW5hbCBUb1N0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIoX215RW50aXR5KS5za2lwTnVsbHMoKS5hZGRBbGxGaWVsZHMoKTsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIk15RW50aXR5IFsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiYm9vbFByb3AgPSB0cnVlIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImludFByb3AgPSA0MiIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJteUxpc3QgPSBBcnJheUxpc3QgKCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiZm9vXCIsIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCJiYXJcIiwiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcImJhelwiIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIikiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgicG9saWN5ID0gQ0xBU1MiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJdIik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygKKyAgICAgIFRvU3RyaW5nQnVpbGRlclRlc3QudG9Vbml4KF9idWlsZGVyLnRvU3RyaW5nKCkpLCBidWlsZGVyLnRvU3RyaW5nKCkpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRGaWVsZExpc3RpbmcoKSB7CisgICAgVG9TdHJpbmdCdWlsZGVyVGVzdC5NeUVudGl0eSBfbXlFbnRpdHkgPSBuZXcgVG9TdHJpbmdCdWlsZGVyVGVzdC5NeUVudGl0eSgpOworICAgIGZpbmFsIFRvU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcihfbXlFbnRpdHkpLmFkZCgiYm9vbFByb3AiLCBCb29sZWFuLnZhbHVlT2YoZmFsc2UpKS5hZGRGaWVsZCgiaW50UHJvcCIpOworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyLmFwcGVuZCgiTXlFbnRpdHkgWyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJib29sUHJvcCA9IGZhbHNlIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImludFByb3AgPSA0MiIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIl0iKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKAorICAgICAgVG9TdHJpbmdCdWlsZGVyVGVzdC50b1VuaXgoX2J1aWxkZXIudG9TdHJpbmcoKSksIGJ1aWxkZXIudG9TdHJpbmcoKSk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHJlY3Vyc2lvbkhhbmRsaW5nKCkgeworICAgIGZpbmFsIFRvU3RyaW5nQnVpbGRlclRlc3QuT3RoZXJDbGFzcyBvYmogPSBuZXcgVG9TdHJpbmdCdWlsZGVyVGVzdC5PdGhlckNsYXNzKCk7CisgICAgb2JqLm5hbWUgPSAiZm9vIjsKKyAgICBvYmoub3RoZXIgPSBvYmo7CisgICAgZmluYWwgVG9TdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVG9TdHJpbmdCdWlsZGVyKG9iaikuYWRkRGVjbGFyZWRGaWVsZHMoKTsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIk90aGVyQ2xhc3MgWyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJvdGhlciA9ICIpOworICAgIFN0cmluZyBfc3RyaW5nID0gb2JqLnRvU3RyaW5nKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9zdHJpbmcsICIgICIpOworICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgibmFtZSA9IFwiZm9vXCIiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJdIik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygKKyAgICAgIFRvU3RyaW5nQnVpbGRlclRlc3QudG9Vbml4KF9idWlsZGVyLnRvU3RyaW5nKCkpLCBidWlsZGVyLnRvU3RyaW5nKCkpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCByZWN1cnNpb25IYW5kbGluZ18wMigpIHsKKyAgICBmaW5hbCBUb1N0cmluZ0J1aWxkZXJUZXN0LkRhdGFDbGFzcyBvYmogPSBuZXcgVG9TdHJpbmdCdWlsZGVyVGVzdC5EYXRhQ2xhc3MoKTsKKyAgICBvYmoub3RoZXIgPSBvYmo7CisgICAgb2JqLm5hbWUgPSAidGVzdCI7CisgICAgZmluYWwgVG9TdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVG9TdHJpbmdCdWlsZGVyKG9iaikuYWRkRGVjbGFyZWRGaWVsZHMoKTsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIkRhdGFDbGFzcyBbIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIm90aGVyID0gRGF0YUNsYXNzQCIpOworICAgIGludCBfaWRlbnRpdHlIYXNoQ29kZSA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG9iaik7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9pZGVudGl0eUhhc2hDb2RlLCAiICAiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIm5hbWUgPSBcInRlc3RcIiIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIl0iKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKAorICAgICAgVG9TdHJpbmdCdWlsZGVyVGVzdC50b1VuaXgoX2J1aWxkZXIudG9TdHJpbmcoKSksIGJ1aWxkZXIudG9TdHJpbmcoKSk7CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvVW5peChmaW5hbCBTdHJpbmcgcykgeworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gcmVzdWx0ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oIlxuIik7CisgICAgcmVzdWx0LmFwcGVuZChzKTsKKyAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvaW50ZXJuYWwvVG9TdHJpbmdCdWlsZGVyVGVzdC54dGVuZCBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvaW50ZXJuYWwvVG9TdHJpbmdCdWlsZGVyVGVzdC54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzBiOTEwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9pbnRlcm5hbC9Ub1N0cmluZ0J1aWxkZXJUZXN0Lnh0ZW5kCkBAIC0wLDAgKzEsMTUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IGl0ZW1pcyBBRyAoaHR0cDovL3d3dy5pdGVtaXMuZXUpIGFuZCBvdGhlcnMuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnRlc3RzLmxpYi5pbnRlcm5hbAorCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5CitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zLkFjY2Vzc29ycworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kMi5saWIuU3RyaW5nQ29uY2F0ZW5hdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi51dGlsLlRvU3RyaW5nQnVpbGRlcgoraW1wb3J0IG9yZy5qdW5pdC5UZXN0CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qCitpbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLmFubm90YXRpb25zLlRvU3RyaW5nCisKKy8qKgorICogQGF1dGhvciBLYXJzdGVuIFRob21zIC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICovCitjbGFzcyBUb1N0cmluZ0J1aWxkZXJUZXN0IHsKKworCUBUZXN0IGRlZiB2b2lkIHRlc3RUb1N0cmluZygpIHsKKwkJdmFsIGJ1aWxkZXIgPSBuZXcgVG9TdHJpbmdCdWlsZGVyKG5ldyBNeUVudGl0eShuZXcgTXlFbnRpdHkpKS5hZGRBbGxGaWVsZHMKKwkJYXNzZXJ0RXF1YWxzKHRvVW5peCgKKwkJCQknJycKKwkJTXlFbnRpdHkgWworCQkgIGJvb2xQcm9wID0gdHJ1ZQorCQkgIGludFByb3AgPSA0MgorCQkgIG15TGlzdCA9IEFycmF5TGlzdCAoCisJCSAgICAiZm9vIiwKKwkJICAgICJiYXIiLAorCQkgICAgImJheiIKKwkJICApCisJCSAgZnJpZW5kID0gdHJ1ZQorCQkgIDQyCisJCSAgW2ZvbywgYmFyLCBiYXpdCisJCSAgbnVsbAorCQkgIENMQVNTCisJCSAgcG9saWN5ID0gQ0xBU1MKKwkJXScnJyksIGJ1aWxkZXIudG9TdHJpbmcoKSkKKwl9CisKKwlAVGVzdCBkZWYgdm9pZCB0ZXN0U2luZ2xlTGluZSgpIHsKKwkJdmFsIGJ1aWxkZXIgPSBuZXcgVG9TdHJpbmdCdWlsZGVyKG5ldyBNeUVudGl0eSkuc2luZ2xlTGluZS5hZGRBbGxGaWVsZHMKKworCQlhc3NlcnRFcXVhbHMoCisJCQknTXlFbnRpdHkgW2Jvb2xQcm9wID0gdHJ1ZSwgaW50UHJvcCA9IDQyLCBteUxpc3QgPSBBcnJheUxpc3QgKCJmb28iLCJiYXIiLCJiYXoiKSwgZnJpZW5kID0gbnVsbCwgcG9saWN5ID0gQ0xBU1NdJywKKwkJCWJ1aWxkZXIudG9TdHJpbmcoKSkKKwl9CisKKwlAVGVzdCBkZWYgdm9pZCB0ZXN0SGlkZUZpZWxkTmFtZXMoKSB7CisJCXZhbCBidWlsZGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcihuZXcgTXlFbnRpdHkpLnNpbmdsZUxpbmUuaGlkZUZpZWxkTmFtZXMuYWRkQWxsRmllbGRzCisKKwkJYXNzZXJ0RXF1YWxzKCdNeUVudGl0eSBbdHJ1ZSwgNDIsIEFycmF5TGlzdCAoImZvbyIsImJhciIsImJheiIpLCBudWxsLCBDTEFTU10nLCBidWlsZGVyLnRvU3RyaW5nKCkpCisJfQorCisJQFRlc3QgZGVmIHZvaWQgdGVzdFNraXBOdWxscygpIHsKKwkJdmFsIGJ1aWxkZXIgPSBuZXcgVG9TdHJpbmdCdWlsZGVyKG5ldyBNeUVudGl0eSkuc2tpcE51bGxzLmFkZEFsbEZpZWxkcworCisJCWFzc2VydEVxdWFscyh0b1VuaXgoCisJCQkJJycnCisJCU15RW50aXR5IFsKKwkJICBib29sUHJvcCA9IHRydWUKKwkJICBpbnRQcm9wID0gNDIKKwkJICBteUxpc3QgPSBBcnJheUxpc3QgKAorCQkgICAgImZvbyIsCisJCSAgICAiYmFyIiwKKwkJICAgICJiYXoiCisJCSAgKQorCQkgIHBvbGljeSA9IENMQVNTCisJCV0nJycpLCBidWlsZGVyLnRvU3RyaW5nKQorCX0KKworCUBUZXN0IGRlZiB2b2lkIHRlc3RFeHBsaWNpdEZpZWxkTGlzdGluZygpIHsKKwkJdmFsIGJ1aWxkZXIgPSBuZXcgVG9TdHJpbmdCdWlsZGVyKG5ldyBNeUVudGl0eSkuYWRkKCJib29sUHJvcCIsIGZhbHNlKS5hZGRGaWVsZCgiaW50UHJvcCIpCisKKwkJYXNzZXJ0RXF1YWxzKHRvVW5peCgKKwkJCQknJycKKwkJTXlFbnRpdHkgWworCQkgIGJvb2xQcm9wID0gZmFsc2UKKwkJICBpbnRQcm9wID0gNDIKKwkJXScnJyksIGJ1aWxkZXIudG9TdHJpbmcpCisJfQorCisJQFRlc3QgZGVmIHZvaWQgcmVjdXJzaW9uSGFuZGxpbmcoKSB7CisJCXZhbCBvYmogPSBuZXcgT3RoZXJDbGFzcworCQlvYmoubmFtZSA9ICdmb28nCisJCW9iai5vdGhlciA9IG9iagorCQl2YWwgYnVpbGRlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIob2JqKS5hZGREZWNsYXJlZEZpZWxkcworCisJCWFzc2VydEVxdWFscyh0b1VuaXgoCisJCQkJJycnCisJCU90aGVyQ2xhc3MgWworCQkgIG90aGVyID0gq29iai50b1N0cmluZ7sKKwkJICBuYW1lID0gImZvbyIKKwkJXScnJyksIGJ1aWxkZXIudG9TdHJpbmcpCisJfQorCisJQFRlc3QgZGVmIHZvaWQgcmVjdXJzaW9uSGFuZGxpbmdfMDIoKSB7CisJCXZhbCBvYmogPSBuZXcgRGF0YUNsYXNzKCkKKwkJb2JqLm90aGVyID0gb2JqCisJCW9iai5uYW1lID0gInRlc3QiCisJCXZhbCBidWlsZGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcihvYmopLmFkZERlY2xhcmVkRmllbGRzCisJCWFzc2VydEVxdWFscyh0b1VuaXgoCisJCQkJJycnCisJCURhdGFDbGFzcyBbCisJCSAgb3RoZXIgPSBEYXRhQ2xhc3NAq1N5c3RlbTo6aWRlbnRpdHlIYXNoQ29kZShvYmopuworCQkgIG5hbWUgPSAidGVzdCIKKwkJXScnJyksIGJ1aWxkZXIudG9TdHJpbmcpCisJfQorCisJc3RhdGljIGNsYXNzIE90aGVyQ2xhc3MgeworCQlwdWJsaWMgT3RoZXJDbGFzcyBvdGhlcgorCQlwdWJsaWMgU3RyaW5nIG5hbWUKKwl9CisKKwlAQWNjZXNzb3JzIEBUb1N0cmluZyBzdGF0aWMgY2xhc3MgRGF0YUNsYXNzIHsKKwkJcHVibGljIERhdGFDbGFzcyBvdGhlcgorCQlwdWJsaWMgU3RyaW5nIG5hbWUKKwl9CisKKwlzdGF0aWMgY2xhc3MgTXlFbnRpdHkgeworCQl2YWwgYm9vbFByb3AgPSB0cnVlCisJCXZhbCBpbnRQcm9wID0gNDIKKwkJdmFsIG15TGlzdCA9IG5ld0FycmF5TGlzdCgnZm9vJywgJ2JhcicsICdiYXonKQorCQl2YWwgTXlFbnRpdHkgZnJpZW5kCisJCXZhbCBSZXRlbnRpb25Qb2xpY3kgcG9saWN5ID0gUmV0ZW50aW9uUG9saWN5OjpDTEFTUworCisJCW5ldygpIHsKKwkJCXRoaXMuZnJpZW5kID0gbnVsbAorCQl9CisKKwkJbmV3KE15RW50aXR5IGZyaWVuZCkgeworCQkJdGhpcy5mcmllbmQgPSBmcmllbmQ7CisJCX0KKworCQlvdmVycmlkZSB0b1N0cmluZygpIHsKKwkJCXJldHVybiBib29sUHJvcCArICdcbicgKyBpbnRQcm9wICsgJ1xuJyArIG15TGlzdCArICdcbicgKyBmcmllbmQgKyAnXG4nICsgcG9saWN5CisJCX0KKwl9CisKKwlkZWYgc3RhdGljIFN0cmluZyB0b1VuaXgoU3RyaW5nIHMpIHsKKwkJdmFyIFN0cmluZ0NvbmNhdGVuYXRpb24gcmVzdWx0ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oIlxuIikKKwkJcmVzdWx0LmFwcGVuZChzKQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCkKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL2ludGVybmFsL1RvU3RyaW5nSGVscGVyVGVzdC5qYXZhIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9pbnRlcm5hbC9Ub1N0cmluZ0hlbHBlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjk1YWRiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi9pbnRlcm5hbC9Ub1N0cmluZ0hlbHBlclRlc3QuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50ZXN0cy5saWIuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnMuQWNjZXNzb3JzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9ucy5Ub1N0cmluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkNvbGxlY3Rpb25MaXRlcmFsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuUHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIudXRpbC5Ub1N0cmluZ0J1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLnV0aWwuVG9TdHJpbmdIZWxwZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworQERlcHJlY2F0ZWQKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFRvU3RyaW5nSGVscGVyVGVzdCB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3RoZXJDbGFzcyB7CisgICAgcHVibGljIFRvU3RyaW5nSGVscGVyVGVzdC5PdGhlckNsYXNzIG90aGVyOworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgfQorICAKKyAgQEFjY2Vzc29ycworICBAVG9TdHJpbmcKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBEYXRhQ2xhc3MgeworICAgIHB1YmxpYyBUb1N0cmluZ0hlbHBlclRlc3QuRGF0YUNsYXNzIG90aGVyOworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICAKKyAgICBAUHVyZQorICAgIHB1YmxpYyBUb1N0cmluZ0hlbHBlclRlc3QuRGF0YUNsYXNzIGdldE90aGVyKCkgeworICAgICAgcmV0dXJuIHRoaXMub3RoZXI7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldE90aGVyKGZpbmFsIFRvU3RyaW5nSGVscGVyVGVzdC5EYXRhQ2xhc3Mgb3RoZXIpIHsKKyAgICAgIHRoaXMub3RoZXIgPSBvdGhlcjsKKyAgICB9CisgICAgCisgICAgQFB1cmUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBAUHVyZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBUb1N0cmluZ0J1aWxkZXIgYiA9IG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyk7CisgICAgICBiLmFkZCgib3RoZXIiLCB0aGlzLm90aGVyKTsKKyAgICAgIGIuYWRkKCJuYW1lIiwgdGhpcy5uYW1lKTsKKyAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RW50aXR5IHsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gYm9vbFByb3AgPSB0cnVlOworICAgIAorICAgIHByaXZhdGUgZmluYWwgaW50IGludFByb3AgPSA0MjsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG15TGlzdCA9IENvbGxlY3Rpb25MaXRlcmFscy48U3RyaW5nPm5ld0FycmF5TGlzdCgiZm9vIiwgImJhciIsICJiYXoiKTsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIFRvU3RyaW5nSGVscGVyVGVzdC5NeUVudGl0eSBmcmllbmQ7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBSZXRlbnRpb25Qb2xpY3kgcG9saWN5ID0gUmV0ZW50aW9uUG9saWN5LkNMQVNTOworICAgIAorICAgIHB1YmxpYyBNeUVudGl0eSgpIHsKKyAgICAgIHRoaXMuZnJpZW5kID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIE15RW50aXR5KGZpbmFsIFRvU3RyaW5nSGVscGVyVGVzdC5NeUVudGl0eSBmcmllbmQpIHsKKyAgICAgIHRoaXMuZnJpZW5kID0gZnJpZW5kOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgU3RyaW5nIF9wbHVzID0gKEJvb2xlYW4udmFsdWVPZih0aGlzLmJvb2xQcm9wKSArICJcbiIpOworICAgICAgU3RyaW5nIF9wbHVzXzEgPSAoX3BsdXMgKyBJbnRlZ2VyLnZhbHVlT2YodGhpcy5pbnRQcm9wKSk7CisgICAgICBTdHJpbmcgX3BsdXNfMiA9IChfcGx1c18xICsgIlxuIik7CisgICAgICBTdHJpbmcgX3BsdXNfMyA9IChfcGx1c18yICsgdGhpcy5teUxpc3QpOworICAgICAgU3RyaW5nIF9wbHVzXzQgPSAoX3BsdXNfMyArICJcbiIpOworICAgICAgU3RyaW5nIF9wbHVzXzUgPSAoX3BsdXNfNCArIHRoaXMuZnJpZW5kKTsKKyAgICAgIFN0cmluZyBfcGx1c182ID0gKF9wbHVzXzUgKyAiXG4iKTsKKyAgICAgIHJldHVybiAoX3BsdXNfNiArIHRoaXMucG9saWN5KTsKKyAgICB9CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKKyAgICBmaW5hbCBUb1N0cmluZ0hlbHBlciBoZWxwZXIgPSBuZXcgVG9TdHJpbmdIZWxwZXIoKTsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIk15RW50aXR5IFsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiYm9vbFByb3AgPSB0cnVlIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImludFByb3AgPSA0MiIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJteUxpc3QgPSBBcnJheUxpc3QgKCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiZm9vXCIsIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCJiYXJcIiwiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcImJhelwiIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIikiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZnJpZW5kID0gdHJ1ZSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCI0MiIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJbZm9vLCBiYXIsIGJhel0iKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgibnVsbCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJDTEFTUyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJwb2xpY3kgPSBDTEFTUyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIl0iKTsKKyAgICBUb1N0cmluZ0hlbHBlclRlc3QuTXlFbnRpdHkgX215RW50aXR5ID0gbmV3IFRvU3RyaW5nSGVscGVyVGVzdC5NeUVudGl0eSgpOworICAgIFRvU3RyaW5nSGVscGVyVGVzdC5NeUVudGl0eSBfbXlFbnRpdHlfMSA9IG5ldyBUb1N0cmluZ0hlbHBlclRlc3QuTXlFbnRpdHkoX215RW50aXR5KTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKAorICAgICAgVG9TdHJpbmdIZWxwZXJUZXN0LnRvVW5peChfYnVpbGRlci50b1N0cmluZygpKSwgaGVscGVyLnRvU3RyaW5nKF9teUVudGl0eV8xKSk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVMaW5lKCkgeworICAgIFRvU3RyaW5nSGVscGVyVGVzdC5NeUVudGl0eSBfbXlFbnRpdHkgPSBuZXcgVG9TdHJpbmdIZWxwZXJUZXN0Lk15RW50aXR5KCk7CisgICAgZmluYWwgVG9TdHJpbmdCdWlsZGVyIGhlbHBlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIoX215RW50aXR5KS5zaW5nbGVMaW5lKCkuYWRkQWxsRmllbGRzKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygKKyAgICAgICJNeUVudGl0eSBbYm9vbFByb3AgPSB0cnVlLCBpbnRQcm9wID0gNDIsIG15TGlzdCA9IEFycmF5TGlzdCAoXCJmb29cIixcImJhclwiLFwiYmF6XCIpLCBmcmllbmQgPSBudWxsLCBwb2xpY3kgPSBDTEFTU10iLCAKKyAgICAgIGhlbHBlci50b1N0cmluZygpKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEhpZGVGaWVsZE5hbWVzKCkgeworICAgIFRvU3RyaW5nSGVscGVyVGVzdC5NeUVudGl0eSBfbXlFbnRpdHkgPSBuZXcgVG9TdHJpbmdIZWxwZXJUZXN0Lk15RW50aXR5KCk7CisgICAgZmluYWwgVG9TdHJpbmdCdWlsZGVyIGhlbHBlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIoX215RW50aXR5KS5zaW5nbGVMaW5lKCkuaGlkZUZpZWxkTmFtZXMoKS5hZGRBbGxGaWVsZHMoKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJNeUVudGl0eSBbdHJ1ZSwgNDIsIEFycmF5TGlzdCAoXCJmb29cIixcImJhclwiLFwiYmF6XCIpLCBudWxsLCBDTEFTU10iLCBoZWxwZXIudG9TdHJpbmcoKSk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RTa2lwTnVsbHMoKSB7CisgICAgVG9TdHJpbmdIZWxwZXJUZXN0Lk15RW50aXR5IF9teUVudGl0eSA9IG5ldyBUb1N0cmluZ0hlbHBlclRlc3QuTXlFbnRpdHkoKTsKKyAgICBmaW5hbCBUb1N0cmluZ0J1aWxkZXIgaGVscGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcihfbXlFbnRpdHkpLnNraXBOdWxscygpLmFkZEFsbEZpZWxkcygpOworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyLmFwcGVuZCgiTXlFbnRpdHkgWyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJib29sUHJvcCA9IHRydWUiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiaW50UHJvcCA9IDQyIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIm15TGlzdCA9IEFycmF5TGlzdCAoIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCJmb29cIiwiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcImJhclwiLCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiYmF6XCIiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiKSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJwb2xpY3kgPSBDTEFTUyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIl0iKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKAorICAgICAgVG9TdHJpbmdIZWxwZXJUZXN0LnRvVW5peChfYnVpbGRlci50b1N0cmluZygpKSwgaGVscGVyLnRvU3RyaW5nKCkpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRGaWVsZExpc3RpbmcoKSB7CisgICAgVG9TdHJpbmdIZWxwZXJUZXN0Lk15RW50aXR5IF9teUVudGl0eSA9IG5ldyBUb1N0cmluZ0hlbHBlclRlc3QuTXlFbnRpdHkoKTsKKyAgICBmaW5hbCBUb1N0cmluZ0J1aWxkZXIgaGVscGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcihfbXlFbnRpdHkpLmFkZCgiYm9vbFByb3AiLCBCb29sZWFuLnZhbHVlT2YoZmFsc2UpKS5hZGRGaWVsZCgiaW50UHJvcCIpOworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyLmFwcGVuZCgiTXlFbnRpdHkgWyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJib29sUHJvcCA9IGZhbHNlIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImludFByb3AgPSA0MiIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIl0iKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKAorICAgICAgVG9TdHJpbmdIZWxwZXJUZXN0LnRvVW5peChfYnVpbGRlci50b1N0cmluZygpKSwgaGVscGVyLnRvU3RyaW5nKCkpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCByZWN1cnNpb25IYW5kbGluZygpIHsKKyAgICBmaW5hbCBUb1N0cmluZ0hlbHBlciBoZWxwZXIgPSBuZXcgVG9TdHJpbmdIZWxwZXIoKTsKKyAgICBmaW5hbCBUb1N0cmluZ0hlbHBlclRlc3QuT3RoZXJDbGFzcyBvYmogPSBuZXcgVG9TdHJpbmdIZWxwZXJUZXN0Lk90aGVyQ2xhc3MoKTsKKyAgICBvYmoubmFtZSA9ICJmb28iOworICAgIG9iai5vdGhlciA9IG9iajsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIk90aGVyQ2xhc3MgWyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJvdGhlciA9ICIpOworICAgIFN0cmluZyBfc3RyaW5nID0gb2JqLnRvU3RyaW5nKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9zdHJpbmcsICIgICIpOworICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgibmFtZSA9IFwiZm9vXCIiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJdIik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygKKyAgICAgIFRvU3RyaW5nSGVscGVyVGVzdC50b1VuaXgoX2J1aWxkZXIudG9TdHJpbmcoKSksIGhlbHBlci50b1N0cmluZyhvYmopKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgcmVjdXJzaW9uSGFuZGxpbmdfMDIoKSB7CisgICAgZmluYWwgVG9TdHJpbmdIZWxwZXIgaGVscGVyID0gbmV3IFRvU3RyaW5nSGVscGVyKCk7CisgICAgZmluYWwgVG9TdHJpbmdIZWxwZXJUZXN0LkRhdGFDbGFzcyBvYmogPSBuZXcgVG9TdHJpbmdIZWxwZXJUZXN0LkRhdGFDbGFzcygpOworICAgIG9iai5vdGhlciA9IG9iajsKKyAgICBvYmoubmFtZSA9ICJ0ZXN0IjsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIkRhdGFDbGFzcyBbIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIm90aGVyID0gRGF0YUNsYXNzQCIpOworICAgIGludCBfaWRlbnRpdHlIYXNoQ29kZSA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG9iaik7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9pZGVudGl0eUhhc2hDb2RlLCAiICAiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIm5hbWUgPSBcInRlc3RcIiIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIl0iKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKAorICAgICAgVG9TdHJpbmdIZWxwZXJUZXN0LnRvVW5peChfYnVpbGRlci50b1N0cmluZygpKSwgaGVscGVyLnRvU3RyaW5nKG9iaikpOworICB9CisgIAorICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1VuaXgoZmluYWwgU3RyaW5nIHMpIHsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIHJlc3VsdCA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCJcbiIpOworICAgIHJlc3VsdC5hcHBlbmQocyk7CisgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL2ludGVybmFsL1RvU3RyaW5nSGVscGVyVGVzdC54dGVuZCBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvaW50ZXJuYWwvVG9TdHJpbmdIZWxwZXJUZXN0Lnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTI3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhdGVzdHMvb3JnL2VjbGlwc2UveHRleHQveGJhc2UvdGVzdHMvbGliL2ludGVybmFsL1RvU3RyaW5nSGVscGVyVGVzdC54dGVuZApAQCAtMCwwICsxLDE0MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50ZXN0cy5saWIuaW50ZXJuYWwKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5hbm5vdGF0aW9ucy5BY2Nlc3NvcnMKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnMuVG9TdHJpbmcKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb24KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIudXRpbC5Ub1N0cmluZ0J1aWxkZXIKK2ltcG9ydCBvcmcuanVuaXQuVGVzdAorCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKgorCitARGVwcmVjYXRlZAorY2xhc3MgVG9TdHJpbmdIZWxwZXJUZXN0IHsKKworCUBUZXN0IGRlZiB2b2lkIHRlc3RUb1N0cmluZygpIHsKKwkJdmFsIGhlbHBlciA9IG5ldyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIudXRpbC5Ub1N0cmluZ0hlbHBlcgorCQlhc3NlcnRFcXVhbHModG9Vbml4KAorCQkJCScnJworCQlNeUVudGl0eSBbCisJCSAgYm9vbFByb3AgPSB0cnVlCisJCSAgaW50UHJvcCA9IDQyCisJCSAgbXlMaXN0ID0gQXJyYXlMaXN0ICgKKwkJICAgICJmb28iLAorCQkgICAgImJhciIsCisJCSAgICAiYmF6IgorCQkgICkKKwkJICBmcmllbmQgPSB0cnVlCisJCSAgNDIKKwkJICBbZm9vLCBiYXIsIGJhel0KKwkJICBudWxsCisJCSAgQ0xBU1MKKwkJICBwb2xpY3kgPSBDTEFTUworCQldJycnKSwgaGVscGVyLnRvU3RyaW5nKG5ldyBNeUVudGl0eShuZXcgTXlFbnRpdHkpKSkKKwl9CisKKwlAVGVzdCBkZWYgdm9pZCB0ZXN0U2luZ2xlTGluZSgpIHsKKwkJdmFsIGhlbHBlciA9IG5ldyBUb1N0cmluZ0J1aWxkZXIobmV3IE15RW50aXR5KS5zaW5nbGVMaW5lLmFkZEFsbEZpZWxkcworCisJCWFzc2VydEVxdWFscygKKwkJCSdNeUVudGl0eSBbYm9vbFByb3AgPSB0cnVlLCBpbnRQcm9wID0gNDIsIG15TGlzdCA9IEFycmF5TGlzdCAoImZvbyIsImJhciIsImJheiIpLCBmcmllbmQgPSBudWxsLCBwb2xpY3kgPSBDTEFTU10nLAorCQkJaGVscGVyLnRvU3RyaW5nKCkpCisJfQorCisJQFRlc3QgZGVmIHZvaWQgdGVzdEhpZGVGaWVsZE5hbWVzKCkgeworCQl2YWwgaGVscGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcihuZXcgTXlFbnRpdHkpLnNpbmdsZUxpbmUuaGlkZUZpZWxkTmFtZXMuYWRkQWxsRmllbGRzCisKKwkJYXNzZXJ0RXF1YWxzKCdNeUVudGl0eSBbdHJ1ZSwgNDIsIEFycmF5TGlzdCAoImZvbyIsImJhciIsImJheiIpLCBudWxsLCBDTEFTU10nLCBoZWxwZXIudG9TdHJpbmcoKSkKKwl9CisKKwlAVGVzdCBkZWYgdm9pZCB0ZXN0U2tpcE51bGxzKCkgeworCQl2YWwgaGVscGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcihuZXcgTXlFbnRpdHkpLnNraXBOdWxscy5hZGRBbGxGaWVsZHMKKworCQlhc3NlcnRFcXVhbHModG9Vbml4KAorCQkJCScnJworCQlNeUVudGl0eSBbCisJCSAgYm9vbFByb3AgPSB0cnVlCisJCSAgaW50UHJvcCA9IDQyCisJCSAgbXlMaXN0ID0gQXJyYXlMaXN0ICgKKwkJICAgICJmb28iLAorCQkgICAgImJhciIsCisJCSAgICAiYmF6IgorCQkgICkKKwkJICBwb2xpY3kgPSBDTEFTUworCQldJycnKSwgaGVscGVyLnRvU3RyaW5nKCkpCisJfQorCisJQFRlc3QgZGVmIHZvaWQgdGVzdEV4cGxpY2l0RmllbGRMaXN0aW5nKCkgeworCQl2YWwgaGVscGVyID0gbmV3IFRvU3RyaW5nQnVpbGRlcihuZXcgTXlFbnRpdHkpLmFkZCgiYm9vbFByb3AiLCBmYWxzZSkuYWRkRmllbGQoImludFByb3AiKQorCisJCWFzc2VydEVxdWFscyh0b1VuaXgoCisJCQkJJycnCisJCU15RW50aXR5IFsKKwkJICBib29sUHJvcCA9IGZhbHNlCisJCSAgaW50UHJvcCA9IDQyCisJCV0nJycpLCBoZWxwZXIudG9TdHJpbmcoKSkKKwl9CisKKwlAVGVzdCBkZWYgdm9pZCByZWN1cnNpb25IYW5kbGluZygpIHsKKwkJdmFsIGhlbHBlciA9IG5ldyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIudXRpbC5Ub1N0cmluZ0hlbHBlcgorCQl2YWwgb2JqID0gbmV3IE90aGVyQ2xhc3MKKwkJb2JqLm5hbWUgPSAnZm9vJworCQlvYmoub3RoZXIgPSBvYmoKKworCQlhc3NlcnRFcXVhbHModG9Vbml4KAorCQkJCScnJworCQlPdGhlckNsYXNzIFsKKwkJICBvdGhlciA9IKtvYmoudG9TdHJpbme7CisJCSAgbmFtZSA9ICJmb28iCisJCV0nJycpLCBoZWxwZXIudG9TdHJpbmcob2JqKSkKKwl9CisKKwlAVGVzdCBkZWYgdm9pZCByZWN1cnNpb25IYW5kbGluZ18wMigpIHsKKwkJdmFsIGhlbHBlciA9IG5ldyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIudXRpbC5Ub1N0cmluZ0hlbHBlcgorCQl2YWwgb2JqID0gbmV3IERhdGFDbGFzcygpCisJCW9iai5vdGhlciA9IG9iagorCQlvYmoubmFtZSA9ICJ0ZXN0IgorCQlhc3NlcnRFcXVhbHModG9Vbml4KAorCQkJCScnJworCQlEYXRhQ2xhc3MgWworCQkgIG90aGVyID0gRGF0YUNsYXNzQKtTeXN0ZW06OmlkZW50aXR5SGFzaENvZGUob2JqKbsKKwkJICBuYW1lID0gInRlc3QiCisJCV0nJycpLCBoZWxwZXIudG9TdHJpbmcob2JqKSkKKwl9CisKKwlzdGF0aWMgY2xhc3MgT3RoZXJDbGFzcyB7CisJCXB1YmxpYyBPdGhlckNsYXNzIG90aGVyCisJCXB1YmxpYyBTdHJpbmcgbmFtZQorCX0KKworCUBBY2Nlc3NvcnMgQFRvU3RyaW5nIHN0YXRpYyBjbGFzcyBEYXRhQ2xhc3MgeworCQlwdWJsaWMgRGF0YUNsYXNzIG90aGVyCisJCXB1YmxpYyBTdHJpbmcgbmFtZQorCX0KKworCXN0YXRpYyBjbGFzcyBNeUVudGl0eSB7CisJCXZhbCBib29sUHJvcCA9IHRydWUKKwkJdmFsIGludFByb3AgPSA0MgorCQl2YWwgbXlMaXN0ID0gbmV3QXJyYXlMaXN0KCdmb28nLCAnYmFyJywgJ2JheicpCisJCXZhbCBNeUVudGl0eSBmcmllbmQKKwkJdmFsIFJldGVudGlvblBvbGljeSBwb2xpY3kgPSBSZXRlbnRpb25Qb2xpY3k6OkNMQVNTCisKKwkJbmV3KCkgeworCQkJdGhpcy5mcmllbmQgPSBudWxsCisJCX0KKworCQluZXcoTXlFbnRpdHkgZnJpZW5kKSB7CisJCQl0aGlzLmZyaWVuZCA9IGZyaWVuZDsKKwkJfQorCisJCW92ZXJyaWRlIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuIGJvb2xQcm9wICsgJ1xuJyArIGludFByb3AgKyAnXG4nICsgbXlMaXN0ICsgJ1xuJyArIGZyaWVuZCArICdcbicgKyBwb2xpY3kKKwkJfQorCX0KKworCWRlZiBzdGF0aWMgU3RyaW5nIHRvVW5peChTdHJpbmcgcykgeworCQl2YXIgU3RyaW5nQ29uY2F0ZW5hdGlvbiByZXN1bHQgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigiXG4iKQorCQlyZXN1bHQuYXBwZW5kKHMpCisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKQorCX0KK30KZGlmZiAtLWdpdCBhL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvdXRpbC9SZWZsZWN0RXh0ZW5zaW9uc1Rlc3QuamF2YSBiL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS94dGV4dC94YmFzZS90ZXN0cy9saWIvdXRpbC9SZWZsZWN0RXh0ZW5zaW9uc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjVkMGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXRlc3RzL29yZy9lY2xpcHNlL3h0ZXh0L3hiYXNlL3Rlc3RzL2xpYi91dGlsL1JlZmxlY3RFeHRlbnNpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UueHRleHQueGJhc2UudGVzdHMubGliLnV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRnVuY3Rpb25zLkZ1bmN0aW9uMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIudXRpbC5SZWZsZWN0RXh0ZW5zaW9uczsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgUmVmbGVjdEV4dGVuc2lvbnNUZXN0IHsKKworCXB1YmxpYyBSZWZsZWN0RXh0ZW5zaW9ucyBleHQgPSBuZXcgUmVmbGVjdEV4dGVuc2lvbnMoKTsKKwlwcml2YXRlIFJlZmxlY3RFeHRlbnNpb25zIHByaXZhdGVFeHQgPSBuZXcgUmVmbGVjdEV4dGVuc2lvbnMoKTsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludm9rZV8wMSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgeCA9ICJmb28iOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGV4dC5pbnZva2UoeCwgImxlbmd0aCIpKTsKKwl9CisKKwlAVGVzdChleHBlY3RlZD1Ob1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgdGVzdEludm9rZV8wMigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgeCA9ICJmb28iOworCQlleHQuaW52b2tlKHgsICJmb28iKTsKKwl9CisKKwlAVGVzdChleHBlY3RlZD1Ob1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgdGVzdEludm9rZV8wMygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgeCA9ICJmb28iOworCQlleHQuaW52b2tlKHgsICJsZW5ndGgiLCAyNCk7CisJfQorCisJQFRlc3QoZXhwZWN0ZWQ9SWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RJbnZva2VXaXRoT3ZlcmxvYWRlZE1ldGhvZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nQnVpbGRlciB4ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJZXh0Lmludm9rZSh4LCAiYXBwZW5kIiwgImZvbyIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludm9rZVdpdGhOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWZpbmFsIEZ1bmN0aW9uMTxTdHJpbmcsIFN0cmluZz4geCA9IChTdHJpbmcgcykgLT4geworCQkJcmV0dXJuIHM7CisJCX07CisJCU9iamVjdFtdIGFyZ3MgPSBudWxsOworCQlBc3NlcnQuYXNzZXJ0TnVsbChleHQuaW52b2tlKHgsICJhcHBseSIsIGFyZ3MpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiZm9vIiwgZXh0Lmludm9rZSh4LCAiYXBwbHkiLCAiZm9vIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludm9rZVdpdGhQcmltaXRpdmVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB4ID0gImZvbyI7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIm8iLCBleHQuaW52b2tlKHgsICJzdWJzdHJpbmciLCAxLCAyKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0XzAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlZmxlY3RFeHRlbnNpb25zVGVzdCB4ID0gbmV3IFJlZmxlY3RFeHRlbnNpb25zVGVzdCgpOworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbChleHQuZ2V0KHgsICJleHQiKSk7CisJfQorCisJQFRlc3QoZXhwZWN0ZWQ9Tm9TdWNoRmllbGRFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgdGVzdEdldF8wMigpIHRocm93cyBFeGNlcHRpb24geworCQlSZWZsZWN0RXh0ZW5zaW9uc1Rlc3QgeCA9IG5ldyBSZWZsZWN0RXh0ZW5zaW9uc1Rlc3QoKTsKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZXh0LmdldCh4LCAiZm9vIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldF8wMygpIHRocm93cyBFeGNlcHRpb24geworCQlSZWZsZWN0RXh0ZW5zaW9uc1Rlc3QgeCA9IG5ldyBSZWZsZWN0RXh0ZW5zaW9uc1Rlc3QoKTsKKwkJQXNzZXJ0LmFzc2VydFNhbWUoeC5wcml2YXRlRXh0LCBleHQuZ2V0KHgsICJwcml2YXRlRXh0IikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNldF8wMSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZWZsZWN0RXh0ZW5zaW9uc1Rlc3QgeCA9IG5ldyBSZWZsZWN0RXh0ZW5zaW9uc1Rlc3QoKTsKKwkJZXh0LnNldCh4LCAiZXh0IiwgbnVsbCk7CisJCUFzc2VydC5hc3NlcnROdWxsKHguZXh0KTsKKwl9CisKKwlAVGVzdChleHBlY3RlZD1Ob1N1Y2hGaWVsZEV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0XzAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlZmxlY3RFeHRlbnNpb25zVGVzdCB4ID0gbmV3IFJlZmxlY3RFeHRlbnNpb25zVGVzdCgpOworCQlleHQuc2V0KHgsICJmb28iLCAiYmFyIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0XzAzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlZmxlY3RFeHRlbnNpb25zVGVzdCB4ID0gbmV3IFJlZmxlY3RFeHRlbnNpb25zVGVzdCgpOworCQlleHQuc2V0KHgsICJwcml2YXRlRXh0IiwgbnVsbCk7CisJCUFzc2VydC5hc3NlcnROdWxsKHgucHJpdmF0ZUV4dCk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=