ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hZ2YvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYWdmLnplc3Qvc3JjL29yZy9lY2xpcHNlL2FtcC9hZ2YvemVzdC9aZXN0Q29udGVudFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYWdmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFnZi56ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYWdmL3plc3QvWmVzdENvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDc4MDQwOTcuLjlkYjU5ZDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hZ2YvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYWdmLnplc3Qvc3JjL29yZy9lY2xpcHNlL2FtcC9hZ2YvemVzdC9aZXN0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFnZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hZ2YuemVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2FnZi96ZXN0L1plc3RDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMzEsNTkgKzMxLDYyIEBACiAvKioKICAqIAogICogQGF1dGhvciBtcGFya2VyCi0gKgorICogCiAgKi8KIHB1YmxpYyBjbGFzcyBaZXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSUdyYXBoRW50aXR5Q29udGVudFByb3ZpZGVyIHsKIAotICAgIElHcmFwaFByb3ZpZGVyIGdyYXBoUHJvdmlkZXI7CisJSUdyYXBoUHJvdmlkZXIgZ3JhcGhQcm92aWRlcjsKIAotICAgIElDb21wb3NpdGlvblByb3ZpZGVyIGNvbXBvc3Rpb25Qcm92aWRlcjsKKwlJQ29tcG9zaXRpb25Qcm92aWRlciBjb21wb3N0aW9uUHJvdmlkZXI7CiAKLSAgICBwcml2YXRlIENvbGxlY3Rpb248T2JqZWN0PiBncmFwaHM7CisJcHJpdmF0ZSBDb2xsZWN0aW9uPE9iamVjdD4gZ3JhcGhzOwogCi0gICAgcHVibGljIFplc3RDb250ZW50UHJvdmlkZXIoSUdyYXBoUHJvdmlkZXIgZ3JhcGhQcm92aWRlciwgSUNvbXBvc2l0aW9uUHJvdmlkZXIgY29tcG9zdGlvblByb3ZpZGVyKSB7Ci0gICAgICAgIHRoaXMuZ3JhcGhQcm92aWRlciA9IGdyYXBoUHJvdmlkZXI7Ci0gICAgICAgIHRoaXMuY29tcG9zdGlvblByb3ZpZGVyID0gY29tcG9zdGlvblByb3ZpZGVyOwotICAgIH0KKwlwdWJsaWMgWmVzdENvbnRlbnRQcm92aWRlcihJR3JhcGhQcm92aWRlciBncmFwaFByb3ZpZGVyLCBJQ29tcG9zaXRpb25Qcm92aWRlciBjb21wb3N0aW9uUHJvdmlkZXIpIHsKKwkJdGhpcy5ncmFwaFByb3ZpZGVyID0gZ3JhcGhQcm92aWRlcjsKKwkJdGhpcy5jb21wb3N0aW9uUHJvdmlkZXIgPSBjb21wb3N0aW9uUHJvdmlkZXI7CisJfQogCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgfQorCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCX0KIAotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgfQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJfQogCi0gICAgQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3RHcmFwaHMoT2JqZWN0IHBhcmVudCwgQ29sbGVjdGlvbjxPYmplY3Q+IGJ1aWxkQ29sbGVjdGlvbikgewotICAgICAgICBpZiAoZ3JhcGhQcm92aWRlci5pc0dyYXBoKHBhcmVudCkpIHsKLSAgICAgICAgICAgIGJ1aWxkQ29sbGVjdGlvbi5hZGQocGFyZW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tcG9zdGlvblByb3ZpZGVyLmlzQ2hpbGRyZW5Db21wb3NpdGlvbihwYXJlbnQpKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBjaGlsZCA6IGNvbXBvc3Rpb25Qcm92aWRlci5nZXRJdGVyYXRhYmxlKHBhcmVudCkpIHsKLSAgICAgICAgICAgICAgICBjb2xsZWN0R3JhcGhzKGNoaWxkLCBidWlsZENvbGxlY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZENvbGxlY3Rpb247Ci0gICAgfQorCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0R3JhcGhzKE9iamVjdCBwYXJlbnQsIENvbGxlY3Rpb248T2JqZWN0PiBidWlsZENvbGxlY3Rpb24pIHsKKwkJaWYgKGdyYXBoUHJvdmlkZXIuaXNHcmFwaChwYXJlbnQpKSB7CisJCQlidWlsZENvbGxlY3Rpb24uYWRkKHBhcmVudCk7CisJCX0KKwkJaWYgKGNvbXBvc3Rpb25Qcm92aWRlci5pc0NoaWxkcmVuQ29tcG9zaXRpb24ocGFyZW50KSkgeworCQkJZm9yIChPYmplY3QgY2hpbGQgOiBjb21wb3N0aW9uUHJvdmlkZXIuZ2V0SXRlcmF0YWJsZShwYXJlbnQpKSB7CisJCQkJY29sbGVjdEdyYXBocyhjaGlsZCwgYnVpbGRDb2xsZWN0aW9uKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYnVpbGRDb2xsZWN0aW9uOworCX0KIAotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7Ci0gICAgICAgIENvbGxlY3Rpb24gYWxsRWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBncmFwaHMgPSBjb2xsZWN0R3JhcGhzKHBhcmVudCwgbmV3IEhhc2hTZXQ8T2JqZWN0PigpKTsKLSAgICAgICAgZm9yIChPYmplY3QgZ3JhcGggOiBncmFwaHMpIHsKLSAgICAgICAgICAgIE1hcDxPYmplY3QsIE9iamVjdD4gZ3JhcGhNYXAgPSBncmFwaFByb3ZpZGVyLmdldEFkamFjZW5jeU1hcChncmFwaCk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uIHZhbHVlcyA9IGdyYXBoTWFwLnZhbHVlcygpOwotICAgICAgICAgICAgZm9yIChPYmplY3QgdmFsdWVNZW1iZXIgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgICAgICBhbGxFbGVtZW50cy5hZGRBbGwoKChDb2xsZWN0aW9uKSB2YWx1ZU1lbWJlcikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWxsRWxlbWVudHMuYWRkQWxsKGdyYXBoTWFwLmtleVNldCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWxsRWxlbWVudHMudG9BcnJheSgpOwotICAgIH0KKwlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgeworCQlDb2xsZWN0aW9uIGFsbEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKKwkJZ3JhcGhzID0gY29sbGVjdEdyYXBocyhwYXJlbnQsIG5ldyBIYXNoU2V0PE9iamVjdD4oKSk7CisJCWZvciAoT2JqZWN0IGdyYXBoIDogZ3JhcGhzKSB7CisJCQlNYXA8T2JqZWN0LCBPYmplY3Q+IGdyYXBoTWFwID0gZ3JhcGhQcm92aWRlci5nZXRBZGphY2VuY3lNYXAoZ3JhcGgpOworCQkJQ29sbGVjdGlvbiB2YWx1ZXMgPSBncmFwaE1hcC52YWx1ZXMoKTsKKwkJCWZvciAoT2JqZWN0IHZhbHVlTWVtYmVyIDogdmFsdWVzKSB7CisJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHZhbHVlTWVtYmVyOworCQkJCWlmICghY29sbGVjdGlvbi5pc0VtcHR5KCkgJiYgY29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSAhPSBudWxsKSB7CisJCQkJCWFsbEVsZW1lbnRzLmFkZEFsbChjb2xsZWN0aW9uKTsKKwkJCQl9CisJCQl9CisJCQlhbGxFbGVtZW50cy5hZGRBbGwoZ3JhcGhNYXAua2V5U2V0KCkpOworCQl9CisJCXJldHVybiBhbGxFbGVtZW50cy50b0FycmF5KCk7CisJfQogCi0gICAgcHVibGljIE9iamVjdFtdIGdldENvbm5lY3RlZFRvKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgTGlzdCBuZWlnaGJvcnNGb3IgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIC8vIFRPRE8gb25lIGdyYXBoIG9wdGltaXphdGlvbgotICAgICAgICBmb3IgKE9iamVjdCBncmFwaCA6IGdyYXBocykgewotICAgICAgICAgICAgbmVpZ2hib3JzRm9yLmFkZEFsbChncmFwaFByb3ZpZGVyLmdldE5laWdoYm9yc0ZvcihncmFwaCwgb2JqZWN0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5laWdoYm9yc0Zvci50b0FycmF5KCk7Ci0gICAgfQorCXB1YmxpYyBPYmplY3RbXSBnZXRDb25uZWN0ZWRUbyhPYmplY3Qgb2JqZWN0KSB7CisJCUxpc3QgbmVpZ2hib3JzRm9yID0gbmV3IEFycmF5TGlzdCgpOworCQkvLyBUT0RPIG9uZSBncmFwaCBvcHRpbWl6YXRpb24KKwkJZm9yIChPYmplY3QgZ3JhcGggOiBncmFwaHMpIHsKKwkJCW5laWdoYm9yc0Zvci5hZGRBbGwoZ3JhcGhQcm92aWRlci5nZXROZWlnaGJvcnNGb3IoZ3JhcGgsIG9iamVjdCkpOworCQl9CisJCXJldHVybiBuZWlnaGJvcnNGb3IudG9BcnJheSgpOworCX0KIH07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9leGFtcGxlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmV4YW1wbGVzLnNkL3NyY2dlbi9zZGwvU0lSL3NkL1NJUi5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9leGFtcGxlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmV4YW1wbGVzLnNkL3NyY2dlbi9zZGwvU0lSL3NkL1NJUi5qYXZhCmluZGV4IDUxMjg2MjcuLmZiN2U3NjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvZXhhbXBsZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5zZC9zcmNnZW4vc2RsL1NJUi9zZC9TSVIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuc2Qvc3JjZ2VuL3NkbC9TSVIvc2QvU0lSLmphdmEKQEAgLTIxMyw3ICsyMTMsNyBAQAogCQkJCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkJCQkJICogQGdlbmVyYXRlZAogCQkJCQkgKi8KLQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg0NjE0NDQ0NjQwMjA5ODkzTDsKKwkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKIAkJCQkJLyoqCiAJCQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi5nZW4uZXNjYXBlL3NyYy9tZXRhYWJtL2VzY2FwZS90bXBsL0VzY2FwZUFzcGVjdC54cHQgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi5nZW4uZXNjYXBlL3NyYy9tZXRhYWJtL2VzY2FwZS90bXBsL0VzY2FwZUFzcGVjdC54cHQKaW5kZXggMmU4ZDEzZS4uYmFhODMyNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYuZ2VuLmVzY2FwZS9zcmMvbWV0YWFibS9lc2NhcGUvdG1wbC9Fc2NhcGVBc3BlY3QueHB0CisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLmdlbi5lc2NhcGUvc3JjL21ldGFhYm0vZXNjYXBlL3RtcGwvRXNjYXBlQXNwZWN0LnhwdApAQCAtMjczLDcgKzI3Myw3IEBACiAgICAgq0VMU0VJRiBmdW5jdGlvbi5pZCgpID09ICJ1bmlmb3JtRGlzdHJpYnV0aW9uIi27CiAgICAgICAgIHJhbmRvbUluUmFuZ2Uoq2lucHV0cy5leHByZXNzaW9uKHBhdGgsIGlubmVyKS50b1N0cmluZygiLCAiKbspOwogICAgIKtFTFNFSUYgZnVuY3Rpb24uaWQoKSA9PSAidGltZU5vdyItuwotCQmrcGF0aC5sYXN0KCkuYWNjZXNzUGF0aCh0aGlzLCBpbm5lcim7q3JlZmVyZW5jZS5vd25lci5wYXJlbnQgIT0gbnVsbCA/ICJnZXRTY2FwZSgpLiIgOiAiIrtnZXRQZXJpb2QoKQorCQmrcGF0aC5sYXN0KCkuYWNjZXNzUGF0aCh0aGlzLCBpbm5lcim7q3JlZmVyZW5jZS5vd25lciAhPSBudWxsID8gImdldFNjYXBlKCkuIiA6ICIiu2dldFBlcmlvZCgpCiAgICAgq0VMU0VJRiBmdW5jdGlvbi5pZCgpID09ICJhdmFpbGFibGUiLbsKICAgICAgICAgaXNBdmFpbGFibGUoKQogICAgIKtFTFNFSUYgZnVuY3Rpb24uaWQoKSA9PSAid2l0aGluQm91bmRhcmllcyItuwo=