ZGlmZiAtLWdpdCBhL0xJQ0VOU0UudHh0IGIvTElDRU5TRS50eHQKaW5kZXggNDM4NjZhYy4uZmQyN2IzZSAxMDA2NDQKLS0tIGEvTElDRU5TRS50eHQKKysrIGIvTElDRU5TRS50eHQKQEAgLTEsNyArMSw3IEBACiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBPTkFQIFBvcnRhbAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQ29weXJpZ2h0IKkgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KK0NvcHlyaWdodCAoYykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIGFsbCBzb2Z0d2FyZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkCkBAIC0xOCw3ICsxOCw3IEBACiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIGFsbCBkb2N1bWVudGF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQKLXVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIExpY2Vuc2UsIEF0dHJpYnV0aW9uIDQuMCBJbnRsLiAodGhlIL9MaWNlbnNlvyk7Cit1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBMaWNlbnNlLCBBdHRyaWJ1dGlvbiA0LjAgSW50bC4gKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZG9jdW1lbnRhdGlvbiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKZGlmZiAtLWdpdCBhL2RlbGl2ZXJpZXMvZG9ja2VyLWNvbXBvc2UueW1sIGIvZGVsaXZlcmllcy9kb2NrZXItY29tcG9zZS55bWwKaW5kZXggZWM4ZmQ3Yi4uNTRiNjcwNyAxMDA2NDQKLS0tIGEvZGVsaXZlcmllcy9kb2NrZXItY29tcG9zZS55bWwKKysrIGIvZGVsaXZlcmllcy9kb2NrZXItY29tcG9zZS55bWwKQEAgLTcsNiArNyw5IEBACiAKIHNlcnZpY2VzOgogCisgICMgQXZhaWxhYmxlIGZyb20gT05BUCBOZXh1cyByZXBvc2l0b3J5OgorICAjIGRvY2tlciBsb2dpbiAtdSBVU0VSIC1wIFBBU1MgbmV4dXMzLm9uYXAub3JnOjEwMDAxCisgICMgZG9ja2VyIHB1bGwgbmV4dXMzLm9uYXAub3JnOjEwMDAxL29uYXAvY2xpOjEuMS1TVEFHSU5HLWxhdGVzdAogICBjbGk6CiAgICAgaW1hZ2U6IG9uYXAvY2xpOiR7UE9SVEFMX1RBR30KICAgICBlbnZpcm9ubWVudDoKQEAgLTQ2LDcgKzQ5LDcgQEAKICAgICBjb21tYW5kOgogICAgICAgLSAvd2FpdC1mb3Iuc2gKICAgICAgIC0gLXQKLSAgICAgIC0gIjYwIgorICAgICAgLSAiMTgwIgogICAgICAgLSBwb3J0YWwtZGI6MzMwNgogICAgICAgLSAtLQogICAgICAgLSAvc3RhcnQtd21zLWNtZC5zaApAQCAtODYsNyArODksNyBAQAogICAgIGNvbW1hbmQ6CiAgICAgICAtIC93YWl0LWZvci5zaAogICAgICAgLSAtdAotICAgICAgLSAiNjAiCisgICAgICAtICIxODAiCiAgICAgICAtIHBvcnRhbC1kYjozMzA2CiAgICAgICAtIC0tCiAgICAgICAtIC9zdGFydC1hcHBzLWNtZC5zaApkaWZmIC0tZ2l0IGEvZWNvbXAtcG9ydGFsLUJFLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvcG9ydGFsYXBwL3BvcnRhbC9jb250cm9sbGVyL0V4dGVybmFsQWNjZXNzUm9sZXNDb250cm9sbGVyLmphdmEgYi9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL2NvbnRyb2xsZXIvRXh0ZXJuYWxBY2Nlc3NSb2xlc0NvbnRyb2xsZXIuamF2YQppbmRleCA0M2UwN2FmLi5mYWJmNWUxIDEwMDY0NAotLS0gYS9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL2NvbnRyb2xsZXIvRXh0ZXJuYWxBY2Nlc3NSb2xlc0NvbnRyb2xsZXIuamF2YQorKysgYi9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL2NvbnRyb2xsZXIvRXh0ZXJuYWxBY2Nlc3NSb2xlc0NvbnRyb2xsZXIuamF2YQpAQCAtOSwxNCArOSwyNSBAQAogCiBpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxhcHAucG9ydGFsLmRvbWFpbi5DZW50cmFsUm9sZUZ1bmN0aW9uOwogaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsYXBwLnBvcnRhbC5kb21haW4uRVBBcHA7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxhcHAucG9ydGFsLmRvbWFpbi5FUFVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxhcHAucG9ydGFsLmRvbWFpbi5FY29tcEF1ZGl0TG9nOwogaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsYXBwLnBvcnRhbC5lY29tcC5tb2RlbC5Qb3J0YWxSZXN0UmVzcG9uc2U7CiBpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxhcHAucG9ydGFsLmVjb21wLm1vZGVsLlBvcnRhbFJlc3RTdGF0dXNFbnVtOwogaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsYXBwLnBvcnRhbC5sb2dnaW5nLmFvcC5FUEF1ZGl0TG9nOworaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsYXBwLnBvcnRhbC5sb2dnaW5nLmFvcC5FUEVFTEZMb2dnZXJBZHZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxhcHAucG9ydGFsLmxvZ2dpbmcubG9naWMuRVBMb2dVdGlsOwogaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsYXBwLnBvcnRhbC5zZXJ2aWNlLkV4dGVybmFsQWNjZXNzUm9sZXNTZXJ2aWNlOwogaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsYXBwLnBvcnRhbC50cmFuc3BvcnQuQ2VudHJhbFJvbGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxhcHAucG9ydGFsLnV0aWxzLkVQQ29tbW9uU3lzdGVtUHJvcGVydGllczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbGFwcC5wb3J0YWwudXRpbHMuRWNvbXBQb3J0YWxVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbGFwcC5wb3J0YWwudXRpbHMuUG9ydGFsQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsc2RrLmNvcmUuZG9tYWluLkF1ZGl0TG9nOwogaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsc2RrLmNvcmUuZG9tYWluLlJvbGU7CiBpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxzZGsuY29yZS5kb21haW4uUm9sZUZ1bmN0aW9uOwogaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsc2RrLmNvcmUubG9nZ2luZy5sb2dpYy5FRUxGTG9nZ2VyRGVsZWdhdGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxzZGsuY29yZS5zZXJ2aWNlLkF1ZGl0U2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbHNkay5jb3JlLnV0aWwuU3lzdGVtUHJvcGVydGllczsKK2ltcG9ydCBvcmcuc2xmNGouTURDOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5FbmFibGVBc3BlY3RKQXV0b1Byb3h5OwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5QYXRoVmFyaWFibGU7CkBAIC0zNyw2ICs0OCwxMSBAQAogQEVQQXVkaXRMb2cKIHB1YmxpYyBjbGFzcyBFeHRlcm5hbEFjY2Vzc1JvbGVzQ29udHJvbGxlciBpbXBsZW1lbnRzIEJhc2ljQXV0aGVudGljYXRpb25Db250cm9sbGVyIHsKIAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dJTl9JRCA9ICJMb2dpbklkIjsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIEF1ZGl0U2VydmljZSBhdWRpdFNlcnZpY2U7CisJCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVFQktFWSA9ICJ1ZWJrZXkiOwogCiAJcHJpdmF0ZSBzdGF0aWMgRUVMRkxvZ2dlckRlbGVnYXRlIGxvZ2dlciA9IEVFTEZMb2dnZXJEZWxlZ2F0ZS5nZXRMb2dnZXIoRXh0ZXJuYWxBY2Nlc3NSb2xlc0NvbnRyb2xsZXIuY2xhc3MpOwpAQCAtNTEsNyArNjcsNyBAQAogCQkKIAkJU3RyaW5nIGFuc3dlciA9IG51bGw7CiAJCXRyeSB7Ci0JCQlhbnN3ZXIgPSBleHRlcm5hbEFjY2Vzc1JvbGVzU2VydmljZS5nZXRVc2VyKGxvZ2luSWQsIHJlcXVlc3QuZ2V0SGVhZGVyKFVFQktFWSkpOworCQkJYW5zd2VyID0gZXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2UuZ2V0VXNlcldpdGhSb2xlcyhsb2dpbklkLCByZXF1ZXN0LmdldEhlYWRlcihVRUJLRVkpKTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJnZXRVc2VyIGZhaWxlZCIsIGUpOwogCQl9CkBAIC02Niw3ICs4Miw3IEBACiAJCUxpc3Q8RVBBcHA+IGFwcGxpY2F0aW9uTGlzdD1uZXcgQXJyYXlMaXN0PD4oKTsKIAkJYXBwbGljYXRpb25MaXN0ID0gZXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2UuZ2V0QXBwKHJlcXVlc3QuZ2V0SGVhZGVyKFVFQktFWSkpOwogCQlFUEFwcCBhcHAgPSBhcHBsaWNhdGlvbkxpc3QuZ2V0KDApOwotICAgICAgICBleHRlcm5hbEFjY2Vzc1JvbGVzU2VydmljZS5TeW5jQXBwbGljYXRpb25Sb2xlc1dpdGhFY29tcERCKGFwcCk7CisgICAgICAgIGV4dGVybmFsQWNjZXNzUm9sZXNTZXJ2aWNlLnN5bmNBcHBsaWNhdGlvblJvbGVzV2l0aEVjb21wREIoYXBwKTsKIAkJTGlzdDxDZW50cmFsUm9sZT4gYW5zd2VyID0gbnVsbDsKIAkJdHJ5IHsKIAkJCWFuc3dlciA9IGV4dGVybmFsQWNjZXNzUm9sZXNTZXJ2aWNlLmdldFJvbGVzRm9yQXBwKHJlcXVlc3QuZ2V0SGVhZGVyKFVFQktFWSkpOwpAQCAtMTQxLDcgKzE1NywzOCBAQAogCQkJIFN0cmluZyBkYXRhID0gcm9sZUZ1bmM7CiAJCQlDZW50cmFsUm9sZUZ1bmN0aW9uIGF2YWlsYWJsZVJvbGVGdW5jdGlvbiA9IG1hcHBlci5yZWFkVmFsdWUoZGF0YSwgQ2VudHJhbFJvbGVGdW5jdGlvbi5jbGFzcyk7CiAJCQlhdmFpbGFibGVSb2xlRnVuY3Rpb24uc2V0QXBwSWQoYXBwSWQpOwotCQkJZXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2Uuc2F2ZUNlbnRyYWxSb2xlRnVuY3Rpb24oYXZhaWxhYmxlUm9sZUZ1bmN0aW9uLCByZXF1ZXN0ZWRBcHApOworCQkJYm9vbGVhbiBzYXZlT3JVcGRhdGVSZXNwb25zZSA9IGV4dGVybmFsQWNjZXNzUm9sZXNTZXJ2aWNlLnNhdmVDZW50cmFsUm9sZUZ1bmN0aW9uKGF2YWlsYWJsZVJvbGVGdW5jdGlvbiwgcmVxdWVzdGVkQXBwKTsKKwkJCWlmKHNhdmVPclVwZGF0ZVJlc3BvbnNlKXsKKwkJCQlFUFVzZXIgdXNlciA9IGV4dGVybmFsQWNjZXNzUm9sZXNTZXJ2aWNlLmdldFVzZXIocmVxdWVzdC5nZXRIZWFkZXIoTE9HSU5fSUQpKS5nZXQoMCk7CisJCQkJRVBBcHAgYXBwID0gZXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2UuZ2V0QXBwKHJlcXVlc3QuZ2V0SGVhZGVyKFVFQktFWSkpLmdldCgwKTsKKwkJCQlDZW50cmFsUm9sZUZ1bmN0aW9uIGZ1bmN0aW9uID0gZXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2UuZ2V0Um9sZUZ1bmN0aW9uKGF2YWlsYWJsZVJvbGVGdW5jdGlvbi5nZXRDb2RlKCksIHJlcXVlc3QuZ2V0SGVhZGVyKFVFQktFWSkpOworCQkJCVN0cmluZyBhY3Rpdml0eUNvZGUgPSAoZnVuY3Rpb24uZ2V0Q29kZSgpID09IG51bGwpID8gRWNvbXBBdWRpdExvZy5DRF9BQ1RJVklUWV9FWFRFUk5BTF9BVVRIX0FERF9GVU5DVElPTjogRWNvbXBBdWRpdExvZy5DRF9BQ1RJVklUWV9FWFRFUk5BTF9BVVRIX1VQREFURV9GVU5DVElPTjsKKwkJCQlsb2dnZXIuaW5mbyhFRUxGTG9nZ2VyRGVsZWdhdGUuYXBwbGljYXRpb25Mb2dnZXIsICJzYXZlUm9sZUZ1bmN0aW9uOiBzdWNjZWVkZWQgZm9yIGFwcCB7fSwgZnVuY3Rpb24ge30iLAorCQkJCQkJYXBwLmdldElkKCksIGF2YWlsYWJsZVJvbGVGdW5jdGlvbi5nZXRDb2RlKCkpOworCQkJCUF1ZGl0TG9nIGF1ZGl0TG9nID0gbmV3IEF1ZGl0TG9nKCk7CisJCQkJYXVkaXRMb2cuc2V0VXNlcklkKHVzZXIuZ2V0SWQoKSk7CisJCQkJYXVkaXRMb2cuc2V0QWN0aXZpdHlDb2RlKGFjdGl2aXR5Q29kZSk7CisJCQkJYXVkaXRMb2cuc2V0Q29tbWVudHMoRWNvbXBQb3J0YWxVdGlscy50cnVuY2F0ZVN0cmluZygic2F2ZVJvbGVGdW5jdGlvbiByb2xlIGZvciBhcHA6IithcHAuZ2V0SWQoKSsiIGFuZCBmdW5jdGlvbjonIithdmFpbGFibGVSb2xlRnVuY3Rpb24uZ2V0Q29kZSgpKyInIiwgUG9ydGFsQ29uc3RhbnRzLkFVRElUX0xPR19DT01NRU5UX1NJWkUpKTsKKwkJCQlhdWRpdExvZy5zZXRBZmZlY3RlZFJlY29yZElkKHVzZXIuZ2V0T3JnVXNlcklkKCkpOworCQkJCWF1ZGl0U2VydmljZS5sb2dBY3Rpdml0eShhdWRpdExvZywgbnVsbCk7CisJCQkJTURDLnB1dChFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuQVVESVRMT0dfQkVHSU5fVElNRVNUQU1QLAorCQkJCQkJRVBFRUxGTG9nZ2VyQWR2aWNlLmdldEN1cnJlbnREYXRlVGltZVVUQygpKTsKKwkJCQlNREMucHV0KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5BVURJVExPR19FTkRfVElNRVNUQU1QLAorCQkJCQkJRVBFRUxGTG9nZ2VyQWR2aWNlLmdldEN1cnJlbnREYXRlVGltZVVUQygpKTsKKwkJCQlFY29tcFBvcnRhbFV0aWxzLmNhbGN1bGF0ZURhdGVUaW1lRGlmZmVyZW5jZUZvckxvZygKKwkJCQkJCU1EQy5nZXQoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkFVRElUTE9HX0JFR0lOX1RJTUVTVEFNUCksCisJCQkJCQlNREMuZ2V0KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5BVURJVExPR19FTkRfVElNRVNUQU1QKSk7CisJCQkJbG9nZ2VyLmluZm8oRUVMRkxvZ2dlckRlbGVnYXRlLmF1ZGl0TG9nZ2VyLAorCQkJCQkJRVBMb2dVdGlsLmZvcm1hdEF1ZGl0TG9nTWVzc2FnZSgiRXh0ZXJuYWxBY2Nlc3NSb2xlc0NvbnRyb2xsZXIuc2F2ZVJvbGVGdW5jdGlvbiIsCisJCQkJCQkJCWFjdGl2aXR5Q29kZSwgU3RyaW5nLnZhbHVlT2YodXNlci5nZXRJZCgpKSwKKwkJCQkJCQkJdXNlci5nZXRPcmdVc2VySWQoKSwgYXZhaWxhYmxlUm9sZUZ1bmN0aW9uLmdldENvZGUoKSkpOworCQkJCU1EQy5yZW1vdmUoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkFVRElUTE9HX0JFR0lOX1RJTUVTVEFNUCk7CisJCQkJTURDLnJlbW92ZShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuQVVESVRMT0dfRU5EX1RJTUVTVEFNUCk7CisJCQkJTURDLnJlbW92ZShTeXN0ZW1Qcm9wZXJ0aWVzLk1EQ19USU1FUik7CisJCQl9IGVsc2V7CisJCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgInNhdmVSb2xlRnVuY3Rpb24gZmFpbGVkIik7CisJCQkJcmV0dXJuIG5ldyBQb3J0YWxSZXN0UmVzcG9uc2U8U3RyaW5nPihQb3J0YWxSZXN0U3RhdHVzRW51bS5FUlJPUiwgIkZhaWxlZCB0byBzYXZlUm9sZUZ1bmN0aW9uIGZvciAnIithdmFpbGFibGVSb2xlRnVuY3Rpb24uZ2V0Q29kZSgpKyInIiwgIkZhaWxlZCIpOworCQkJfQogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgInNhdmVSb2xlRnVuY3Rpb24gZmFpbGVkIiwgZSk7CiAJCQlyZXR1cm4gbmV3IFBvcnRhbFJlc3RSZXNwb25zZTxTdHJpbmc+KFBvcnRhbFJlc3RTdGF0dXNFbnVtLkVSUk9SLCBlLmdldE1lc3NhZ2UoKSwgIkZhaWxlZCIpOwpAQCAtMTUzLDEzICsyMDAsNDIgQEAKIAlAUmVxdWVzdE1hcHBpbmcodmFsdWUgPSB7ICIvcm9sZUZ1bmN0aW9uL3tjb2RlfSIgfSwgbWV0aG9kID0gUmVxdWVzdE1ldGhvZC5ERUxFVEUsIHByb2R1Y2VzID0gImFwcGxpY2F0aW9uL2pzb24iKQogCXB1YmxpYyAgUG9ydGFsUmVzdFJlc3BvbnNlPFN0cmluZz4gZGVsZXRlUm9sZUZ1bmN0aW9uKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBAUGF0aFZhcmlhYmxlKCJjb2RlIikgU3RyaW5nIGNvZGUpIHRocm93cyBFeGNlcHRpb24gewogCQl0cnkgewotCQkJZXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2UuZGVsZXRlQ2VudHJhbFJvbGVGdW5jdGlvbihjb2RlLCByZXF1ZXN0LmdldEhlYWRlcihVRUJLRVkpKTsKKwkJCUVQVXNlciB1c2VyID0gZXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2UuZ2V0VXNlcihyZXF1ZXN0LmdldEhlYWRlcihMT0dJTl9JRCkpLmdldCgwKTsKKwkJCUVQQXBwIGFwcCA9IGV4dGVybmFsQWNjZXNzUm9sZXNTZXJ2aWNlLmdldEFwcChyZXF1ZXN0LmdldEhlYWRlcihVRUJLRVkpKS5nZXQoMCk7CisJCQlib29sZWFuIGdldERlbEZ1bmNSZXNwb25zZSA9IGV4dGVybmFsQWNjZXNzUm9sZXNTZXJ2aWNlLmRlbGV0ZUNlbnRyYWxSb2xlRnVuY3Rpb24oY29kZSwgYXBwKTsKKwkJCWlmKGdldERlbEZ1bmNSZXNwb25zZSl7CisJCQkJbG9nZ2VyLmluZm8oRUVMRkxvZ2dlckRlbGVnYXRlLmFwcGxpY2F0aW9uTG9nZ2VyLCAiZGVsZXRlUm9sZUZ1bmN0aW9uOiBzdWNjZWVkZWQgZm9yIGFwcCB7fSwgcm9sZSB7fSIsCisJCQkJCQlhcHAuZ2V0SWQoKSwgY29kZSk7CisJCQkJQXVkaXRMb2cgYXVkaXRMb2cgPSBuZXcgQXVkaXRMb2coKTsKKwkJCQlhdWRpdExvZy5zZXRVc2VySWQodXNlci5nZXRJZCgpKTsKKwkJCQlhdWRpdExvZy5zZXRBY3Rpdml0eUNvZGUoRWNvbXBBdWRpdExvZy5DRF9BQ1RJVklUWV9FWFRFUk5BTF9BVVRIX0RFTEVURV9GVU5DVElPTik7CisJCQkJYXVkaXRMb2cuc2V0Q29tbWVudHMoRWNvbXBQb3J0YWxVdGlscy50cnVuY2F0ZVN0cmluZygiRGVsZXRlZCBmdW5jdGlvbiBmb3IgYXBwOiIrYXBwLmdldElkKCkrIiBhbmQgZnVuY3Rpb24gY29kZTonIitjb2RlKyInIiwgUG9ydGFsQ29uc3RhbnRzLkFVRElUX0xPR19DT01NRU5UX1NJWkUpKTsKKwkJCQlhdWRpdExvZy5zZXRBZmZlY3RlZFJlY29yZElkKHVzZXIuZ2V0T3JnVXNlcklkKCkpOworCQkJCWF1ZGl0U2VydmljZS5sb2dBY3Rpdml0eShhdWRpdExvZywgbnVsbCk7CisJCQkJTURDLnB1dChFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuQVVESVRMT0dfQkVHSU5fVElNRVNUQU1QLAorCQkJCQkJRVBFRUxGTG9nZ2VyQWR2aWNlLmdldEN1cnJlbnREYXRlVGltZVVUQygpKTsKKwkJCQlNREMucHV0KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5BVURJVExPR19FTkRfVElNRVNUQU1QLAorCQkJCQkJRVBFRUxGTG9nZ2VyQWR2aWNlLmdldEN1cnJlbnREYXRlVGltZVVUQygpKTsKKwkJCQlFY29tcFBvcnRhbFV0aWxzLmNhbGN1bGF0ZURhdGVUaW1lRGlmZmVyZW5jZUZvckxvZygKKwkJCQkJCU1EQy5nZXQoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkFVRElUTE9HX0JFR0lOX1RJTUVTVEFNUCksCisJCQkJCQlNREMuZ2V0KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5BVURJVExPR19FTkRfVElNRVNUQU1QKSk7CisJCQkJbG9nZ2VyLmluZm8oRUVMRkxvZ2dlckRlbGVnYXRlLmF1ZGl0TG9nZ2VyLAorCQkJCQkJRVBMb2dVdGlsLmZvcm1hdEF1ZGl0TG9nTWVzc2FnZSgiRXh0ZXJuYWxBY2Nlc3NSb2xlc0NvbnRyb2xsZXIuZGVsZXRlUm9sZUZ1bmN0aW9uIiwKKwkJCQkJCQkJRWNvbXBBdWRpdExvZy5DRF9BQ1RJVklUWV9FWFRFUk5BTF9BVVRIX0RFTEVURV9GVU5DVElPTiwgU3RyaW5nLnZhbHVlT2YodXNlci5nZXRJZCgpKSwKKwkJCQkJCQkJdXNlci5nZXRPcmdVc2VySWQoKSwgY29kZSkpOworCQkJCU1EQy5yZW1vdmUoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkFVRElUTE9HX0JFR0lOX1RJTUVTVEFNUCk7CisJCQkJTURDLnJlbW92ZShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuQVVESVRMT0dfRU5EX1RJTUVTVEFNUCk7CisJCQkJTURDLnJlbW92ZShTeXN0ZW1Qcm9wZXJ0aWVzLk1EQ19USU1FUik7CisJCQl9IGVsc2V7CisJCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImRlbGV0ZVJvbGVGdW5jdGlvbiBmYWlsZWQiKTsKKwkJCQlyZXR1cm4gbmV3IFBvcnRhbFJlc3RSZXNwb25zZTxTdHJpbmc+KFBvcnRhbFJlc3RTdGF0dXNFbnVtLkVSUk9SLCAiRmFpbGVkIHRvIGRlbGV0ZVJvbGVGdW5jdGlvbiBmb3IgJyIrY29kZSsiJyIsICJGYWlsZWQiKTsKKwkJCX0KIAkJfSBjYXRjaCAoSHR0cENsaWVudEVycm9yRXhjZXB0aW9uIGUpIHsKIAkJCXJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUKTsKIAkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJkZWxldGVSb2xlRnVuY3Rpb24gZmFpbGVkIiwgZSk7Ci0JCQlyZXR1cm4gbmV3IFBvcnRhbFJlc3RSZXNwb25zZTxTdHJpbmc+KFBvcnRhbFJlc3RTdGF0dXNFbnVtLkVSUk9SLCAiRmFpbGVkIHRvIGRlbGV0ZVJvbGVGdW5jdGlvbiIsICJGYWlsZWQiKTsKKwkJCXJldHVybiBuZXcgUG9ydGFsUmVzdFJlc3BvbnNlPD4oUG9ydGFsUmVzdFN0YXR1c0VudW0uRVJST1IsICJGYWlsZWQgdG8gZGVsZXRlUm9sZUZ1bmN0aW9uIGZvciAnIitjb2RlKyInIiwgIkZhaWxlZCIpOwogCQl9Ci0JCXJldHVybiBuZXcgUG9ydGFsUmVzdFJlc3BvbnNlPFN0cmluZz4oUG9ydGFsUmVzdFN0YXR1c0VudW0uT0ssICJTdWNjZXNzZnVsbHkgRGVsZXRlZCIsICJTdWNjZXNzIik7CisJCXJldHVybiBuZXcgUG9ydGFsUmVzdFJlc3BvbnNlPD4oUG9ydGFsUmVzdFN0YXR1c0VudW0uT0ssICJTdWNjZXNzZnVsbHkgRGVsZXRlZCIsICJTdWNjZXNzIik7CiAKIAl9CQogCQpAQCAtMTY4LDcgKzI0NCwzNiBAQAogCXB1YmxpYyBQb3J0YWxSZXN0UmVzcG9uc2U8U3RyaW5nPiBzYXZlUm9sZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKIAkJCUBSZXF1ZXN0Qm9keSBSb2xlIHJvbGUpIHRocm93cyBFeGNlcHRpb24gewogCQl0cnkgewotCQkJZXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2Uuc2F2ZVJvbGVGb3JBcHBsaWNhdGlvbihyb2xlLHJlcXVlc3QuZ2V0SGVhZGVyKFVFQktFWSkpOworCQkJRVBVc2VyIHVzZXIgPSBleHRlcm5hbEFjY2Vzc1JvbGVzU2VydmljZS5nZXRVc2VyKHJlcXVlc3QuZ2V0SGVhZGVyKExPR0lOX0lEKSkuZ2V0KDApOworCQkJRVBBcHAgYXBwID0gZXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2UuZ2V0QXBwKHJlcXVlc3QuZ2V0SGVhZGVyKFVFQktFWSkpLmdldCgwKTsKKwkJCWJvb2xlYW4gZ2V0QWRkUmVzcG9uc2UgPSBleHRlcm5hbEFjY2Vzc1JvbGVzU2VydmljZS5zYXZlUm9sZUZvckFwcGxpY2F0aW9uKHJvbGUsIHJlcXVlc3QuZ2V0SGVhZGVyKFVFQktFWSkpOworCQkJaWYgKGdldEFkZFJlc3BvbnNlKSB7CisJCQkJU3RyaW5nIGFjdGl2aXR5Q29kZSA9IChyb2xlLmdldElkKCkgPT0gbnVsbCkgPyBFY29tcEF1ZGl0TG9nLkNEX0FDVElWSVRZX0VYVEVSTkFMX0FVVEhfQUREX1JPTEUKKwkJCQkJCTogRWNvbXBBdWRpdExvZy5DRF9BQ1RJVklUWV9FWFRFUk5BTF9BVVRIX1VQREFURV9ST0xFX0FORF9GVU5DVElPTjsKKwkJCQlsb2dnZXIuaW5mbyhFRUxGTG9nZ2VyRGVsZWdhdGUuYXBwbGljYXRpb25Mb2dnZXIsICJzYXZlUm9sZTogc3VjY2VlZGVkIGZvciBhcHAge30sIHJvbGUge30iLAorCQkJCQkJYXBwLmdldElkKCksIHJvbGUuZ2V0TmFtZSgpKTsKKwkJCQlBdWRpdExvZyBhdWRpdExvZyA9IG5ldyBBdWRpdExvZygpOworCQkJCWF1ZGl0TG9nLnNldFVzZXJJZCh1c2VyLmdldElkKCkpOworCQkJCWF1ZGl0TG9nLnNldEFjdGl2aXR5Q29kZShhY3Rpdml0eUNvZGUpOworCQkJCWF1ZGl0TG9nLnNldENvbW1lbnRzKEVjb21wUG9ydGFsVXRpbHMudHJ1bmNhdGVTdHJpbmcoInNhdmVSb2xlIHJvbGUgZm9yIGFwcDoiICsgYXBwLmdldElkKCkgKyAiIGFuZCByb2xlOiciICsgcm9sZS5nZXROYW1lKCkrIiciLCBQb3J0YWxDb25zdGFudHMuQVVESVRfTE9HX0NPTU1FTlRfU0laRSkpOworCQkJCWF1ZGl0TG9nLnNldEFmZmVjdGVkUmVjb3JkSWQodXNlci5nZXRPcmdVc2VySWQoKSk7CisJCQkJYXVkaXRTZXJ2aWNlLmxvZ0FjdGl2aXR5KGF1ZGl0TG9nLCBudWxsKTsKKwkJCQlNREMucHV0KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5BVURJVExPR19CRUdJTl9USU1FU1RBTVAsIEVQRUVMRkxvZ2dlckFkdmljZS5nZXRDdXJyZW50RGF0ZVRpbWVVVEMoKSk7CisJCQkJTURDLnB1dChFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuQVVESVRMT0dfRU5EX1RJTUVTVEFNUCwgRVBFRUxGTG9nZ2VyQWR2aWNlLmdldEN1cnJlbnREYXRlVGltZVVUQygpKTsKKwkJCQlFY29tcFBvcnRhbFV0aWxzLmNhbGN1bGF0ZURhdGVUaW1lRGlmZmVyZW5jZUZvckxvZygKKwkJCQkJCU1EQy5nZXQoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkFVRElUTE9HX0JFR0lOX1RJTUVTVEFNUCksCisJCQkJCQlNREMuZ2V0KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5BVURJVExPR19FTkRfVElNRVNUQU1QKSk7CisJCQkJbG9nZ2VyLmluZm8oRUVMRkxvZ2dlckRlbGVnYXRlLmF1ZGl0TG9nZ2VyLAorCQkJCQkJRVBMb2dVdGlsLmZvcm1hdEF1ZGl0TG9nTWVzc2FnZSgiRXh0ZXJuYWxBY2Nlc3NSb2xlc0NvbnRyb2xsZXIuc2F2ZVJvbGUiLCBhY3Rpdml0eUNvZGUsCisJCQkJCQkJCVN0cmluZy52YWx1ZU9mKHVzZXIuZ2V0SWQoKSksIHVzZXIuZ2V0T3JnVXNlcklkKCksIHJvbGUuZ2V0TmFtZSgpKSk7CisJCQkJTURDLnJlbW92ZShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuQVVESVRMT0dfQkVHSU5fVElNRVNUQU1QKTsKKwkJCQlNREMucmVtb3ZlKEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5BVURJVExPR19FTkRfVElNRVNUQU1QKTsKKwkJCQlNREMucmVtb3ZlKFN5c3RlbVByb3BlcnRpZXMuTURDX1RJTUVSKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QpOworCQkJCXJldHVybiBuZXcgUG9ydGFsUmVzdFJlc3BvbnNlPD4oUG9ydGFsUmVzdFN0YXR1c0VudW0uRVJST1IsICJGYWlsZWQgdG8gc2F2ZVJvbGUgZm9yICciK3JvbGUuZ2V0TmFtZSgpKyInIiwgIkZhaWxlZCIpOworCisJCQl9CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAJCQlyZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCk7CiAJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAic2F2ZVJvbGUgZmFpbGVkIiwgZSk7CkBAIC0xODIsNyArMjg3LDM2IEBACiAJcHVibGljICBQb3J0YWxSZXN0UmVzcG9uc2U8U3RyaW5nPiBkZWxldGVSb2xlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAogCQkJQFBhdGhWYXJpYWJsZSBTdHJpbmcgY29kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSB7Ci0JCQlleHRlcm5hbEFjY2Vzc1JvbGVzU2VydmljZS5kZWxldGVSb2xlRm9yQXBwbGljYXRpb24oY29kZSwgcmVxdWVzdC5nZXRIZWFkZXIoVUVCS0VZKSk7CisJCQlib29sZWFuIGRlbGV0ZVJlc3BvbnNlID0gZXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2UuZGVsZXRlUm9sZUZvckFwcGxpY2F0aW9uKGNvZGUsIHJlcXVlc3QuZ2V0SGVhZGVyKFVFQktFWSkpOworCQkJaWYoZGVsZXRlUmVzcG9uc2UpeworCQkJCUVQVXNlciB1c2VyID0gZXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2UuZ2V0VXNlcihyZXF1ZXN0LmdldEhlYWRlcihMT0dJTl9JRCkpLmdldCgwKTsKKwkJCQlFUEFwcCBhcHAgPSBleHRlcm5hbEFjY2Vzc1JvbGVzU2VydmljZS5nZXRBcHAocmVxdWVzdC5nZXRIZWFkZXIoVUVCS0VZKSkuZ2V0KDApOworCQkJCWxvZ2dlci5pbmZvKEVFTEZMb2dnZXJEZWxlZ2F0ZS5hcHBsaWNhdGlvbkxvZ2dlciwgImRlbGV0ZVJvbGU6IHN1Y2NlZWRlZCBmb3IgYXBwIHt9LCByb2xlIHt9IiwKKwkJCQkJCWFwcC5nZXRJZCgpLCBjb2RlKTsKKwkJCQlBdWRpdExvZyBhdWRpdExvZyA9IG5ldyBBdWRpdExvZygpOworCQkJCWF1ZGl0TG9nLnNldFVzZXJJZCh1c2VyLmdldElkKCkpOworCQkJCWF1ZGl0TG9nLnNldEFjdGl2aXR5Q29kZShFY29tcEF1ZGl0TG9nLkNEX0FDVElWSVRZX0VYVEVSTkFMX0FVVEhfREVMRVRFX1JPTEUpOworCQkJCWF1ZGl0TG9nLnNldENvbW1lbnRzKEVjb21wUG9ydGFsVXRpbHMudHJ1bmNhdGVTdHJpbmcoIkRlbGV0ZWQgcm9sZSBmb3IgYXBwOiIrYXBwLmdldElkKCkrIiBhbmQgcm9sZTonIitjb2RlKyInIiwgUG9ydGFsQ29uc3RhbnRzLkFVRElUX0xPR19DT01NRU5UX1NJWkUpKTsKKwkJCQlhdWRpdExvZy5zZXRBZmZlY3RlZFJlY29yZElkKHVzZXIuZ2V0T3JnVXNlcklkKCkpOworCQkJCWF1ZGl0U2VydmljZS5sb2dBY3Rpdml0eShhdWRpdExvZywgbnVsbCk7CisJCQkJTURDLnB1dChFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuQVVESVRMT0dfQkVHSU5fVElNRVNUQU1QLAorCQkJCQkJRVBFRUxGTG9nZ2VyQWR2aWNlLmdldEN1cnJlbnREYXRlVGltZVVUQygpKTsKKwkJCQlNREMucHV0KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5BVURJVExPR19FTkRfVElNRVNUQU1QLAorCQkJCQkJRVBFRUxGTG9nZ2VyQWR2aWNlLmdldEN1cnJlbnREYXRlVGltZVVUQygpKTsKKwkJCQlFY29tcFBvcnRhbFV0aWxzLmNhbGN1bGF0ZURhdGVUaW1lRGlmZmVyZW5jZUZvckxvZygKKwkJCQkJCU1EQy5nZXQoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkFVRElUTE9HX0JFR0lOX1RJTUVTVEFNUCksCisJCQkJCQlNREMuZ2V0KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5BVURJVExPR19FTkRfVElNRVNUQU1QKSk7CisJCQkJbG9nZ2VyLmluZm8oRUVMRkxvZ2dlckRlbGVnYXRlLmF1ZGl0TG9nZ2VyLAorCQkJCQkJRVBMb2dVdGlsLmZvcm1hdEF1ZGl0TG9nTWVzc2FnZSgiRXh0ZXJuYWxBY2Nlc3NSb2xlc0NvbnRyb2xsZXIuZGVsZXRlUm9sZSIsCisJCQkJCQkJCUVjb21wQXVkaXRMb2cuQ0RfQUNUSVZJVFlfRVhURVJOQUxfQVVUSF9ERUxFVEVfUk9MRSwgU3RyaW5nLnZhbHVlT2YodXNlci5nZXRJZCgpKSwKKwkJCQkJCQkJdXNlci5nZXRPcmdVc2VySWQoKSwgY29kZSkpOworCQkJCU1EQy5yZW1vdmUoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkFVRElUTE9HX0JFR0lOX1RJTUVTVEFNUCk7CisJCQkJTURDLnJlbW92ZShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuQVVESVRMT0dfRU5EX1RJTUVTVEFNUCk7CisJCQkJTURDLnJlbW92ZShTeXN0ZW1Qcm9wZXJ0aWVzLk1EQ19USU1FUik7CisJCQl9IGVsc2V7CisJCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImRlbGV0ZVJvbGUgZmFpbGVkIik7CisJCQkJcmV0dXJuIG5ldyBQb3J0YWxSZXN0UmVzcG9uc2U8U3RyaW5nPihQb3J0YWxSZXN0U3RhdHVzRW51bS5FUlJPUiwgIkZhaWxlZCB0byBkZWxldGVSb2xlIGZvciAnIitjb2RlKyInIiwgIkZhaWxlZCIpOworCQkJfQogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QpOwogCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImRlbGV0ZVJvbGUgZmFpbGVkIiwgZSk7CkBAIC0yMDgsMTUgKzM0MiwyMyBAQAogCQogCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiZGVsZXRlcyB1c2VyIHJvbGVzIGZvciBhbiBhcHBsaWNhdGlvbi4iLCByZXNwb25zZSA9IFBvcnRhbFJlc3RSZXNwb25zZS5jbGFzcywgcmVzcG9uc2VDb250YWluZXIgPSAiSnNvbiIpCiAJQFJlcXVlc3RNYXBwaW5nKHZhbHVlID0geyAiL2RlbGV0ZURlcGVuZGN5Um9sZVJlY29yZC97cm9sZUlkfSIgfSwgbWV0aG9kID0gUmVxdWVzdE1ldGhvZC5ERUxFVEUsIHByb2R1Y2VzID0gImFwcGxpY2F0aW9uL2pzb24iKQotCXB1YmxpYyAgUG9ydGFsUmVzdFJlc3BvbnNlPFN0cmluZz4gZGVsZXRlRGVwZW5kY3lSb2xlUmVjb3JkKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBAUGF0aFZhcmlhYmxlKCJyb2xlSWQiKSBMb25nIHJvbGVJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIFBvcnRhbFJlc3RSZXNwb25zZTxTdHJpbmc+IGRlbGV0ZURlcGVuZGVuY3lSb2xlUmVjb3JkKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorCQkJQFBhdGhWYXJpYWJsZSgicm9sZUlkIikgTG9uZyByb2xlSWQpIHRocm93cyBFeGNlcHRpb24gewogCQl0cnkgewotCQkJZXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2UuZGVsZXRlRGVwZW5kY3lSb2xlUmVjb3JkKHJvbGVJZCxyZXF1ZXN0LmdldEhlYWRlcihVRUJLRVkpLCByZXF1ZXN0LmdldEhlYWRlcigiTG9naW5JZCIpKTsKKwkJCWJvb2xlYW4gZGVsZXRlUmVzcG9uc2UgPSBleHRlcm5hbEFjY2Vzc1JvbGVzU2VydmljZS5kZWxldGVEZXBlbmRlbmN5Um9sZVJlY29yZChyb2xlSWQsCisJCQkJCXJlcXVlc3QuZ2V0SGVhZGVyKFVFQktFWSksIHJlcXVlc3QuZ2V0SGVhZGVyKExPR0lOX0lEKSk7CisJCQlpZiAoIWRlbGV0ZVJlc3BvbnNlKSB7CisJCQkJcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QpOworCQkJCXJldHVybiBuZXcgUG9ydGFsUmVzdFJlc3BvbnNlPD4oUG9ydGFsUmVzdFN0YXR1c0VudW0uRVJST1IsICJGYWlsZWQgdG8gZGVsZXRlRGVwZW5kZW5jeVJvbGVSZWNvcmQiLAorCQkJCQkJIkZhaWxlZCIpOworCQkJfQogCQl9IGNhdGNoIChIdHRwQ2xpZW50RXJyb3JFeGNlcHRpb24gZSkgewogCQkJcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QpOwotCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImRlbGV0ZURlcGVuZGN5Um9sZVJlY29yZCBmYWlsZWQiLCBlKTsKLQkJCXJldHVybiBuZXcgUG9ydGFsUmVzdFJlc3BvbnNlPFN0cmluZz4oUG9ydGFsUmVzdFN0YXR1c0VudW0uRVJST1IsICJGYWlsZWQgdG8gZGVsZXRlRGVwZW5kY3lSb2xlUmVjb3JkIiwgIkZhaWxlZCIpOworCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImRlbGV0ZURlcGVuZGVuY3lSb2xlUmVjb3JkIGZhaWxlZCIsIGUpOworCQkJcmV0dXJuIG5ldyBQb3J0YWxSZXN0UmVzcG9uc2U8PihQb3J0YWxSZXN0U3RhdHVzRW51bS5FUlJPUiwgIkZhaWxlZCB0byBkZWxldGVEZXBlbmRlbmN5Um9sZVJlY29yZCIsCisJCQkJCSJGYWlsZWQiKTsKIAkJfQotCQlyZXR1cm4gbmV3IFBvcnRhbFJlc3RSZXNwb25zZTxTdHJpbmc+KFBvcnRhbFJlc3RTdGF0dXNFbnVtLk9LLCAiU3VjY2Vzc2Z1bGx5IERlbGV0ZWQiLCAiU3VjY2VzcyIpOworCQlyZXR1cm4gbmV3IFBvcnRhbFJlc3RSZXNwb25zZTw+KFBvcnRhbFJlc3RTdGF0dXNFbnVtLk9LLCAiU3VjY2Vzc2Z1bGx5IERlbGV0ZWQiLCAiU3VjY2VzcyIpOwogCX0KIAkKIAlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkJ1bGsgdXBsb2FkIGZ1bmN0aW9ucyBmb3IgYW4gYXBwbGljYXRpb24uIiwgcmVzcG9uc2UgPSBQb3J0YWxSZXN0UmVzcG9uc2UuY2xhc3MsIHJlc3BvbnNlQ29udGFpbmVyID0gIkpzb24iKQpkaWZmIC0tZ2l0IGEvZWNvbXAtcG9ydGFsLUJFLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvcG9ydGFsYXBwL3BvcnRhbC9jb250cm9sbGVyL1JvbGVNYW5hZ2VDb250cm9sbGVyLmphdmEgYi9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL2NvbnRyb2xsZXIvUm9sZU1hbmFnZUNvbnRyb2xsZXIuamF2YQppbmRleCBlZWZkNTAwLi4wMmYyMzdkIDEwMDY0NAotLS0gYS9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL2NvbnRyb2xsZXIvUm9sZU1hbmFnZUNvbnRyb2xsZXIuamF2YQorKysgYi9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL2NvbnRyb2xsZXIvUm9sZU1hbmFnZUNvbnRyb2xsZXIuamF2YQpAQCAtMTc1LDcgKzE3NSw3IEBACiAJcHVibGljIHZvaWQgIHN5bmNSb2xlcyhFUEFwcCBhcHApCiAJewogCQl0cnkgewotCQkJZXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2UuU3luY0FwcGxpY2F0aW9uUm9sZXNXaXRoRWNvbXBEQihhcHApOworCQkJZXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2Uuc3luY0FwcGxpY2F0aW9uUm9sZXNXaXRoRWNvbXBEQihhcHApOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgImZhaWxlZCBzeW5jUm9sZXMiKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZWNvbXAtcG9ydGFsLUJFLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvcG9ydGFsYXBwL3BvcnRhbC9kb21haW4vRWNvbXBBdWRpdExvZy5qYXZhIGIvZWNvbXAtcG9ydGFsLUJFLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvcG9ydGFsYXBwL3BvcnRhbC9kb21haW4vRWNvbXBBdWRpdExvZy5qYXZhCmluZGV4IDNkNTNjOGQuLjYzYWMyYzcgMTAwNjQ0Ci0tLSBhL2Vjb21wLXBvcnRhbC1CRS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3BvcnRhbGFwcC9wb3J0YWwvZG9tYWluL0Vjb21wQXVkaXRMb2cuamF2YQorKysgYi9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL2RvbWFpbi9FY29tcEF1ZGl0TG9nLmphdmEKQEAgLTUxLDcgKzUxLDEyIEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RfQUNUSVZJVFlfVVBEQVRFX1VTRVIgPSAidXUgIjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRF9BQ1RJVklUWV9VUERBVEVfQUNDT1VOVF9BRE1JTiA9ICJ1YWEgIjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRF9BQ1RJVklUWV9TVE9SRV9BTkFMWVRJQ1MgPSAic3RvcmVfYW5hbHl0aWNzIjsKLQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEX0FDVElWSVRZX0VYVEVSTkFMX0FVVEhfQUREX1JPTEUgPSAiZWFhciI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RfQUNUSVZJVFlfRVhURVJOQUxfQVVUSF9BRERfRlVOQ1RJT04gPSAiZWFhZiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RfQUNUSVZJVFlfRVhURVJOQUxfQVVUSF9VUERBVEVfRlVOQ1RJT04gPSAiZWF1ZiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RfQUNUSVZJVFlfRVhURVJOQUxfQVVUSF9VUERBVEVfUk9MRV9BTkRfRlVOQ1RJT04gPSAiZWF1cmYiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEX0FDVElWSVRZX0VYVEVSTkFMX0FVVEhfREVMRVRFX1JPTEUgPSAiZWFkciI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RfQUNUSVZJVFlfRVhURVJOQUxfQVVUSF9ERUxFVEVfRlVOQ1RJT04gPSAiZWFkZiI7CiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgY3JlYXRlZCBmaWVsZCBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0ZS10aW1lLgogCSAqLwpkaWZmIC0tZ2l0IGEvZWNvbXAtcG9ydGFsLUJFLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvcG9ydGFsYXBwL3BvcnRhbC9zZXJ2aWNlL0V4dGVybmFsQWNjZXNzUm9sZXNTZXJ2aWNlLmphdmEgYi9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL3NlcnZpY2UvRXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2UuamF2YQppbmRleCBlNTdkNGZhLi4zNDA4OGEyIDEwMDY0NAotLS0gYS9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL3NlcnZpY2UvRXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2UuamF2YQorKysgYi9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL3NlcnZpY2UvRXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2UuamF2YQpAQCAtNiw2ICs2LDcgQEAKIGltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbGFwcC5wb3J0YWwuZG9tYWluLkNlbnRyYWxSb2xlRnVuY3Rpb247CiBpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxhcHAucG9ydGFsLmRvbWFpbi5FUEFwcDsKIGltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbGFwcC5wb3J0YWwuZG9tYWluLkVQUm9sZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbGFwcC5wb3J0YWwuZG9tYWluLkVQVXNlcjsKIGltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbGFwcC5wb3J0YWwudHJhbnNwb3J0LkNlbnRyYWxSb2xlOwogaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsc2RrLmNvcmUuZG9tYWluLlJvbGU7CiBpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxzZGsuY29yZS5kb21haW4uUm9sZUZ1bmN0aW9uOwpAQCAtMTMsMTcgKzE0LDE2IEBACiBwdWJsaWMgaW50ZXJmYWNlIEV4dGVybmFsQWNjZXNzUm9sZXNTZXJ2aWNlIHsKIAkKIAkvKioKLQkgKiBJdCBnZXRzIGFsbCBhcHBsaWNhdGlvbiByb2xlcyAKKwkgKiBJdCBnZXRzIGxpc3Qgb2YgYXBwbGljYXRpb24gcm9sZXMgCiAJICogCiAJICogQHBhcmFtIGFwcElkCi0JICogQHBhcmFtIGV4dFJlcXVlc3RWYWx1ZQogCSAqIEByZXR1cm4gTGlzdAogCSAqIEB0aHJvd3MgRXhjZXB0aW9uIAogCSAqLwotCXB1YmxpYyBMaXN0PEVQUm9sZT4gZ2V0QXBwUm9sZXMoTG9uZyBhcHBJZCwgQm9vbGVhbiBleHRSZXF1ZXN0VmFsdWUpIHRocm93cyBFeGNlcHRpb247CisJcHVibGljIExpc3Q8RVBSb2xlPiBnZXRBcHBSb2xlcyhMb25nIGFwcElkKSB0aHJvd3MgRXhjZXB0aW9uOwogCQogCS8qKgotCSAqIEl0IHJldHVybnMgYXBwbGljYXRpb24gZGV0YWlscworCSAqIEl0IHJldHVybnMgc2luZ2xlIGFwcCByZWNvcmQKIAkgKiAKIAkgKiBAcGFyYW0gdWVia2V5CiAJICogQHJldHVybiBMaXN0CkBAIC00MCwxNyArNDAsMTYgQEAKIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwogCXB1YmxpYyBib29sZWFuIGFkZFJvbGUoUm9sZSBhZGRSb2xlcywgU3RyaW5nIHVlYmtleSkgdGhyb3dzIEV4Y2VwdGlvbjsKLQkKKwogCS8qKgotCSAqIFVwZGF0ZXMgcm9sZSBpbiB0aGUgZXh0ZXJuYWwgYWNjZXNzIHN5c3RlbSBvdGhlcndpc2UgdGhyb3dzIGV4Y2VwdGlvbgorCSAqIEl0IHJldHVybnMgY29tcGxldGUgdXNlciBpbmZvcm1hdGlvbgogCSAqIAotCSAqIEBwYXJhbSB1cGRhdGVSb2xlCi0JICogQHBhcmFtIHVlYmtleQotCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqIEBwYXJhbSBsb2dpbklkCisJICogQHJldHVybiBFUFVzZXIgb2JqZWN0CiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQl2b2lkIHVwZGF0ZVJvbGUoUm9sZSB1cGRhdGVSb2xlLCBFUEFwcCBhcHApIHRocm93cyBFeGNlcHRpb247Ci0KKwlMaXN0PEVQVXNlcj4gZ2V0VXNlcihTdHJpbmcgbG9naW5JZCkgdGhyb3dzIEV4Y2VwdGlvbjsKKwkKIAkvKioKIAkgKiBJdCByZXR1cm5zIGNvbXBsZXRlIHVzZXIgaW5mb3JtYXRpb24gaW5jbHVkaW5nIGFwcGxpY2F0aW9uIHJvbGVzIHBlcm1pc3Npb25zCiAJICogCkBAIC01OSw3ICs1OCw3IEBACiAJICogQHJldHVybiBTdHJpbmcKIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwotCVN0cmluZyBnZXRVc2VyKFN0cmluZyBsb2dpbklkLCBTdHJpbmcgdWVia2V5KSB0aHJvd3MgRXhjZXB0aW9uOworCVN0cmluZyBnZXRVc2VyV2l0aFJvbGVzKFN0cmluZyBsb2dpbklkLCBTdHJpbmcgdWVia2V5KSB0aHJvd3MgRXhjZXB0aW9uOwogCiAJLyoqCiAJICogSXQgcmV0dXJucyBsaXN0IG9mIGFsbCByb2xlIGZ1bmN0aW9ucwpAQCAtOTQsMTcgKzkzLDE4IEBACiAJICogIAogCSAqIEBwYXJhbSBkb21haW5DZW50cmFsUm9sZUZ1bmN0aW9uCiAJICogQHBhcmFtIHJlcXVlc3RlZEFwcCAKKwkgKiBAcmV0dXJuIHRydWUgZWxzZSBmYWxzZQogCSAqIEB0aHJvd3MgRXhjZXB0aW9uIAogCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVDZW50cmFsUm9sZUZ1bmN0aW9uKENlbnRyYWxSb2xlRnVuY3Rpb24gZG9tYWluQ2VudHJhbFJvbGVGdW5jdGlvbiwgRVBBcHAgcmVxdWVzdGVkQXBwKSB0aHJvd3MgRXhjZXB0aW9uOworCXB1YmxpYyBib29sZWFuIHNhdmVDZW50cmFsUm9sZUZ1bmN0aW9uKENlbnRyYWxSb2xlRnVuY3Rpb24gZG9tYWluQ2VudHJhbFJvbGVGdW5jdGlvbiwgRVBBcHAgcmVxdWVzdGVkQXBwKSB0aHJvd3MgRXhjZXB0aW9uOwogCiAJLyoqCiAJICogSXQgZGVsZXRlcyByb2xlIGZ1bmN0aW9uIGluIHRoZSBEQgogCSAqIAogCSAqIEBwYXJhbSBjb2RlCi0JICogQHBhcmFtIHN0cmluZyAKKwkgKiBAcGFyYW0gYXBwIAogCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUNlbnRyYWxSb2xlRnVuY3Rpb24oU3RyaW5nIGNvZGUsIFN0cmluZyBzdHJpbmcpOworCXB1YmxpYyBib29sZWFuIGRlbGV0ZUNlbnRyYWxSb2xlRnVuY3Rpb24oU3RyaW5nIGNvZGUsIEVQQXBwIGFwcCk7CiAKIAkvKioKIAkgKiBJdCBnZXRzIGFsbCByb2xlcyB0aGUgYXBwbGljYXRpb25zCkBAIC0xMjIsMTYgKzEyMiwxNyBAQAogCSAqIEBwYXJhbSB1ZWJrZXkKIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKIAkgKi8KLQl2b2lkIHNhdmVSb2xlRm9yQXBwbGljYXRpb24oUm9sZSBzYXZlUm9sZSwgU3RyaW5nIHVlYmtleSkgdGhyb3dzIEV4Y2VwdGlvbjsKKwlib29sZWFuIHNhdmVSb2xlRm9yQXBwbGljYXRpb24oUm9sZSBzYXZlUm9sZSwgU3RyaW5nIHVlYmtleSkgdGhyb3dzIEV4Y2VwdGlvbjsKIAogCS8qKgogCSAqICBJdCBkZWxldGVzIHJvbGUgaW4gdGhlIERCCiAJICogIAogCSAqIEBwYXJhbSBjb2RlCiAJICogQHBhcmFtIHVlYmtleQorCSAqIEByZXR1cm4gdHJ1ZSBlbHNlIGZhbHNlCiAJICogQHRocm93cyBFeGNlcHRpb24gCiAJICovCi0Jdm9pZCBkZWxldGVSb2xlRm9yQXBwbGljYXRpb24oU3RyaW5nIGNvZGUsIFN0cmluZyB1ZWJrZXkpIHRocm93cyBFeGNlcHRpb247CisJYm9vbGVhbiBkZWxldGVSb2xlRm9yQXBwbGljYXRpb24oU3RyaW5nIGNvZGUsIFN0cmluZyB1ZWJrZXkpIHRocm93cyBFeGNlcHRpb247CiAKIAkvKioKIAkgKiBJdCBnZXRzIGFsbCBhY3RpdmUgcm9sZXMgZm9yIHNpbmdsZSBhcHBsaWNhdGlvbiAKQEAgLTE0NywxMCArMTQ4LDEwIEBACiAJICogQHBhcmFtIHJvbGVJZAogCSAqIEBwYXJhbSB1ZWJrZXkKIAkgKiBAcGFyYW0gTG9naW5JZCAKLQkgKiBAcmV0dXJuCisJICogQHJldHVybiB0cnVlIGVsc2UgZmFsc2UKIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKIAkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVEZXBlbmRjeVJvbGVSZWNvcmQoTG9uZyByb2xlSWQsIFN0cmluZyB1ZWJrZXksIFN0cmluZyBMb2dpbklkKSB0aHJvd3MgRXhjZXB0aW9uOworCXB1YmxpYyBib29sZWFuIGRlbGV0ZURlcGVuZGVuY3lSb2xlUmVjb3JkKExvbmcgcm9sZUlkLCBTdHJpbmcgdWVia2V5LCBTdHJpbmcgTG9naW5JZCkgdGhyb3dzIEV4Y2VwdGlvbjsKIAkKIAkvKioKIAkgKiBJdCBzeW5jIG5ldyBmdW5jdGlvbnMgY29kZXMgYW5kIG5hbWVzIGZyb20gYW5kIHVwZGF0ZXMgcm9sZSBmdW5jdGlvbnMgZnJvbSBleHRlcm5hbCBhY2Nlc3Mgc3lzdGVtCkBAIC0xNjAsMzAgKzE2MSw5MCBAQAogCSAqLwogCXB1YmxpYyB2b2lkIHN5bmNSb2xlRnVuY3Rpb25Gcm9tRXh0ZXJuYWxBY2Nlc3NTeXN0ZW0oRVBBcHAgYXBwKSB0aHJvd3MgRXhjZXB0aW9uOwogCisJLyoqCisJICogSXQgdXBsb2FkcyBwb3J0YWwgZnVuY3Rpb25zIGludG8gZXh0ZXJuYWwgYXV0aCBzeXN0ZW0KKwkgKiBAcGFyYW0gdWVia2V5CisJICogQHJldHVybgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCiAJcHVibGljIEludGVnZXIgYnVsa1VwbG9hZEZ1bmN0aW9ucyhTdHJpbmcgdWVia2V5KSB0aHJvd3MgRXhjZXB0aW9uOwogCisJLyoqCisJICogSXQgdXBsb2FkcyBwb3J0YWwgcm9sZXMgaW50byBleHRlcm5hbCBhdXRoIHN5c3RlbQorCSAqIEBwYXJhbSB1ZWJrZXkKKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KIAlwdWJsaWMgSW50ZWdlciBidWxrVXBsb2FkUm9sZXMoU3RyaW5nIHVlYmtleSkgdGhyb3dzIEV4Y2VwdGlvbjsKIAotCXB1YmxpYyB2b2lkIGJ1bGtVcGxvYWRQYXJ0bmVyRnVuY3Rpb25zKFN0cmluZyBoZWFkZXIsIExpc3Q8Um9sZUZ1bmN0aW9uPiB1cGxvYWQpIHRocm93cyBFeGNlcHRpb247CisJLyoqCisJICogSXQgdXBsb2FkcyBwYXJ0bmVyIGFwcGxpY2F0aW9uIHJvbGUgZnVuY3Rpb25zIGludG8gZXh0ZXJuYWwgYXV0aCBzeXN0ZW0KKwkgKiAKKwkgKiBAcGFyYW0gdWVia2V5CisJICogQHBhcmFtIHVwbG9hZAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgYnVsa1VwbG9hZFBhcnRuZXJGdW5jdGlvbnMoU3RyaW5nIHVlYmtleSwgTGlzdDxSb2xlRnVuY3Rpb24+IHVwbG9hZCkgdGhyb3dzIEV4Y2VwdGlvbjsKIAotCXB1YmxpYyB2b2lkIGJ1bGtVcGxvYWRQYXJ0bmVyUm9sZXMoU3RyaW5nIGhlYWRlciwgTGlzdDxSb2xlPiB1cGxvYWQpIHRocm93cyBFeGNlcHRpb247CisJLyoqIAorCSAqIEl0IHVwbG9hZHMgcGFydG5lciBhcHBsaWNhdGlvbiByb2xlIGZ1bmN0aW9ucyBpbnRvIGV4dGVybmFsIGF1dGggc3lzdGVtCisJICogCisJICogQHBhcmFtIHVlYmtleQorCSAqIEBwYXJhbSB1cGxvYWQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIGJ1bGtVcGxvYWRQYXJ0bmVyUm9sZXMoU3RyaW5nIHVlYmtleSwgTGlzdDxSb2xlPiB1cGxvYWQpIHRocm93cyBFeGNlcHRpb247CiAKKwkvKioKKwkgKiBJdCByZXR1cm5zIHRvdGFsIG5vLiBvZiBwb3J0YWwgYXBwbGljYXRpb24gcm9sZSBmdW5jdGlvbnMgcmVjb3JkcyBhZGRlZCBpbiBleHRlcm5hbCBhdXRoIHN5c3RlbSAKKwkgKiBAcGFyYW0gdWVia2V5CisJICogQHJldHVybgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCiAJSW50ZWdlciBidWxrVXBsb2FkUm9sZXNGdW5jdGlvbnMoU3RyaW5nIHVlYmtleSkgdGhyb3dzIEV4Y2VwdGlvbjsKIAkKIAkvKioKLQkgKiBTeW5jQXBwbGljYXRpb25Sb2xlc1dpdGhFY29tcERCIHN5bmMgdGhlIHJvbGVzIGFuZCByb2xlZnVuY3Rpb25zIHRvIHRoZSBlY29tcCBEQiBmcm9tIEFBRgorCSAqICBJdCBzeW5jcyB0aGUgcm9sZXMgYW5kIHJvbGVmdW5jdGlvbnMgdG8gdGhlIGVjb21wIERCIGZyb20gQUFGCiAJICogQHBhcmFtIGFwcAogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCisJdm9pZCBzeW5jQXBwbGljYXRpb25Sb2xlc1dpdGhFY29tcERCKEVQQXBwIGFwcCkgdGhyb3dzIEV4Y2VwdGlvbjsKIAotCXZvaWQgU3luY0FwcGxpY2F0aW9uUm9sZXNXaXRoRWNvbXBEQihFUEFwcCBhcHApIHRocm93cyBFeGNlcHRpb247Ci0KKwkvKioKKwkgKiBJdCB1cGxvYWRzIGxpc3Qgb2YgdXNlciByb2xlcyBvZiB0aGUgYXBwbGljYXRpb24gaW50byBleHRlcm5hbCBhdXRoIHN5c3RlbSAKKwkgKiAKKwkgKiBAcGFyYW0gdWVia2V5CisJICogQHJldHVybgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCiAJcHVibGljIEludGVnZXIgYnVsa1VwbG9hZFVzZXJSb2xlcyhTdHJpbmcgdWVia2V5KSB0aHJvd3MgRXhjZXB0aW9uOwogCisJLyoqCisJICogSXQgVXBsb2FkcyBwYXJ0bmVyIGFwcGxpY2F0aW9uIHJvbGUgZnVuY3Rpb25zIGludG8gZXh0ZXJuYWwgYXV0aCBzeXN0ZW0KKwkgKiAKKwkgKiBAcGFyYW0gdWVia2V5CisJICogQHBhcmFtIHJvbGVMaXN0CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KIAl2b2lkIGJ1bGtVcGxvYWRQYXJ0bmVyUm9sZUZ1bmN0aW9ucyhTdHJpbmcgdWVia2V5LCBMaXN0PFJvbGU+IHJvbGVMaXN0KSB0aHJvd3MgRXhjZXB0aW9uOwogCi0JcHVibGljIHZvaWQgZGVsZXRlUm9sZURlcGVuZGVjaWVzUmVjb3JkKFNlc3Npb24gbG9jYWxTZXNzaW9uLCBMb25nIHJvbGVJZCkgdGhyb3dzIEV4Y2VwdGlvbjsKKwkvKioKKwkgKiBpdCBkZWxldGVzIGFsbCBkZXBlbmRlbmN5IHJvbGUgcmVjb3JkcyAKKwkgKiAKKwkgKiBAcGFyYW0gbG9jYWxTZXNzaW9uCisJICogQHBhcmFtIHJvbGVJZAorCSAqIEBwYXJhbSBhcHBJZAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgZGVsZXRlUm9sZURlcGVuZGVuY3lSZWNvcmRzKFNlc3Npb24gbG9jYWxTZXNzaW9uLCBMb25nIHJvbGVJZCwgTG9uZyBhcHBJZCkgdGhyb3dzIEV4Y2VwdGlvbjsKIAorCS8qKgorCSAqIEl0IHJldHVybnMgbGlzdCBvZiBhcHBsaWNhdGlvbnMgZnVuY3Rpb25zIGFsb25nIHdpdGggZnVuY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBnbG9iYWwgcm9sZQorCSAqIAorCSAqIEBwYXJhbSB1ZWJrZXkKKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KIAlMaXN0PFN0cmluZz4gZ2V0TWVudUZ1bmN0aW9uc0xpc3QoU3RyaW5nIHVlYmtleSkgdGhyb3dzIEV4Y2VwdGlvbjsKIAogCmRpZmYgLS1naXQgYS9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL3NlcnZpY2UvRXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2VJbXBsLmphdmEgYi9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL3NlcnZpY2UvRXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2VJbXBsLmphdmEKaW5kZXggY2RkZDFjMi4uOTVlNWRkYyAxMDA2NDQKLS0tIGEvZWNvbXAtcG9ydGFsLUJFLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvcG9ydGFsYXBwL3BvcnRhbC9zZXJ2aWNlL0V4dGVybmFsQWNjZXNzUm9sZXNTZXJ2aWNlSW1wbC5qYXZhCisrKyBiL2Vjb21wLXBvcnRhbC1CRS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3BvcnRhbGFwcC9wb3J0YWwvc2VydmljZS9FeHRlcm5hbEFjY2Vzc1JvbGVzU2VydmljZUltcGwuamF2YQpAQCAtMyw2ICszLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CkBAIC0yMyw2ICsyNCw3IEBACiBpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxhcHAucG9ydGFsLmRvbWFpbi5FUFVzZXI7CiBpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxhcHAucG9ydGFsLmRvbWFpbi5FUFVzZXJBcHA7CiBpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxhcHAucG9ydGFsLmRvbWFpbi5FeHRlcm5hbFJvbGVEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsYXBwLnBvcnRhbC5sb2dnaW5nLmFvcC5FUEF1ZGl0TG9nOwogaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsYXBwLnBvcnRhbC5sb2dnaW5nLmFvcC5FUE1ldHJpY3NMb2c7CiBpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxhcHAucG9ydGFsLmxvZ2dpbmcubG9naWMuRVBMb2dVdGlsOwogaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsYXBwLnBvcnRhbC50cmFuc3BvcnQuQnVsa1VwbG9hZFJvbGVGdW5jdGlvbjsKQEAgLTY0LDMyICs2Niw2MiBAQAogQFNlcnZpY2UoImV4dGVybmFsQWNjZXNzUm9sZXNTZXJ2aWNlIikKIEBFbmFibGVBc3BlY3RKQXV0b1Byb3h5CiBARVBNZXRyaWNzTG9nCitARVBBdWRpdExvZwogcHVibGljIGNsYXNzIEV4dGVybmFsQWNjZXNzUm9sZXNTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEV4dGVybmFsQWNjZXNzUm9sZXNTZXJ2aWNlIHsKIAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJU19OVUxMX1NUUklORyA9ICJudWxsIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9BVVRIX1BFUk1TID0gInBlcm1zIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9BVVRIX1JPTEVfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdIRVJFX0FQUF9JRF9FUVVBTFMgPSAiIHdoZXJlIGFwcF9pZCA9ICI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfRU1QVFlfSlNPTl9TVFJJTkcgPSAie30iOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJTkdfVE9fRVhURVJOQUxfQVVUSF9TWVNURU1fTE9HX01FU1NBR0UgPSAiQ29ubmVjdGluZyB0byBFeHRlcm5hbCBBdXRoIHN5c3RlbSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hFUkVfUk9MRV9JRF9FUVVBTFMgPSAiIHdoZXJlIHJvbGVfaWQgPSAiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9ST0xFX0lEID0gImFwcFJvbGVJZCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0lEID0gImFwcElkIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWSA9ICJwcmlvcml0eSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZFID0gImFjdGl2ZSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9OQU1FID0gIm5hbWUiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImlkIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSEVSRV9ST0xFX05BTUVfRVFVQUxTID0gIiB3aGVyZSByb2xlX25hbWUgPSAnIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfSURfRVFVQUxTID0gIiBhcHBfaWQgPSAiOworCiAJcHJpdmF0ZSBzdGF0aWMgRUVMRkxvZ2dlckRlbGVnYXRlIGxvZ2dlciA9IEVFTEZMb2dnZXJEZWxlZ2F0ZS5nZXRMb2dnZXIoRXh0ZXJuYWxBY2Nlc3NSb2xlc1NlcnZpY2VJbXBsLmNsYXNzKTsKIAogCUBBdXRvd2lyZWQKIAlwcml2YXRlIERhdGFBY2Nlc3NTZXJ2aWNlIGRhdGFBY2Nlc3NTZXJ2aWNlOwotCQorCiAJQEF1dG93aXJlZAogCXByaXZhdGUgU2Vzc2lvbkZhY3Rvcnkgc2Vzc2lvbkZhY3Rvcnk7CiAKLQogCVJlc3RUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG5ldyBSZXN0VGVtcGxhdGUoKTsKIAogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PEVQUm9sZT4gZ2V0QXBwUm9sZXMoTG9uZyBhcHBJZCwgQm9vbGVhbiBleHRSZXF1ZXN0VmFsdWUpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyBMaXN0PEVQUm9sZT4gZ2V0QXBwUm9sZXMoTG9uZyBhcHBJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUxpc3Q8RVBSb2xlPiBhcHBsaWNhdGlvblJvbGVzID0gbnVsbDsKIAkJU3RyaW5nIGZpbHRlciA9IG51bGw7CiAJCXRyeSB7CiAJCQlpZiAoYXBwSWQgPT0gMSkgewogCQkJCWZpbHRlciA9ICIgd2hlcmUgYXBwX2lkIGlzIG51bGwiOwogCQkJfSBlbHNlIHsKLQkJCQlmaWx0ZXIgPSAiIHdoZXJlIGFwcF9pZCA9ICIgKyBhcHBJZDsKKwkJCQlmaWx0ZXIgPSBXSEVSRV9BUFBfSURfRVFVQUxTICsgYXBwSWQ7CiAJCQl9CiAJCQlhcHBsaWNhdGlvblJvbGVzID0gZGF0YUFjY2Vzc1NlcnZpY2UuZ2V0TGlzdChFUFJvbGUuY2xhc3MsIGZpbHRlciwgbnVsbCwgbnVsbCk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiZ2V0QXBwUm9sZXMgaXMgZmFpbGVkIiwgZSk7CisJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiZ2V0QXBwUm9sZXM6IGZhaWxlZCIsIGUpOwogCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CiAJCX0KIAkJcmV0dXJuIGFwcGxpY2F0aW9uUm9sZXM7CkBAIC0xMDEsMjcgKzEzMywzNSBAQAogCQlMaXN0PEVQQXBwPiBhcHAgPSBudWxsOwogCQl0cnkgewogCQkJYXBwID0gKExpc3Q8RVBBcHA+KSBkYXRhQWNjZXNzU2VydmljZS5nZXRMaXN0KEVQQXBwLmNsYXNzLCAiIHdoZXJlIHVlYl9rZXkgPSAnIiArIHVlYmtleSArICInIiwgbnVsbCwgbnVsbCk7CisJCQlpZighYXBwLmdldCgwKS5nZXRFbmFibGVkKCkpeworCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkFwcGxpY2F0aW9uOiIrYXBwLmdldCgwKS5nZXROYW1lKCkrIiBpcyBVbmF2YWlsYWJsZSIpOworCQkJfQogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImdldEFwcCBpcyBmYWlsZWQiLCBlKTsKKwkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJnZXRBcHA6IGZhaWxlZCIsIGUpOwogCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CiAJCX0KIAkJcmV0dXJuIGFwcDsKIAl9CiAKLQlwdWJsaWMgU3RyaW5nIGdldFNpbmdsZUFwcFJvbGUoU3RyaW5nIGFkZFJvbGUsIEVQQXBwIGFwcCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyByZXNwb25zZSA9ICIiOworCS8qKgorCSAqIEl0IHJldHVybnMgIHNpbmdsZSBhcHBsaWNhdGlvbiByb2xlIGZyb20gZXh0ZXJuYWwgYXV0aCBzeXN0ZW0gCisJICogQHBhcmFtIGFkZFJvbGUKKwkgKiBAcGFyYW0gYXBwCisJICogQHJldHVybiBKU09OIHN0cmluZyB3aGljaCBjb250YWlucyBhcHBsaWNhdGlvbiByb2xlIGRldGFpbHMKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgU3RyaW5nIGdldFNpbmdsZUFwcFJvbGUoU3RyaW5nIGFkZFJvbGUsIEVQQXBwIGFwcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUh0dHBIZWFkZXJzIGhlYWRlcnMgPSBFY29tcFBvcnRhbFV0aWxzLmJhc2U2NGVuY29kZUtleUZvckFBRkJhc2ljQXV0aCgpOwogCQlIdHRwRW50aXR5PFN0cmluZz4gZW50aXR5ID0gbmV3IEh0dHBFbnRpdHk8PihoZWFkZXJzKTsKLQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkNvbm5lY3RpbmcgdG8gRXh0ZXJuYWwgQWNjZXNzIHN5c3RlbSIpOwotCQlyZXNwb25zZSA9IHRlbXBsYXRlCisJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJnZXRTaW5nbGVBcHBSb2xlOiBDb25uZWN0aW5nIHRvIEV4dGVybmFsIEF1dGggc3lzdGVtIik7CisJCVJlc3BvbnNlRW50aXR5PFN0cmluZz4gcmVzcG9uc2UgPSB0ZW1wbGF0ZQogCQkJCS5leGNoYW5nZSgKIAkJCQkJCVN5c3RlbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkVYVEVSTkFMX0NFTlRSQUxfQUNDRVNTX1VSTCkgKyAicm9sZXMvIgogCQkJCQkJCQkrIGFwcC5nZXROYW1lU3BhY2UoKSArICIuIiArIGFkZFJvbGUucmVwbGFjZUFsbCgiICIsICJfIiksCi0JCQkJCQlIdHRwTWV0aG9kLkdFVCwgZW50aXR5LCBTdHJpbmcuY2xhc3MpCi0JCQkJLmdldEJvZHkoKTsKLQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkNvbm5lY3RlZCB0byBFeHRlcm5hbCBBY2Nlc3Mgc3lzdGVtIik7Ci0KLQkJcmV0dXJuIHJlc3BvbnNlOworCQkJCQkJSHR0cE1ldGhvZC5HRVQsIGVudGl0eSwgU3RyaW5nLmNsYXNzKTsKKwkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwKKwkJCQkiZ2V0U2luZ2xlQXBwUm9sZTogRmluaXNoZWQgR0VUIGFwcCByb2xlIGZyb20gRXh0ZXJuYWwgQXV0aCBzeXN0ZW0gYW5kIHN0YXR1cyBjb2RlOiB7fSAiLCByZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkudmFsdWUoKSk7CisJCXJldHVybiByZXNwb25zZS5nZXRCb2R5KCk7CiAJfQogCiAJQE92ZXJyaWRlCkBAIC0xMzAsNDMgKzE3MCw1MiBAQAogCQlSZXNwb25zZUVudGl0eTxTdHJpbmc+IGFkZFJlc3BvbnNlID0gbnVsbDsKIAkJSHR0cEhlYWRlcnMgaGVhZGVycyA9IEVjb21wUG9ydGFsVXRpbHMuYmFzZTY0ZW5jb2RlS2V5Rm9yQUFGQmFzaWNBdXRoKCk7CiAJCUVQQXBwIGFwcCA9IGdldEFwcCh1ZWJrZXkpLmdldCgwKTsKLQkJU3RyaW5nIG5ld1JvbGUgPSBjcmVhdGVOZXdSb2xlSW5FeHRlcm5hbFN5c3RlbShhZGRSb2xlLCBhcHApOworCQlTdHJpbmcgbmV3Um9sZSA9IHVwZGF0ZUV4aXN0aW5nUm9sZUluRXh0ZXJuYWxTeXN0ZW0oYWRkUm9sZSwgYXBwKTsKIAkJSHR0cEVudGl0eTxTdHJpbmc+IGVudGl0eSA9IG5ldyBIdHRwRW50aXR5PD4obmV3Um9sZSwgaGVhZGVycyk7Ci0JCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJDb25uZWN0aW5nIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0iKTsKKwkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgImFkZFJvbGU6IENvbm5lY3RpbmcgdG8gRXh0ZXJuYWwgQXV0aCBzeXN0ZW0iKTsKIAkJYWRkUmVzcG9uc2UgPSB0ZW1wbGF0ZS5leGNoYW5nZSgKIAkJCQlTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VUkwpICsgInJvbGUiLAogCQkJCUh0dHBNZXRob2QuUE9TVCwgZW50aXR5LCBTdHJpbmcuY2xhc3MpOwogCQlpZiAoYWRkUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLnZhbHVlKCkgPT0gMjAxKSB7CiAJCQlyZXNwb25zZSA9IHRydWU7Ci0JCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiQ29ubmVjdGVkIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0iKTsKKwkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJhZGRSb2xlOiBGaW5pc2hlZCBhZGRpbmcgcm9sZSBpbiB0aGUgRXh0ZXJuYWwgQXV0aCBzeXN0ZW0gIGFuZCByZXNwb25zZSBjb2RlOiB7fSAiLCBhZGRSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkudmFsdWUoKSk7CiAJCX0KIAkJaWYgKGFkZFJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKS52YWx1ZSgpID09IDQwNikgewotCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkNvbm5lY3RlZCB0byBFeHRlcm5hbCBBY2Nlc3Mgc3lzdGVtIGJ1dCBzb21ldGhpbmcgd2VudCB3cm9uZyEiKTsKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGUgcm9sZSIpOworCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwKKwkJCQkJImFkZFJvbGU6IEZhaWxlZCB0byBhZGQgaW4gdGhlIEV4dGVybmFsIEF1dGggc3lzdGVtIGR1ZSB0byB7fSBhbmQgc3RhdHVzIGNvZGU6IHt9IiwgYWRkUmVzcG9uc2UuZ2V0Qm9keSgpLCBhZGRSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkudmFsdWUoKSk7CiAJCX0KIAkJcmV0dXJuIHJlc3BvbnNlOwogCX0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZVJvbGUoUm9sZSBhZGRSb2xlLCBFUEFwcCBhcHApIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGFkZFJlc3BvbnNlID0gdXBkYXRlUm9sZUluRXh0ZXJuYWxTeXN0ZW0oYWRkUm9sZSwgYXBwKTsKLQkJaWYgKCFhZGRSZXNwb25zZSkgewotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHRvIHVwZGF0ZSBhIHJvbGUiKTsKLQkJfQotCX0KLQorCS8qKgorCSAqIAorCSAqIEl0IGRlbGV0ZXMgcmVjb3JkIGluIGV4dGVybmFsIGF1dGggc3lzdGVtCisJICogCisJICogQHBhcmFtIGRlbFJvbGUKKwkgKiBAcmV0dXJuIEpTT04gU3RyaW5nIHdoaWNoIGhhcyBzdGF0dXMgY29kZSBhbmQgcmVzcG9uc2UgYm9keSAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLwogCXByaXZhdGUgUmVzcG9uc2VFbnRpdHk8U3RyaW5nPiBkZWxldGVSb2xlSW5FeHRlcm5hbFN5c3RlbShTdHJpbmcgZGVsUm9sZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVJlc3BvbnNlRW50aXR5PFN0cmluZz4gZGVsUmVzcG9uc2UgPSBudWxsOwogCQlIdHRwSGVhZGVycyBoZWFkZXJzID0gRWNvbXBQb3J0YWxVdGlscy5iYXNlNjRlbmNvZGVLZXlGb3JBQUZCYXNpY0F1dGgoKTsKIAkJSHR0cEVudGl0eTxTdHJpbmc+IGVudGl0eSA9IG5ldyBIdHRwRW50aXR5PD4oZGVsUm9sZSwgaGVhZGVycyk7Ci0JCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJDb25uZWN0aW5nIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0iKTsKKwkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgImRlbGV0ZVJvbGVJbkV4dGVybmFsU3lzdGVtOiB7fSAiICwgQ09OTkVDVElOR19UT19FWFRFUk5BTF9BVVRIX1NZU1RFTV9MT0dfTUVTU0FHRSk7CiAJCWRlbFJlc3BvbnNlID0gdGVtcGxhdGUuZXhjaGFuZ2UoCiAJCQkJU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKSArICJyb2xlP2ZvcmNlPXRydWUiLAogCQkJCUh0dHBNZXRob2QuREVMRVRFLCBlbnRpdHksIFN0cmluZy5jbGFzcyk7Ci0JCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJDb25uZWN0ZWQgdG8gRXh0ZXJuYWwgQWNjZXNzIHN5c3RlbSIpOworCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiZGVsZXRlUm9sZUluRXh0ZXJuYWxTeXN0ZW06IEZpbmlzaGVkIERFTEVURSBvcGVyYXRpb24gaW4gdGhlIEV4dGVybmFsIEF1dGggc3lzdGVtIGFuZCBzdGF0dXMgY29kZToge30gIiwgZGVsUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLnZhbHVlKCkpOwogCQlyZXR1cm4gZGVsUmVzcG9uc2U7CiAJfQogCisJLyoqCisJICogSXQgdXBkYXRlcyByb2xlIGluIGV4dGVybmFsIGF1dGggc3lzdGVtCisJICogCisJICogQHBhcmFtIHVwZGF0ZUV4dFJvbGUKKwkgKiBAcGFyYW0gYXBwCisJICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3MgZWxzZSBmYWxzZQorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICogCQkJCQlJZiB1cGRhdGVSb2xlSW5FeHRlcm5hbFN5c3RlbSBmYWlscyB3ZSBjYXRjaCBpdCBpbiBsb2dnZXIgZm9yIGRldGFpbCBtZXNzYWdlCisJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVJvbGVJbkV4dGVybmFsU3lzdGVtKFJvbGUgdXBkYXRlRXh0Um9sZSwgRVBBcHAgYXBwKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYm9vbGVhbiByZXNwb25zZSA9IGZhbHNlOwpAQCAtMTc2LDc1ICsyMjUsODUgQEAKIAkJRXh0ZXJuYWxBY2Nlc3NSb2xlUGVybXMgZXh0Um9sZVBlcm1zID0gbnVsbDsKIAkJRXh0ZXJuYWxBY2Nlc3NQZXJtcyBleHRQZXJtcyA9IG51bGw7CiAJCUxpc3Q8RVBSb2xlPiBlcFJvbGVMaXN0ID0gbnVsbDsKLQkJCWVwUm9sZUxpc3QgPSBkYXRhQWNjZXNzU2VydmljZS5nZXRMaXN0KEVQUm9sZS5jbGFzcywKLQkJCQkiIHdoZXJlIHJvbGVfaWQgPSAiICsgdXBkYXRlRXh0Um9sZS5nZXRJZCgpLCBudWxsLCBudWxsKTsKKwkJZXBSb2xlTGlzdCA9IGRhdGFBY2Nlc3NTZXJ2aWNlLmdldExpc3QoRVBSb2xlLmNsYXNzLCBXSEVSRV9ST0xFX0lEX0VRVUFMUyArIHVwZGF0ZUV4dFJvbGUuZ2V0SWQoKSwgbnVsbCwgbnVsbCk7CiAJCVN0cmluZyBhcHBSb2xlID0gZ2V0U2luZ2xlQXBwUm9sZShlcFJvbGVMaXN0LmdldCgwKS5nZXROYW1lKCksIGFwcCk7Ci0JCWlmICghYXBwUm9sZS5lcXVhbHMoInt9IikpIHsKKwkJaWYgKCFhcHBSb2xlLmVxdWFscyhJU19FTVBUWV9KU09OX1NUUklORykpIHsKIAkJCUpTT05PYmplY3QganNvbk9iaiA9IG5ldyBKU09OT2JqZWN0KGFwcFJvbGUpOwogCQkJSlNPTkFycmF5IGV4dFJvbGUgPSBqc29uT2JqLmdldEpTT05BcnJheSgicm9sZSIpOwotCQkJaWYgKCFleHRSb2xlLmdldEpTT05PYmplY3QoMCkuaGFzKCJkZXNjcmlwdGlvbiIpKSB7Ci0JCQkJU3RyaW5nIHJvbGVOYW1lID0gZXh0Um9sZS5nZXRKU09OT2JqZWN0KDApLmdldFN0cmluZygibmFtZSIpOwotCQkJCVN0cmluZyBkZWxSb2xlS2V5ID0gIntcIm5hbWVcIjpcIiIgKyByb2xlTmFtZSArICJcIn0iOwotCQkJCWRlbGV0ZVJlc3BvbnNlID0gZGVsZXRlUm9sZUluRXh0ZXJuYWxTeXN0ZW0oZGVsUm9sZUtleSk7CisJCQlpZiAoIWV4dFJvbGUuZ2V0SlNPTk9iamVjdCgwKS5oYXMoRVhURVJOQUxfQVVUSF9ST0xFX0RFU0NSSVBUSU9OKSkgeworCQkJCVN0cmluZyByb2xlTmFtZSA9IGV4dFJvbGUuZ2V0SlNPTk9iamVjdCgwKS5nZXRTdHJpbmcoUk9MRV9OQU1FKTsKKwkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGRlbFJvbGVLZXlNYXBwZXIgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQkJZGVsUm9sZUtleU1hcHBlci5wdXQoUk9MRV9OQU1FLCByb2xlTmFtZSk7CisJCQkJU3RyaW5nIGRlbFJvbGVLZXlWYWx1ZSA9IG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoZGVsUm9sZUtleU1hcHBlcik7CisJCQkJZGVsZXRlUmVzcG9uc2UgPSBkZWxldGVSb2xlSW5FeHRlcm5hbFN5c3RlbShkZWxSb2xlS2V5VmFsdWUpOwogCQkJCWlmIChkZWxldGVSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkudmFsdWUoKSAhPSAyMDApIHsKLQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHRvIGRlbGV0ZSByb2xlIGluIGV4dGVybmFsIGFjY2VzcyBzeXN0ZW0hIik7CisJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oZGVsZXRlUmVzcG9uc2UuZ2V0Qm9keSgpKTsKIAkJCQl9CiAJCQkJYWRkUm9sZSh1cGRhdGVFeHRSb2xlLCBhcHAuZ2V0VWViS2V5KCkpOwogCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgZGVzYyA9IGV4dFJvbGUuZ2V0SlNPTk9iamVjdCgwKS5nZXRTdHJpbmcoImRlc2NyaXB0aW9uIik7Ci0JCQkJU3RyaW5nIG5hbWUgPSBleHRSb2xlLmdldEpTT05PYmplY3QoMCkuZ2V0U3RyaW5nKCJuYW1lIik7CisJCQkJU3RyaW5nIGRlc2MgPSBleHRSb2xlLmdldEpTT05PYmplY3QoMCkuZ2V0U3RyaW5nKEVYVEVSTkFMX0FVVEhfUk9MRV9ERVNDUklQVElPTik7CisJCQkJU3RyaW5nIG5hbWUgPSBleHRSb2xlLmdldEpTT05PYmplY3QoMCkuZ2V0U3RyaW5nKFJPTEVfTkFNRSk7CiAJCQkJTGlzdDxFeHRlcm5hbEFjY2Vzc1Blcm1zPiBsaXN0ID0gbnVsbDsKLQkJCQlpZiAoZXh0Um9sZS5nZXRKU09OT2JqZWN0KDApLmhhcygicGVybXMiKSkgewotCQkJCQlKU09OQXJyYXkgcGVybXMgPSBleHRSb2xlLmdldEpTT05PYmplY3QoMCkuZ2V0SlNPTkFycmF5KCJwZXJtcyIpOwotCQkJCQlPYmplY3RNYXBwZXIgcGVybXNNYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7Ci0JCQkJCWxpc3QgPSBwZXJtc01hcHBlci5yZWFkVmFsdWUocGVybXMudG9TdHJpbmcoKSwgVHlwZUZhY3RvcnkuZGVmYXVsdEluc3RhbmNlKCkKKwkJCQlpZiAoZXh0Um9sZS5nZXRKU09OT2JqZWN0KDApLmhhcyhFWFRFUk5BTF9BVVRIX1BFUk1TKSkgeworCQkJCQlKU09OQXJyYXkgcGVybXMgPSBleHRSb2xlLmdldEpTT05PYmplY3QoMCkuZ2V0SlNPTkFycmF5KEVYVEVSTkFMX0FVVEhfUEVSTVMpOworCQkJCQlsaXN0ID0gbWFwcGVyLnJlYWRWYWx1ZShwZXJtcy50b1N0cmluZygpLCBUeXBlRmFjdG9yeS5kZWZhdWx0SW5zdGFuY2UoKQogCQkJCQkJCS5jb25zdHJ1Y3RDb2xsZWN0aW9uVHlwZShMaXN0LmNsYXNzLCBFeHRlcm5hbEFjY2Vzc1Blcm1zLmNsYXNzKSk7CiAJCQkJfQotCQkJCU9iamVjdE1hcHBlciByb2xlTWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOwotCQkJCUV4dGVybmFsUm9sZURlc2NyaXB0aW9uIHN5c1JvbGVMaXN0ID0gcm9sZU1hcHBlci5yZWFkVmFsdWUoZGVzYywgRXh0ZXJuYWxSb2xlRGVzY3JpcHRpb24uY2xhc3MpOworCQkJCUV4dGVybmFsUm9sZURlc2NyaXB0aW9uIHN5c1JvbGVMaXN0ID0gbWFwcGVyLnJlYWRWYWx1ZShkZXNjLCBFeHRlcm5hbFJvbGVEZXNjcmlwdGlvbi5jbGFzcyk7CiAJCQkJLy8gSWYgcm9sZSBuYW1lIG9yIHJvbGUgZnVuY3Rpb25zIGFyZSB1cGRhdGVkIHRoZW4gZGVsZXRlIHJlY29yZCBpbiBFeHRlcm5hbCBTeXN0ZW0gYW5kIGFkZCBuZXcgcmVjb3JkIHRvIGF2b2lkIGNvbmZsaWN0cwogCQkJCUJvb2xlYW4gZXhpc3RpbmdSb2xlQWN0aXZlOwotCQkJCWJvb2xlYW4gcmVzOworCQkJCWJvb2xlYW4gaXNBY3RpdmVWYWx1ZUNoYW5nZWQ7CiAJCQkJLy8gY2hlY2sgcm9sZSBhY3RpdmUgc3RhdHVzCiAJCQkJZXhpc3RpbmdSb2xlQWN0aXZlID0gbmV3IEJvb2xlYW4oc3lzUm9sZUxpc3QuZ2V0QWN0aXZlKCkpOwotCQkJCXJlcyA9IGV4aXN0aW5nUm9sZUFjdGl2ZS5lcXVhbHModXBkYXRlRXh0Um9sZS5nZXRBY3RpdmUoKSk7CisJCQkJaXNBY3RpdmVWYWx1ZUNoYW5nZWQgPSBleGlzdGluZ1JvbGVBY3RpdmUuZXF1YWxzKHVwZGF0ZUV4dFJvbGUuZ2V0QWN0aXZlKCkpOwogCQkJCWlmICghc3lzUm9sZUxpc3QuZ2V0TmFtZSgpLmVxdWFscyh1cGRhdGVFeHRSb2xlLmdldE5hbWUoKSkpIHsKLQkJCQkJU3RyaW5nIGRlbGV0ZVJvbGVLZXkgPSAie1wibmFtZVwiOlwiIiArIG5hbWUgKyAiXCJ9IjsKLQkJCQkJZGVsZXRlUmVzcG9uc2UgPSBkZWxldGVSb2xlSW5FeHRlcm5hbFN5c3RlbShkZWxldGVSb2xlS2V5KTsKKwkJCQkJTWFwPFN0cmluZywgU3RyaW5nPiBkZWxSb2xlS2V5TWFwcGVyID0gbmV3IEhhc2hNYXA8PigpOworCQkJCQlkZWxSb2xlS2V5TWFwcGVyLnB1dChST0xFX05BTUUsIG5hbWUpOworCQkJCQlTdHJpbmcgZGVsUm9sZUtleVZhbHVlID0gbWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZyhkZWxSb2xlS2V5TWFwcGVyKTsJCisJCQkJCWRlbGV0ZVJlc3BvbnNlID0gZGVsZXRlUm9sZUluRXh0ZXJuYWxTeXN0ZW0oZGVsUm9sZUtleVZhbHVlKTsKIAkJCQkJaWYgKGRlbGV0ZVJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKS52YWx1ZSgpICE9IDIwMCkgewotCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHRvIGRlbGV0ZSByb2xlIGluIGV4dGVybmFsIGFjY2VzcyBzeXN0ZW0hIik7CisJCQkJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAidXBkYXRlUm9sZUluRXh0ZXJuYWxTeXN0ZW06ICBGYWlsZWQgdG8gZGVsZXRlIHJvbGUgaW4gZXh0ZXJuYWwgc3lzdGVtIGR1ZSB0byB7fSAiLCBkZWxldGVSZXNwb25zZS5nZXRCb2R5KCkpOworCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihkZWxldGVSZXNwb25zZS5nZXRCb2R5KCkpOwogCQkJCQl9Ci0JCQkJCXJlc3BvbnNlID0gYWRkUm9sZSh1cGRhdGVFeHRSb2xlLCBhcHAuZ2V0VWViS2V5KCkpOwotCQkJCQlPYmplY3RNYXBwZXIgYWRkUGVybXNNYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7Ci0JCQkJCXJlc3BvbnNlID0gYWRkUm9sZUZ1bmN0aW9uc0luRXh0ZXJuYWxTeXN0ZW0odXBkYXRlRXh0Um9sZSwgYWRkUGVybXNNYXBwZXIsIGFwcCk7CisJCQkJCWFkZFJvbGUodXBkYXRlRXh0Um9sZSwgYXBwLmdldFVlYktleSgpKTsKKwkJCQkJYWRkUm9sZUZ1bmN0aW9uc0luRXh0ZXJuYWxTeXN0ZW0odXBkYXRlRXh0Um9sZSwgbWFwcGVyLCBhcHApOwogCQkJCX0KIAkJCQlFeHRlcm5hbEFjY2Vzc1JvbGUgdXBkYXRlUm9sZSA9IG5ldyBFeHRlcm5hbEFjY2Vzc1JvbGUoKTsKLQkJCQlpZiAoIXJlcyB8fCAhc3lzUm9sZUxpc3QuZ2V0UHJpb3JpdHkoKS5lcXVhbHMoU3RyaW5nLnZhbHVlT2YodXBkYXRlRXh0Um9sZS5nZXRQcmlvcml0eSgpKSkgfHwgCi0JCQkJCQlzeXNSb2xlTGlzdC5nZXRJZCgpLmVxdWFscygibnVsbCIpKSB7CisJCQkJaWYgKCFpc0FjdGl2ZVZhbHVlQ2hhbmdlZAorCQkJCQkJfHwgIXN5c1JvbGVMaXN0LmdldFByaW9yaXR5KCkuZXF1YWxzKFN0cmluZy52YWx1ZU9mKHVwZGF0ZUV4dFJvbGUuZ2V0UHJpb3JpdHkoKSkpCisJCQkJCQl8fCBzeXNSb2xlTGlzdC5nZXRJZCgpLmVxdWFscyhJU19OVUxMX1NUUklORykKKwkJCQkJCXx8ICFzeXNSb2xlTGlzdC5nZXRJZCgpLmVxdWFscyhTdHJpbmcudmFsdWVPZihlcFJvbGVMaXN0LmdldCgwKS5nZXRJZCgpKSkpIHsKIAkJCQkJU3RyaW5nIHVwZGF0ZURlc2MgPSAiIjsKKwkJCQkJU3RyaW5nIGFwcElkID0gKGFwcC5nZXRJZCgpLmVxdWFscyhQb3J0YWxDb25zdGFudHMuUE9SVEFMX0FQUF9JRCkpID8gIiBhcHBfaWQgaXMgbnVsbCIKKwkJCQkJCQk6IEFQUF9JRF9FUVVBTFMgKyBhcHAuZ2V0SWQoKTsKIAkJCQkJTGlzdDxFUFJvbGU+IGdldFJvbGUgPSBkYXRhQWNjZXNzU2VydmljZS5nZXRMaXN0KEVQUm9sZS5jbGFzcywKLQkJCQkJCQkiIHdoZXJlIHJvbGVfbmFtZSA9ICciICsgdXBkYXRlRXh0Um9sZS5nZXROYW1lKCkgKyAiJyIsIG51bGwsIG51bGwpOworCQkJCQkJCVdIRVJFX1JPTEVfTkFNRV9FUVVBTFMgKyB1cGRhdGVFeHRSb2xlLmdldE5hbWUoKSArICInIGFuZCAiICsgYXBwSWQsIG51bGwsIG51bGwpOworCQkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGV4dFN5c3RlbVVwZGF0ZVJvbGVKc29uTWFwcGVyID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOworCQkJCQlleHRTeXN0ZW1VcGRhdGVSb2xlSnNvbk1hcHBlci5wdXQoSUQsIGdldFJvbGUuZ2V0KDApLmdldElkKCkpOworCQkJCQlleHRTeXN0ZW1VcGRhdGVSb2xlSnNvbk1hcHBlci5wdXQoUk9MRV9OQU1FLCB1cGRhdGVFeHRSb2xlLmdldE5hbWUoKSk7CisJCQkJCWV4dFN5c3RlbVVwZGF0ZVJvbGVKc29uTWFwcGVyLnB1dChBQ1RJVkUsIHVwZGF0ZUV4dFJvbGUuZ2V0QWN0aXZlKCkpOworCQkJCQlleHRTeXN0ZW1VcGRhdGVSb2xlSnNvbk1hcHBlci5wdXQoUFJJT1JJVFksIHVwZGF0ZUV4dFJvbGUuZ2V0UHJpb3JpdHkoKSk7CiAJCQkJCWlmIChhcHAuZ2V0SWQoKS5lcXVhbHMoUG9ydGFsQ29uc3RhbnRzLlBPUlRBTF9BUFBfSUQpKSB7Ci0JCQkJCQl1cGRhdGVEZXNjID0gIntcImlkXCI6XCIiICsgZ2V0Um9sZS5nZXQoMCkuZ2V0SWQoKSArICJcIixcIm5hbWVcIjpcIiIgKyB1cGRhdGVFeHRSb2xlLmdldE5hbWUoKQotCQkJCQkJCQkrICJcIixcImFjdGl2ZVwiOlwiIiArIHVwZGF0ZUV4dFJvbGUuZ2V0QWN0aXZlKCkgKyAiXCIsXCJwcmlvcml0eVwiOlwiIgotCQkJCQkJCQkrIHVwZGF0ZUV4dFJvbGUuZ2V0UHJpb3JpdHkoKSArICJcIixcImFwcElkXCI6XCJudWxsXCIsXCJhcHBSb2xlSWRcIjpcIm51bGxcIn0iOwotCisJCQkJCQlleHRTeXN0ZW1VcGRhdGVSb2xlSnNvbk1hcHBlci5wdXQoQVBQX0lELCBudWxsKTsKKwkJCQkJCWV4dFN5c3RlbVVwZGF0ZVJvbGVKc29uTWFwcGVyLnB1dChBUFBfUk9MRV9JRCwgbnVsbCk7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQl1cGRhdGVEZXNjID0gIntcImlkXCI6XCIiICsgZ2V0Um9sZS5nZXQoMCkuZ2V0SWQoKSArICJcIixcIm5hbWVcIjpcIiIgKyB1cGRhdGVFeHRSb2xlLmdldE5hbWUoKQotCQkJCQkJCQkrICJcIixcImFjdGl2ZVwiOlwiIiArIHVwZGF0ZUV4dFJvbGUuZ2V0QWN0aXZlKCkgKyAiXCIsXCJwcmlvcml0eVwiOlwiIgotCQkJCQkJCQkrIHVwZGF0ZUV4dFJvbGUuZ2V0UHJpb3JpdHkoKSArICJcIixcImFwcElkXCI6XCIiICsgYXBwLmdldElkKCkgKyAiXCIsXCJhcHBSb2xlSWRcIjpcIiIKLQkJCQkJCQkJKyBnZXRSb2xlLmdldCgwKS5nZXRBcHBSb2xlSWQoKSArICJcIn0iOworCQkJCQkJZXh0U3lzdGVtVXBkYXRlUm9sZUpzb25NYXBwZXIucHV0KEFQUF9JRCwgYXBwLmdldElkKCkpOworCQkJCQkJZXh0U3lzdGVtVXBkYXRlUm9sZUpzb25NYXBwZXIucHV0KEFQUF9ST0xFX0lELCBnZXRSb2xlLmdldCgwKS5nZXRBcHBSb2xlSWQoKSk7CiAKIAkJCQkJfQorCQkJCQl1cGRhdGVEZXNjID0gbWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZyhleHRTeXN0ZW1VcGRhdGVSb2xlSnNvbk1hcHBlcik7CiAJCQkJCXVwZGF0ZVJvbGUuc2V0TmFtZShhcHAuZ2V0TmFtZVNwYWNlKCkgKyAiLiIgKyB1cGRhdGVFeHRSb2xlLmdldE5hbWUoKS5yZXBsYWNlQWxsKCIgIiwgIl8iKSk7CiAJCQkJCXVwZGF0ZVJvbGUuc2V0RGVzY3JpcHRpb24odXBkYXRlRGVzYyk7CiAJCQkJCVN0cmluZyB1cGRhdGVSb2xlRGVzYyA9IG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcodXBkYXRlUm9sZSk7CiAJCQkJCUh0dHBFbnRpdHk8U3RyaW5nPiBlbnRpdHkgPSBuZXcgSHR0cEVudGl0eTw+KHVwZGF0ZVJvbGVEZXNjLCBoZWFkZXJzKTsKLQkJCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkNvbm5lY3RpbmcgdG8gRXh0ZXJuYWwgQWNjZXNzIHN5c3RlbSIpOwotCQkJCQl0ZW1wbGF0ZS5leGNoYW5nZSgKKwkJCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwKKwkJCQkJCQkidXBkYXRlUm9sZUluRXh0ZXJuYWxTeXN0ZW06IHt9ICIgLCBDT05ORUNUSU5HX1RPX0VYVEVSTkFMX0FVVEhfU1lTVEVNX0xPR19NRVNTQUdFKTsKKwkJCQkJUmVzcG9uc2VFbnRpdHk8U3RyaW5nPiB1cGRhdGVQZXJtc1Jlc3BvbnNlID0gdGVtcGxhdGUuZXhjaGFuZ2UoCiAJCQkJCQkJU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKSArICJyb2xlIiwKIAkJCQkJCQlIdHRwTWV0aG9kLlBVVCwgZW50aXR5LCBTdHJpbmcuY2xhc3MpOwotCQkJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiQ29ubmVjdGVkIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0iKTsKKwkJCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwKKwkJCQkJCQkidXBkYXRlUm9sZUluRXh0ZXJuYWxTeXN0ZW06IEZpbmlzaGVkIHVwZGF0aW5nIGluIEV4dGVybmFsIEF1dGggc3lzdGVtIGFuZCBzdGF0dXMgY29kZToge30gIiwKKwkJCQkJCQl1cGRhdGVQZXJtc1Jlc3BvbnNlLmdldFN0YXR1c0NvZGUoKS52YWx1ZSgpKTsKIAkJCQl9CiAJCQkJTGlzdDxSb2xlRnVuY3Rpb24+IHJvbGVGdW5jdGlvbkxpc3ROZXcgPSBjb252ZXJ0U2V0VG9MaXN0T2ZSb2xlRnVuY3Rpb25zKHVwZGF0ZUV4dFJvbGUpOwogCQkJCU1hcDxTdHJpbmcsIFJvbGVGdW5jdGlvbj4gdXBkYXRlUm9sZUZ1bmMgPSBuZXcgSGFzaE1hcDw+KCk7CkBAIC0yNTMsMTcgKzMxMiwxNiBAQAogCQkJCX0KIAkJCQlmaW5hbCBNYXA8U3RyaW5nLCBFeHRlcm5hbEFjY2Vzc1Blcm1zPiBleHRSb2xlUGVybU1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKIAkJCQkvLyBVcGRhdGUgcGVybWlzc2lvbnMgaW4gdGhlIEV4dGVybmFsQWNjZXNzIFN5c3RlbQotCQkJCU9iamVjdE1hcHBlciBwZXJtTWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOwogCQkJCWlmIChsaXN0ICE9IG51bGwpIHsKIAkJCQkJZm9yIChFeHRlcm5hbEFjY2Vzc1Blcm1zIHBlcm0gOiBsaXN0KSB7CiAJCQkJCQlpZiAoIXVwZGF0ZVJvbGVGdW5jLmNvbnRhaW5zS2V5KHBlcm0uZ2V0SW5zdGFuY2UoKSkpIHsKLQkJCQkJCQlyZW1vdmVQZXJtRm9yUm9sZShwZXJtLCBwZXJtTWFwcGVyLCBuYW1lLCBoZWFkZXJzKTsKKwkJCQkJCQlyZW1vdmVQZXJtRm9yUm9sZShwZXJtLCBtYXBwZXIsIG5hbWUsIGhlYWRlcnMpOwogCQkJCQkJfQogCQkJCQkJZXh0Um9sZVBlcm1NYXAucHV0KHBlcm0uZ2V0SW5zdGFuY2UoKSwgcGVybSk7CiAJCQkJCX0KIAkJCQl9CiAJCQkJcmVzcG9uc2UgPSB0cnVlOwotCQkJCWlmICghcm9sZUZ1bmN0aW9uTGlzdE5ldy5pc0VtcHR5KCkgfHwgcm9sZUZ1bmN0aW9uTGlzdE5ldy5zaXplKCkgPiAwKSB7CisJCQkJaWYgKCFyb2xlRnVuY3Rpb25MaXN0TmV3LmlzRW1wdHkoKSkgewogCQkJCQlmb3IgKFJvbGVGdW5jdGlvbiByb2xlRnVuYyA6IHJvbGVGdW5jdGlvbkxpc3ROZXcpIHsKIAkJCQkJCWlmICghZXh0Um9sZVBlcm1NYXAuY29udGFpbnNLZXkocm9sZUZ1bmMuZ2V0Q29kZSgpKSkgewogCQkJCQkJCVN0cmluZyBjaGVja1R5cGUgPSByb2xlRnVuYy5nZXRDb2RlKCkuY29udGFpbnMoIm1lbnUiKSA/ICJtZW51IiA6ICJ1cmwiOwpAQCAtMjczLDcgKzMzMSw3IEBACiAJCQkJCQkJCQlhcHAuZ2V0TmFtZVNwYWNlKCkgKyAiLiIgKyB1cGRhdGVFeHRSb2xlLmdldE5hbWUoKS5yZXBsYWNlQWxsKCIgIiwgIl8iKSk7CiAJCQkJCQkJU3RyaW5nIHVwZGF0ZVJvbGVQZXJtcyA9IG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoZXh0Um9sZVBlcm1zKTsKIAkJCQkJCQlIdHRwRW50aXR5PFN0cmluZz4gZW50aXR5ID0gbmV3IEh0dHBFbnRpdHk8Pih1cGRhdGVSb2xlUGVybXMsIGhlYWRlcnMpOwotCQkJCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJDb25uZWN0aW5nIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0iKTsKKwkJCQkJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAidXBkYXRlUm9sZUluRXh0ZXJuYWxTeXN0ZW06IHt9ICIgLCBDT05ORUNUSU5HX1RPX0VYVEVSTkFMX0FVVEhfU1lTVEVNX0xPR19NRVNTQUdFKTsKIAkJCQkJCQlSZXNwb25zZUVudGl0eTxTdHJpbmc+IGFkZFJlc3BvbnNlID0gdGVtcGxhdGUuZXhjaGFuZ2UoCiAJCQkJCQkJCQlTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VUkwpCiAJCQkJCQkJCQkJCSsgInJvbGUvcGVybSIsCkBAIC0yODEsMjkgKzMzOSw0MSBAQAogCQkJCQkJCWlmIChhZGRSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkudmFsdWUoKSAhPSAyMDEpIHsKIAkJCQkJCQkJcmVzcG9uc2UgPSBmYWxzZTsKIAkJCQkJCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwKLQkJCQkJCQkJCQkiQ29ubmVjdGVkIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0gYnV0IHNvbWV0aGluZyB3ZW50IHdyb25nISBkdWUgdG8ge30gYW5kIHN0YXR1c2NvZGU6IHt9IiwgYWRkUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLmdldFJlYXNvblBocmFzZSgpLCBhZGRSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkudmFsdWUoKSk7CisJCQkJCQkJCQkJInVwZGF0ZVJvbGVJbkV4dGVybmFsU3lzdGVtOiBDb25uZWN0ZWQgdG8gRXh0ZXJuYWwgQXV0aCBzeXN0ZW0gYnV0IHNvbWV0aGluZyB3ZW50IHdyb25nISBkdWUgdG8ge30gYW5kIHN0YXR1c2NvZGU6IHt9IiwKKwkJCQkJCQkJCQlhZGRSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkuZ2V0UmVhc29uUGhyYXNlKCksCisJCQkJCQkJCQkJYWRkUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLnZhbHVlKCkpOwogCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCXJlc3BvbnNlID0gdHJ1ZTsKLQkJCQkJCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkNvbm5lY3RlZCB0byBFeHRlcm5hbCBBY2Nlc3Mgc3lzdGVtIik7CisJCQkJCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJ1cGRhdGVSb2xlSW5FeHRlcm5hbFN5c3RlbTogRmluaXNoZWQgYWRkaW5nIHBlcm1pc3Npb25zIHRvIHJvbGVzIGluIEV4dGVybmFsIEF1dGggc3lzdGVtIGFuZCBzdGF0dXMgY29kZToge30gIiwgYWRkUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLnZhbHVlKCkpOwogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsKLQkJCS8vIEl0IHNlZW1zIGxpa2Ugcm9sZSBleGlzdHMgaW4gbG9jYWwgREIgYnV0IG5vdCBpbiBFeHRlcm5hbCBBY2Nlc3MgIHN5c3RlbQorCQkJLy8gSXQgc2VlbXMgbGlrZSByb2xlIGV4aXN0cyBpbiBsb2NhbCBEQiBidXQgbm90IGluIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0KIAkJCWFkZFJvbGUodXBkYXRlRXh0Um9sZSwgYXBwLmdldFVlYktleSgpKTsKIAkJCUxpc3Q8Um9sZUZ1bmN0aW9uPiByb2xlRnVuY3Rpb25MaXN0VXBkYXRlID0gY29udmVydFNldFRvTGlzdE9mUm9sZUZ1bmN0aW9ucyh1cGRhdGVFeHRSb2xlKTsKIAkJCXJlc3BvbnNlID0gdHJ1ZTsKLQkJCWlmICghcm9sZUZ1bmN0aW9uTGlzdFVwZGF0ZS5pc0VtcHR5KCkgfHwgcm9sZUZ1bmN0aW9uTGlzdFVwZGF0ZS5zaXplKCkgPiAwKSB7Ci0JCQkJT2JqZWN0TWFwcGVyIGFkZFBlcm1zTWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOwotCQkJCWFkZFJvbGVGdW5jdGlvbnNJbkV4dGVybmFsU3lzdGVtKHVwZGF0ZUV4dFJvbGUsIGFkZFBlcm1zTWFwcGVyLCBhcHApOworCQkJaWYgKCFyb2xlRnVuY3Rpb25MaXN0VXBkYXRlLmlzRW1wdHkoKSkgeworCQkJCWFkZFJvbGVGdW5jdGlvbnNJbkV4dGVybmFsU3lzdGVtKHVwZGF0ZUV4dFJvbGUsIG1hcHBlciwgYXBwKTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gcmVzcG9uc2U7CiAJfQogCQotCXByaXZhdGUgYm9vbGVhbiBhZGRSb2xlRnVuY3Rpb25zSW5FeHRlcm5hbFN5c3RlbShSb2xlIHVwZGF0ZUV4dFJvbGUsIE9iamVjdE1hcHBlciBhZGRQZXJtc01hcHBlciwgRVBBcHAgYXBwKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkvKioKKwkgKiAKKwkgKiBJdCBhZGRzIGZ1bmN0aW9ucyB0byB0aGUgcm9sZSBpbiBleHRlcm5hbCBhdXRoIHN5c3RlbSAKKwkgKiAKKwkgKiBAcGFyYW0gdXBkYXRlRXh0Um9sZQorCSAqIEBwYXJhbSBhZGRQZXJtc01hcHBlcgorCSAqIEBwYXJhbSBhcHAKKwkgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2VzcyBlbHNlIGZhbHNlCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gYWRkUm9sZUZ1bmN0aW9uc0luRXh0ZXJuYWxTeXN0ZW0oUm9sZSB1cGRhdGVFeHRSb2xlLCBPYmplY3RNYXBwZXIgYWRkUGVybXNNYXBwZXIsIEVQQXBwIGFwcCkKKwkJCXRocm93cyBFeGNlcHRpb24gewogCQlib29sZWFuIHJlc3BvbnNlID0gZmFsc2U7CiAJCUV4dGVybmFsQWNjZXNzUm9sZVBlcm1zIGV4dEFkZFJvbGVQZXJtcyA9IG51bGw7CiAJCUV4dGVybmFsQWNjZXNzUGVybXMgZXh0QWRkUGVybXMgPSBudWxsOwpAQCAtMzExLDMxICszODEsMzcgQEAKIAkJSHR0cEhlYWRlcnMgaGVhZGVycyA9IEVjb21wUG9ydGFsVXRpbHMuYmFzZTY0ZW5jb2RlS2V5Rm9yQUFGQmFzaWNBdXRoKCk7CiAJCWZvciAoUm9sZUZ1bmN0aW9uIHJvbGVGdW5jIDogcm9sZUZ1bmN0aW9uTGlzdEFkZCkgewogCQkJU3RyaW5nIGNoZWNrVHlwZSA9IHJvbGVGdW5jLmdldENvZGUoKS5jb250YWlucygibWVudSIpID8gIm1lbnUiIDogInVybCI7Ci0JCQlleHRBZGRQZXJtcyA9IG5ldyBFeHRlcm5hbEFjY2Vzc1Blcm1zKGFwcC5nZXROYW1lU3BhY2UoKSArICIuIiArIGNoZWNrVHlwZSwgcm9sZUZ1bmMuZ2V0Q29kZSgpLAotCQkJCQkiKiIpOworCQkJZXh0QWRkUGVybXMgPSBuZXcgRXh0ZXJuYWxBY2Nlc3NQZXJtcyhhcHAuZ2V0TmFtZVNwYWNlKCkgKyAiLiIgKyBjaGVja1R5cGUsIHJvbGVGdW5jLmdldENvZGUoKSwgIioiKTsKIAkJCWV4dEFkZFJvbGVQZXJtcyA9IG5ldyBFeHRlcm5hbEFjY2Vzc1JvbGVQZXJtcyhleHRBZGRQZXJtcywKIAkJCQkJYXBwLmdldE5hbWVTcGFjZSgpICsgIi4iICsgdXBkYXRlRXh0Um9sZS5nZXROYW1lKCkucmVwbGFjZUFsbCgiICIsICJfIikpOwogCQkJU3RyaW5nIHVwZGF0ZVJvbGVQZXJtcyA9IGFkZFBlcm1zTWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZyhleHRBZGRSb2xlUGVybXMpOwogCQkJSHR0cEVudGl0eTxTdHJpbmc+IGVudGl0eSA9IG5ldyBIdHRwRW50aXR5PD4odXBkYXRlUm9sZVBlcm1zLCBoZWFkZXJzKTsKLQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJDb25uZWN0aW5nIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0iKTsKKwkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJhZGRSb2xlRnVuY3Rpb25zSW5FeHRlcm5hbFN5c3RlbToge30gIiAsIENPTk5FQ1RJTkdfVE9fRVhURVJOQUxfQVVUSF9TWVNURU1fTE9HX01FU1NBR0UpOwogCQkJUmVzcG9uc2VFbnRpdHk8U3RyaW5nPiBhZGRSZXNwb25zZSA9IHRlbXBsYXRlLmV4Y2hhbmdlKAotCQkJCQlTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VUkwpCi0JCQkJCQkJKyAicm9sZS9wZXJtIiwKKwkJCQkJU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKSArICJyb2xlL3Blcm0iLAogCQkJCQlIdHRwTWV0aG9kLlBPU1QsIGVudGl0eSwgU3RyaW5nLmNsYXNzKTsKIAkJCWlmIChhZGRSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkudmFsdWUoKSAhPSAyMDEpIHsKIAkJCQlyZXNwb25zZSA9IGZhbHNlOwogCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsCi0JCQkJCQkiQ29ubmVjdGVkIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0gYnV0IHNvbWV0aGluZyB3ZW50IHdyb25nISBkdWUgdG8ge30gYW5kIHN0YXR1c2NvZGU6IHt9IiwgYWRkUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLmdldFJlYXNvblBocmFzZSgpLCBhZGRSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkudmFsdWUoKSk7CisJCQkJCQkiYWRkUm9sZUZ1bmN0aW9uc0luRXh0ZXJuYWxTeXN0ZW06IFdoaWxlIGFkZGluZyBwZXJtaXNzaW9uIHRvIHRoZSByb2xlIGluICBFeHRlcm5hbCBBdXRoIHN5c3RlbSBzb21ldGhpbmcgd2VudCB3cm9uZyEgZHVlIHRvIHt9IGFuZCBzdGF0dXNjb2RlOiB7fSIsCisJCQkJCQlhZGRSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkuZ2V0UmVhc29uUGhyYXNlKCksIGFkZFJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKS52YWx1ZSgpKTsKIAkJCX0gZWxzZSB7CiAJCQkJcmVzcG9uc2UgPSB0cnVlOwotCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJDb25uZWN0ZWQgdG8gRXh0ZXJuYWwgQWNjZXNzIHN5c3RlbSIpOworCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJhZGRSb2xlRnVuY3Rpb25zSW5FeHRlcm5hbFN5c3RlbTogRmluaXNoZWQgYWRkaW5nIHBlcm1pc3Npb25zIHRvIHJvbGVzIGluIEV4dGVybmFsIEF1dGggc3lzdGVtIGFuZCBzdGF0dXMgY29kZToge30gIiwgYWRkUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLnZhbHVlKCkpOwogCQkJfQogCQl9CiAJCXJldHVybiByZXNwb25zZTsKIAl9CiAKKwkvKioKKwkgKiAKKwkgKiBJdCBjb252ZXJ0cyBsaXN0IG9mIGZ1bmN0aW9ucyBpbiB1cGRhdGVFeHRSb2xlIHBhcmFtZXRlciB0byB0aGUgUm9sZUZ1bmN0aW9uIG9iamVjdAorCSAqIAorCSAqIEBwYXJhbSB1cGRhdGVFeHRSb2xlCisJICogQHJldHVybiBsaXN0IG9mIGZ1bmN0aW9ucyAKKwkgKi8KIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8Um9sZUZ1bmN0aW9uPiBjb252ZXJ0U2V0VG9MaXN0T2ZSb2xlRnVuY3Rpb25zKFJvbGUgdXBkYXRlRXh0Um9sZSl7CisJcHJpdmF0ZSBMaXN0PFJvbGVGdW5jdGlvbj4gY29udmVydFNldFRvTGlzdE9mUm9sZUZ1bmN0aW9ucyhSb2xlIHVwZGF0ZUV4dFJvbGUpIHsKIAkJU2V0PFJvbGVGdW5jdGlvbj4gcm9sZUZ1bmN0aW9uU2V0TGlzdCA9IHVwZGF0ZUV4dFJvbGUuZ2V0Um9sZUZ1bmN0aW9ucygpOwogCQlMaXN0PFJvbGVGdW5jdGlvbj4gcm9sZUZ1bmN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQlPYmplY3RNYXBwZXIgcm9sZUZ1bmNNYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CkBAIC0zNDcsMjAgKzQyMyw0MSBAQAogCQl9CiAJCXJldHVybiByb2xlRnVuY3Rpb25MaXN0LnN0cmVhbSgpLmRpc3RpbmN0KCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKIAl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVBlcm1Gb3JSb2xlKEV4dGVybmFsQWNjZXNzUGVybXMgcGVybSwgT2JqZWN0TWFwcGVyIHBlcm1NYXBwZXIsU3RyaW5nIG5hbWUsIEh0dHBIZWFkZXJzIGhlYWRlcnMpIHRocm93cyBFeGNlcHRpb24geworCisJLyoqCisJICogSXQgZGVsZXRlIHBlcm1pc3Npb25zL2Z1bmN0aW9ucyBpbiB0aGUgZXh0ZXJuYWwgYXV0aCBzeXN0ZW0KKwkgKiAKKwkgKiBAcGFyYW0gcGVybQorCSAqIEBwYXJhbSBwZXJtTWFwcGVyCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gaGVhZGVycworCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIHJlbW92ZVBlcm1Gb3JSb2xlKEV4dGVybmFsQWNjZXNzUGVybXMgcGVybSwgT2JqZWN0TWFwcGVyIHBlcm1NYXBwZXIsIFN0cmluZyBuYW1lLCBIdHRwSGVhZGVycyBoZWFkZXJzKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUV4dGVybmFsQWNjZXNzUm9sZVBlcm1zIGV4dEFjY2Vzc1JvbGVQZXJtcyA9IG5ldyBFeHRlcm5hbEFjY2Vzc1JvbGVQZXJtcyhwZXJtLCBuYW1lKTsKIAkJU3RyaW5nIHBlcm1EZXRhaWxzID0gcGVybU1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoZXh0QWNjZXNzUm9sZVBlcm1zKTsKIAkJSHR0cEVudGl0eTxTdHJpbmc+IGRlbGV0ZUVudGl0eSA9IG5ldyBIdHRwRW50aXR5PD4ocGVybURldGFpbHMsIGhlYWRlcnMpOwotCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiQ29ubmVjdGluZyB0byBFeHRlcm5hbCBBY2Nlc3Mgc3lzdGVtIik7Ci0JCVJlc3BvbnNlRW50aXR5PFN0cmluZz4gZGVsZXRlUGVybVJlc3BvbnNlID0gdGVtcGxhdGUuZXhjaGFuZ2UoU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKQotCQkJCQkJKyAicm9sZS8iK25hbWUrIi9wZXJtIiwgSHR0cE1ldGhvZC5ERUxFVEUsIGRlbGV0ZUVudGl0eSwgU3RyaW5nLmNsYXNzKTsKKwkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgInJlbW92ZVBlcm1Gb3JSb2xlOiB7fSAiICwgQ09OTkVDVElOR19UT19FWFRFUk5BTF9BVVRIX1NZU1RFTV9MT0dfTUVTU0FHRSk7CisJCVJlc3BvbnNlRW50aXR5PFN0cmluZz4gZGVsZXRlUGVybVJlc3BvbnNlID0gdGVtcGxhdGUKKwkJCQkuZXhjaGFuZ2UoU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKSArICJyb2xlLyIKKwkJCQkJCSsgbmFtZSArICIvcGVybSIsIEh0dHBNZXRob2QuREVMRVRFLCBkZWxldGVFbnRpdHksIFN0cmluZy5jbGFzcyk7CiAJCWlmIChkZWxldGVQZXJtUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLnZhbHVlKCkgIT0gMjAwKSB7Ci0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgdG8gZGVsZXRlIHJvbGUgZnVuY3Rpb24iKTsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oZGVsZXRlUGVybVJlc3BvbnNlLmdldEJvZHkoKSk7CiAJCX0KLQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkNvbm5lY3RlZCB0byBFeHRlcm5hbCBBY2Nlc3Mgc3lzdGVtIik7CisJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJyZW1vdmVQZXJtRm9yUm9sZTogRmluaXNoZWQgZGVsZXRpbmcgcGVybWlzc2lvbiB0byByb2xlIGluIEV4dGVybmFsIEF1dGggc3lzdGVtIGFuZCBzdGF0dXMgY29kZToge30iLAorCQkJCWRlbGV0ZVBlcm1SZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkudmFsdWUoKSk7CiAJfQogCisJLyoqCisJICogSXQgd2lsbCBjcmVhdGUgbmV3IHJvbGUgaW4gdGhlIEV4dGVybmFsIEF1dGggU3lzdGVtCisJICogCisJICogQHBhcmFtIG5ld1JvbGUKKwkgKiBAcGFyYW0gYXBwCisJICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWxseSBhZGRlZCBpbiB0aGUgc3lzdGVtIGVsc2UgZmFsc2UKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIElmIGZhaWxzIHRvIGFkZCByb2xlIGluIHRoZSBzeXN0ZW0KKwkgKi8KIAlwcml2YXRlIGJvb2xlYW4gYWRkTmV3Um9sZUluRXh0ZXJuYWxTeXN0ZW0oTGlzdDxFUFJvbGU+IG5ld1JvbGUsIEVQQXBwIGFwcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWJvb2xlYW4gcmVzcG9uc2UgPSBmYWxzZTsKIAkJSHR0cEhlYWRlcnMgaGVhZGVycyA9IEVjb21wUG9ydGFsVXRpbHMuYmFzZTY0ZW5jb2RlS2V5Rm9yQUFGQmFzaWNBdXRoKCk7CkBAIC0zNjgsNTIgKzQ2NSw3NiBAQAogCQlTdHJpbmcgYWRkTmV3Um9sZSA9ICIiOwogCQlFeHRlcm5hbEFjY2Vzc1JvbGUgZXh0Um9sZSA9IG5ldyBFeHRlcm5hbEFjY2Vzc1JvbGUoKTsKIAkJU3RyaW5nIGFkZERlc2MgPSBudWxsOwotCQlhZGREZXNjID0gIntcImlkXCI6XCIiICsgbmV3Um9sZS5nZXQoMCkuZ2V0SWQoKSArICJcIixcIm5hbWVcIjpcIiIgKyBuZXdSb2xlLmdldCgwKS5nZXROYW1lKCkgKyAiXCIsXCJhY3RpdmVcIjpcIiIKLQkJCQkJKyBuZXdSb2xlLmdldCgwKS5nZXRBY3RpdmUoKSArICJcIixcInByaW9yaXR5XCI6XCIiICtuZXdSb2xlLmdldCgwKS5nZXRQcmlvcml0eSgpICsgIlwiLFwiYXBwSWRcIjpcIiIKLQkJCQkJKyBuZXdSb2xlLmdldCgwKS5nZXRBcHBJZCgpICsgIlwiLFwiYXBwUm9sZUlkXCI6XCIiICsgbmV3Um9sZS5nZXQoMCkuZ2V0QXBwUm9sZUlkKCkgKyAiXCJ9IjsKLQorCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGV4dFN5c3RlbUpzb25NYXBwZXIgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CisJCWV4dFN5c3RlbUpzb25NYXBwZXIucHV0KElELCBuZXdSb2xlLmdldCgwKS5nZXRJZCgpKTsKKwkJZXh0U3lzdGVtSnNvbk1hcHBlci5wdXQoUk9MRV9OQU1FLCBuZXdSb2xlLmdldCgwKS5nZXROYW1lKCkpOworCQlleHRTeXN0ZW1Kc29uTWFwcGVyLnB1dChBQ1RJVkUsIG5ld1JvbGUuZ2V0KDApLmdldEFjdGl2ZSgpKTsKKwkJZXh0U3lzdGVtSnNvbk1hcHBlci5wdXQoUFJJT1JJVFksIG5ld1JvbGUuZ2V0KDApLmdldFByaW9yaXR5KCkpOworCQlleHRTeXN0ZW1Kc29uTWFwcGVyLnB1dChBUFBfSUQsIG5ld1JvbGUuZ2V0KDApLmdldEFwcElkKCkpOworCQlleHRTeXN0ZW1Kc29uTWFwcGVyLnB1dChBUFBfUk9MRV9JRCwgbmV3Um9sZS5nZXQoMCkuZ2V0QXBwUm9sZUlkKCkpOworCQlhZGREZXNjID0gbWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZyhleHRTeXN0ZW1Kc29uTWFwcGVyKTsKIAkJZXh0Um9sZS5zZXROYW1lKGFwcC5nZXROYW1lU3BhY2UoKSArICIuIiArIG5ld1JvbGUuZ2V0KDApLmdldE5hbWUoKS5yZXBsYWNlQWxsKCIgIiwgIl8iKSk7CiAJCWV4dFJvbGUuc2V0RGVzY3JpcHRpb24oYWRkRGVzYyk7CiAJCWFkZE5ld1JvbGUgPSBtYXBwZXIud3JpdGVWYWx1ZUFzU3RyaW5nKGV4dFJvbGUpOwogCQlIdHRwRW50aXR5PFN0cmluZz4gZGVsZXRlRW50aXR5ID0gbmV3IEh0dHBFbnRpdHk8PihhZGROZXdSb2xlLCBoZWFkZXJzKTsKLQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkNvbm5lY3RpbmcgdG8gRXh0ZXJuYWwgQWNjZXNzIHN5c3RlbSIpOwotCQlSZXNwb25zZUVudGl0eTxTdHJpbmc+IGFkZE5ld1JvbGVJbkV4dGVybmFsU3lzdGVtID0gdGVtcGxhdGUuZXhjaGFuZ2UoU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKQotCQkJCQkJKyAicm9sZSIsIEh0dHBNZXRob2QuUE9TVCwgZGVsZXRlRW50aXR5LCBTdHJpbmcuY2xhc3MpOworCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiYWRkTmV3Um9sZUluRXh0ZXJuYWxTeXN0ZW06IHt9ICIgLCBDT05ORUNUSU5HX1RPX0VYVEVSTkFMX0FVVEhfU1lTVEVNX0xPR19NRVNTQUdFKTsKKwkJUmVzcG9uc2VFbnRpdHk8U3RyaW5nPiBhZGROZXdSb2xlSW5FeHRlcm5hbFN5c3RlbSA9IHRlbXBsYXRlLmV4Y2hhbmdlKAorCQkJCVN5c3RlbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkVYVEVSTkFMX0NFTlRSQUxfQUNDRVNTX1VSTCkgKyAicm9sZSIsCisJCQkJSHR0cE1ldGhvZC5QT1NULCBkZWxldGVFbnRpdHksIFN0cmluZy5jbGFzcyk7CiAJCWlmIChhZGROZXdSb2xlSW5FeHRlcm5hbFN5c3RlbS5nZXRTdGF0dXNDb2RlKCkudmFsdWUoKSAhPSAyMDEpIHsKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB0byBhZGQgUm9sZSBpbiBFeHRlcm5hbCBTeXN0ZW0iKTsKLQkJfSBlbHNlewotCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkNvbm5lY3RlZCB0byBFeHRlcm5hbCBBY2Nlc3Mgc3lzdGVtIik7CisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKGFkZE5ld1JvbGVJbkV4dGVybmFsU3lzdGVtLmdldEJvZHkoKSk7CisJCX0gZWxzZSB7CisJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiYWRkTmV3Um9sZUluRXh0ZXJuYWxTeXN0ZW06IEZpbmlzaGVkIGFkZGluZyBpbnRvIEV4dGVybmFsIEF1dGggc3lzdGVtIGFuZCBzdGF0dXMgY29kZToge30iLAorCQkJCQlhZGROZXdSb2xlSW5FeHRlcm5hbFN5c3RlbS5nZXRTdGF0dXNDb2RlKCkudmFsdWUoKSk7CiAJCQlyZXNwb25zZSA9IHRydWU7CiAJCX0KIAkJcmV0dXJuIHJlc3BvbnNlOwogCX0KLQkKKworCS8qKgorCSAqIAorCSAqIEl0IHVwZGF0ZXMgZXhpc3Rpbmcgcm9sZSBpbiB0aGUgRXh0ZXJuYWwgQXV0aCBTeXN0ZW0KKwkgKiAKKwkgKiBAcGFyYW0gYWRkUm9sZQorCSAqICAgICAgICAgICAgSXQgQ29udGFpbnMgcm9sZSBpbmZvcm1hdGlvbgorCSAqIEBwYXJhbSBhcHAKKwkgKiBAcmV0dXJuIHN0cmluZyB3aGljaCBpcyBmb3JtYXR0ZWQgdG8gbWF0Y2ggd2l0aCB0aGUgZXh0ZXJuYWwgYXV0aCBzeXN0ZW0KKwkgKiBAdGhyb3dzIEpzb25Qcm9jZXNzaW5nRXhjZXB0aW9uCisJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlTmV3Um9sZUluRXh0ZXJuYWxTeXN0ZW0oUm9sZSBhZGRSb2xlLCBFUEFwcCBhcHApIHRocm93cyBKc29uUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgdXBkYXRlRXhpc3RpbmdSb2xlSW5FeHRlcm5hbFN5c3RlbShSb2xlIGFkZFJvbGUsIEVQQXBwIGFwcCkgdGhyb3dzIEpzb25Qcm9jZXNzaW5nRXhjZXB0aW9uIHsKIAkJT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKIAkJU3RyaW5nIGFkZE5ld1JvbGUgPSAiIjsKIAkJRXh0ZXJuYWxBY2Nlc3NSb2xlIGV4dFJvbGUgPSBuZXcgRXh0ZXJuYWxBY2Nlc3NSb2xlKCk7CiAJCUxpc3Q8RVBSb2xlPiByb2xlID0gbnVsbDsKIAkJU3RyaW5nIGFkZERlc2MgPSBudWxsOwotCQlpZihhcHAuZ2V0SWQoKS5lcXVhbHMoUG9ydGFsQ29uc3RhbnRzLlBPUlRBTF9BUFBfSUQpKXsKLQkJCXJvbGUgPSBkYXRhQWNjZXNzU2VydmljZS5nZXRMaXN0KEVQUm9sZS5jbGFzcywKLQkJCQkJIiB3aGVyZSByb2xlX2lkID0gIiArIGFkZFJvbGUuZ2V0SWQoKSwgbnVsbCwgbnVsbCk7CQotCQkJYWRkRGVzYyA9ICJ7XCJpZFwiOlwiIiArIHJvbGUuZ2V0KDApLmdldElkKCkgKyAiXCIsXCJuYW1lXCI6XCIiICsgYWRkUm9sZS5nZXROYW1lKCkgKyAiXCIsXCJhY3RpdmVcIjpcIiIKLQkJCQkJKyByb2xlLmdldCgwKS5nZXRBY3RpdmUoKSArICJcIixcInByaW9yaXR5XCI6XCIiICsgcm9sZS5nZXQoMCkuZ2V0UHJpb3JpdHkoKQotCQkJCQkrICJcIixcImFwcElkXCI6XCJudWxsXCIsXCJhcHBSb2xlSWRcIjpcIm51bGxcIn0iOwotCQl9IGVsc2V7Ci0JCQlyb2xlID0gZGF0YUFjY2Vzc1NlcnZpY2UuZ2V0TGlzdChFUFJvbGUuY2xhc3MsCi0JCQkJCSIgd2hlcmUgYXBwX3JvbGVfaWQgPSAiICsgYWRkUm9sZS5nZXRJZCgpLCBudWxsLCBudWxsKTsJCi0JCQlhZGREZXNjID0gIntcImlkXCI6XCIiICsgcm9sZS5nZXQoMCkuZ2V0SWQoKSArICJcIixcIm5hbWVcIjpcIiIgKyBhZGRSb2xlLmdldE5hbWUoKSArICJcIixcImFjdGl2ZVwiOlwiIgotCQkJCQkrIHJvbGUuZ2V0KDApLmdldEFjdGl2ZSgpICsgIlwiLFwicHJpb3JpdHlcIjpcIiIgKyBhZGRSb2xlLmdldFByaW9yaXR5KCkgKyAiXCIsXCJhcHBJZFwiOlwiIgotCQkJCQkrIGFwcC5nZXRJZCgpICsgIlwiLFwiYXBwUm9sZUlkXCI6XCIiICsgcm9sZS5nZXQoMCkuZ2V0QXBwUm9sZUlkKCkgKyAiXCJ9IjsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBleHRTeXN0ZW1VcGRhdGVSb2xlID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOworCQlpZiAoYXBwLmdldElkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5QT1JUQUxfQVBQX0lEKSkgeworCQkJcm9sZSA9IGRhdGFBY2Nlc3NTZXJ2aWNlLmdldExpc3QoRVBSb2xlLmNsYXNzLCBXSEVSRV9ST0xFX0lEX0VRVUFMUyArIGFkZFJvbGUuZ2V0SWQoKSwgbnVsbCwgbnVsbCk7CisJCX0gZWxzZSB7CisJCQlyb2xlID0gZGF0YUFjY2Vzc1NlcnZpY2UuZ2V0TGlzdChFUFJvbGUuY2xhc3MsICIgd2hlcmUgYXBwX3JvbGVfaWQgPSAiICsgYWRkUm9sZS5nZXRJZCgpLCBudWxsLCBudWxsKTsKIAkJfQorCQlleHRTeXN0ZW1VcGRhdGVSb2xlLnB1dChJRCwgcm9sZS5nZXQoMCkuZ2V0SWQoKSk7CisJCWV4dFN5c3RlbVVwZGF0ZVJvbGUucHV0KFJPTEVfTkFNRSwgYWRkUm9sZS5nZXROYW1lKCkpOworCQlleHRTeXN0ZW1VcGRhdGVSb2xlLnB1dChBQ1RJVkUsIHJvbGUuZ2V0KDApLmdldEFjdGl2ZSgpKTsKKwkJZXh0U3lzdGVtVXBkYXRlUm9sZS5wdXQoUFJJT1JJVFksIHJvbGUuZ2V0KDApLmdldFByaW9yaXR5KCkpOworCQlleHRTeXN0ZW1VcGRhdGVSb2xlLnB1dChBUFBfSUQsIHJvbGUuZ2V0KDApLmdldEFwcElkKCkpOworCQlleHRTeXN0ZW1VcGRhdGVSb2xlLnB1dChBUFBfUk9MRV9JRCwgcm9sZS5nZXQoMCkuZ2V0QXBwUm9sZUlkKCkpOworCQlhZGREZXNjID0gbWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZyhleHRTeXN0ZW1VcGRhdGVSb2xlKTsKIAkJZXh0Um9sZS5zZXROYW1lKGFwcC5nZXROYW1lU3BhY2UoKSArICIuIiArIGFkZFJvbGUuZ2V0TmFtZSgpLnJlcGxhY2VBbGwoIiAiLCAiXyIpKTsKIAkJZXh0Um9sZS5zZXREZXNjcmlwdGlvbihhZGREZXNjKTsKIAkJYWRkTmV3Um9sZSA9IG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoZXh0Um9sZSk7CiAJCXJldHVybiBhZGROZXdSb2xlOwogCX0KIAorCS8qKgorCSAqIEl0IGNyZWF0ZSBhIHJvbGUgaW4gdGhlIGV4dGVybmFsIGF1dGggc3lzdGVtIGFuZCB0aGVuIGluIG91ciBsb2NhbCAKKwkgKiAKKwkgKiBAcGFyYW0gYWRkUm9sZUluREIKKwkgKiBAcGFyYW0gYXBwCisJICogQHJldHVybiB0cnVlIGVsc2UgZmFsc2UKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCUBUcmFuc2FjdGlvbmFsCiAJcHJpdmF0ZSBib29sZWFuIGFkZFJvbGVJbkVjb21wREIoUm9sZSBhZGRSb2xlSW5EQiwgRVBBcHAgYXBwKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTQ0Myw0MCArNTY0LDM5IEBACiAJCQkJCWVwUm9sZU5ldy5zZXRBcHBJZChhcHAuZ2V0SWQoKSk7CiAJCQkJfQogCQkJCWRhdGFBY2Nlc3NTZXJ2aWNlLnNhdmVEb21haW5PYmplY3QoZXBSb2xlTmV3LCBudWxsKTsKLQkJCQkJTGlzdCA8RVBSb2xlPiBnZXRSb2xlQ3JlYXRlZCA9IG51bGw7Ci0JCQkJCWlmICghYXBwLmdldElkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5QT1JUQUxfQVBQX0lEKSkgewotCQkJCQkJTGlzdDxFUFJvbGU+IHJvbGVDcmVhdGVkID0gIGRhdGFBY2Nlc3NTZXJ2aWNlLmdldExpc3QoRVBSb2xlLmNsYXNzLAotCQkJCQkJCQkiIHdoZXJlIHJvbGVfbmFtZSA9ICciICsgYWRkUm9sZUluREIuZ2V0TmFtZSgpICsiJyBhbmQgYXBwX2lkID0gIisgYXBwLmdldElkKCksIG51bGwsIG51bGwpOwkKLQkJCQkJCUVQUm9sZSBlcFVwZGF0ZVJvbGUgPSByb2xlQ3JlYXRlZC5nZXQoMCk7Ci0JCQkJCQllcFVwZGF0ZVJvbGUuc2V0QXBwUm9sZUlkKGVwVXBkYXRlUm9sZS5nZXRJZCgpKTsKLQkJCQkJCWRhdGFBY2Nlc3NTZXJ2aWNlLnNhdmVEb21haW5PYmplY3QoZXBVcGRhdGVSb2xlLCBudWxsKTsKLQkJCQkJCWdldFJvbGVDcmVhdGVkID0gIGRhdGFBY2Nlc3NTZXJ2aWNlLmdldExpc3QoRVBSb2xlLmNsYXNzLAotCQkJCQkJCQkiIHdoZXJlIHJvbGVfbmFtZSA9ICciICsgYWRkUm9sZUluREIuZ2V0TmFtZSgpICsiJyBhbmQgYXBwX2lkID0gIisgYXBwLmdldElkKCkgLCBudWxsLCBudWxsKTsJCi0JCQkJCX0gZWxzZXsKLQkJCQkJCWdldFJvbGVDcmVhdGVkID0gIGRhdGFBY2Nlc3NTZXJ2aWNlLmdldExpc3QoRVBSb2xlLmNsYXNzLAotCQkJCQkJCQkiIHdoZXJlIHJvbGVfbmFtZSA9ICciICsgYWRkUm9sZUluREIuZ2V0TmFtZSgpICsiJyBhbmQgYXBwX2lkIGlzIG51bGwiLCBudWxsLCBudWxsKTsJCi0JCQkJCX0KLQkJCQkvLyBBZGQgcm9sZSBpbiBFeHRlcm5hbCBBY2Nlc3Mgc3lzdGVtCi0JCQkJYm9vbGVhbiByZXNwb25zZSA9IGFkZE5ld1JvbGVJbkV4dGVybmFsU3lzdGVtKGdldFJvbGVDcmVhdGVkLCBhcHApOwotCQkJCQotCQkJCWlmICghcmVzcG9uc2UpIHsKLQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHRvIGFkZCByb2xlISIpOworCQkJCUxpc3Q8RVBSb2xlPiBnZXRSb2xlQ3JlYXRlZCA9IG51bGw7CisJCQkJaWYgKCFhcHAuZ2V0SWQoKS5lcXVhbHMoUG9ydGFsQ29uc3RhbnRzLlBPUlRBTF9BUFBfSUQpKSB7CisJCQkJCUxpc3Q8RVBSb2xlPiByb2xlQ3JlYXRlZCA9IGRhdGFBY2Nlc3NTZXJ2aWNlLmdldExpc3QoRVBSb2xlLmNsYXNzLAorCQkJCQkJCVdIRVJFX1JPTEVfTkFNRV9FUVVBTFMgKyBhZGRSb2xlSW5EQi5nZXROYW1lKCkgKyAiJyBhbmQgYXBwX2lkID0gIiArIGFwcC5nZXRJZCgpLCBudWxsLAorCQkJCQkJCW51bGwpOworCQkJCQlFUFJvbGUgZXBVcGRhdGVSb2xlID0gcm9sZUNyZWF0ZWQuZ2V0KDApOworCQkJCQllcFVwZGF0ZVJvbGUuc2V0QXBwUm9sZUlkKGVwVXBkYXRlUm9sZS5nZXRJZCgpKTsKKwkJCQkJZGF0YUFjY2Vzc1NlcnZpY2Uuc2F2ZURvbWFpbk9iamVjdChlcFVwZGF0ZVJvbGUsIG51bGwpOworCQkJCQlnZXRSb2xlQ3JlYXRlZCA9IGRhdGFBY2Nlc3NTZXJ2aWNlLmdldExpc3QoRVBSb2xlLmNsYXNzLAorCQkJCQkJCVdIRVJFX1JPTEVfTkFNRV9FUVVBTFMgKyBhZGRSb2xlSW5EQi5nZXROYW1lKCkgKyAiJyBhbmQgYXBwX2lkID0gIiArIGFwcC5nZXRJZCgpLCBudWxsLAorCQkJCQkJCW51bGwpOworCQkJCX0gZWxzZSB7CisJCQkJCWdldFJvbGVDcmVhdGVkID0gZGF0YUFjY2Vzc1NlcnZpY2UuZ2V0TGlzdChFUFJvbGUuY2xhc3MsCisJCQkJCQkJV0hFUkVfUk9MRV9OQU1FX0VRVUFMUyArIGFkZFJvbGVJbkRCLmdldE5hbWUoKSArICInIGFuZCBhcHBfaWQgaXMgbnVsbCIsIG51bGwsIG51bGwpOwogCQkJCX0KKwkJCQkvLyBBZGQgcm9sZSBpbiBFeHRlcm5hbCBBdXRoIHN5c3RlbQorCQkJCXJlc3VsdCA9IGFkZE5ld1JvbGVJbkV4dGVybmFsU3lzdGVtKGdldFJvbGVDcmVhdGVkLCBhcHApOwogCQkJfSBlbHNlIHsgLy8gaWYgcm9sZSBhbHJlYWR5IGV4aXN0cyB0aGVuIHVwZGF0ZSBpdAogCQkJCWlmIChhcHAuZ2V0SWQoKS5lcXVhbHMoUG9ydGFsQ29uc3RhbnRzLlBPUlRBTF9BUFBfSUQpKSB7CiAJCQkJCWFwcGxpY2F0aW9uUm9sZXMgPSBkYXRhQWNjZXNzU2VydmljZS5nZXRMaXN0KEVQUm9sZS5jbGFzcywKIAkJCQkJCQkiIHdoZXJlIGFwcF9pZCBpcyBudWxsICIgKyAiIGFuZCByb2xlX2lkID0gIiArIGFkZFJvbGVJbkRCLmdldElkKCksIG51bGwsIG51bGwpOwogCQkJCX0gZWxzZSB7CiAJCQkJCWFwcGxpY2F0aW9uUm9sZXMgPSBkYXRhQWNjZXNzU2VydmljZS5nZXRMaXN0KEVQUm9sZS5jbGFzcywKLQkJCQkJCQkiIHdoZXJlIGFwcF9pZCA9ICIgKyBhcHAuZ2V0SWQoKSArICIgYW5kIGFwcF9yb2xlX2lkID0gIiArIGFkZFJvbGVJbkRCLmdldElkKCksIG51bGwsIG51bGwpOworCQkJCQkJCVdIRVJFX0FQUF9JRF9FUVVBTFMgKyBhcHAuZ2V0SWQoKSArICIgYW5kIGFwcF9yb2xlX2lkID0gIiArIGFkZFJvbGVJbkRCLmdldElkKCksIG51bGwsIG51bGwpOwogCQkJCX0KLQkJCQlpZihhcHBsaWNhdGlvblJvbGVzLmlzRW1wdHkoKSAmJiAhYXBwLmdldElkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5QT1JUQUxfQVBQX0lEKSl7CisJCQkJaWYgKGFwcGxpY2F0aW9uUm9sZXMuaXNFbXB0eSgpKSB7CiAJCQkJCWFwcGxpY2F0aW9uUm9sZXMgPSBkYXRhQWNjZXNzU2VydmljZS5nZXRMaXN0KEVQUm9sZS5jbGFzcywKLQkJCQkJCQkiIHdoZXJlIGFwcF9pZCA9ICIgKyBhcHAuZ2V0SWQoKSArICIgYW5kIHJvbGVfaWQgPSAiICsgYWRkUm9sZUluREIuZ2V0SWQoKSwgbnVsbCwgbnVsbCk7CisJCQkJCQkJV0hFUkVfQVBQX0lEX0VRVUFMUyArIGFwcC5nZXRJZCgpICsgIiBhbmQgcm9sZV9uYW1lID0gJyIgKyBhZGRSb2xlSW5EQi5nZXROYW1lKCkgKyAiJyIsIG51bGwsCisJCQkJCQkJbnVsbCk7CiAJCQkJfQogCQkJCXVwZGF0ZVJvbGVJbkV4dGVybmFsU3lzdGVtKGFkZFJvbGVJbkRCLCBhcHApOwogCQkJCWRlbGV0ZVJvbGVGdW5jdGlvbihhcHAsIGFwcGxpY2F0aW9uUm9sZXMpOwotCQkJCWlmIChhcHBsaWNhdGlvblJvbGVzLnNpemUoKSA+IDAgfHwgIWFwcGxpY2F0aW9uUm9sZXMuaXNFbXB0eSgpKSB7CisJCQkJaWYgKCFhcHBsaWNhdGlvblJvbGVzLmlzRW1wdHkoKSkgewogCQkJCQllcFJvbGUgPSBhcHBsaWNhdGlvblJvbGVzLmdldCgwKTsKIAkJCQkJZXBSb2xlLnNldE5hbWUoYWRkUm9sZUluREIuZ2V0TmFtZSgpKTsKIAkJCQkJZXBSb2xlLnNldFByaW9yaXR5KGFkZFJvbGVJbkRCLmdldFByaW9yaXR5KCkpOwpAQCAtNDg0LDE1ICs2MDQsMTYgQEAKIAkJCQkJaWYgKGFwcC5nZXRJZCgpLmVxdWFscyhQb3J0YWxDb25zdGFudHMuUE9SVEFMX0FQUF9JRCkpIHsKIAkJCQkJCWVwUm9sZS5zZXRBcHBJZChudWxsKTsKIAkJCQkJCWVwUm9sZS5zZXRBcHBSb2xlSWQobnVsbCk7Ci0JCQkJCX0gZWxzZSBpZighYXBwLmdldElkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5QT1JUQUxfQVBQX0lEKSAmJiBhcHBsaWNhdGlvblJvbGVzLmdldCgwKS5nZXRBcHBSb2xlSWQoKSA9PSBudWxsKXsKKwkJCQkJfSBlbHNlIGlmICghYXBwLmdldElkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5QT1JUQUxfQVBQX0lEKQorCQkJCQkJCSYmIGFwcGxpY2F0aW9uUm9sZXMuZ2V0KDApLmdldEFwcFJvbGVJZCgpID09IG51bGwpIHsKIAkJCQkJCWVwUm9sZS5zZXRBcHBSb2xlSWQoZXBSb2xlLmdldElkKCkpOwogCQkJCQl9CiAJCQkJCWRhdGFBY2Nlc3NTZXJ2aWNlLnNhdmVEb21haW5PYmplY3QoZXBSb2xlLCBudWxsKTsKIAkJCQl9Ci0JCQkJCisKIAkJCQlzYXZlUm9sZUZ1bmN0aW9uKGxpc3RXaXRob3V0RHVwbGljYXRlcywgYXBwLCBhcHBsaWNhdGlvblJvbGVzKTsKKwkJCQlyZXN1bHQgPSB0cnVlOwogCQkJfQotCQkJcmVzdWx0ID0gdHJ1ZTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJhZGRSb2xlSW5FY29tcERCIGlzIGZhaWxlZCIsIGUpOwogCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CkBAIC01MDAsMjAgKzYyMSwzOSBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAorCS8qKgorCSAqIAorCSAqIEl0IHZhbGlkYXRlcyB3aGV0aGVyIHJvbGUgZXhpc3RzIGluIGV4dGVybmFsIGF1dGggc3lzdGVtCisJICogCisJICogQHBhcmFtIGNoZWNrUm9sZQorCSAqIEBwYXJhbSBhcHAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqIAkJCQkJSWYgcm9sZSBleGl0cworCSAqLwogCXByaXZhdGUgdm9pZCBjaGVja0lmUm9sZUV4aXRzSW5FeHRlcm5hbFN5c3RlbShSb2xlIGNoZWNrUm9sZSwgRVBBcHAgYXBwKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSHR0cEhlYWRlcnMgaGVhZGVycyA9IEVjb21wUG9ydGFsVXRpbHMuYmFzZTY0ZW5jb2RlS2V5Rm9yQUFGQmFzaWNBdXRoKCk7Ci0JCVN0cmluZyByb2xlTmFtZSA9IGFwcC5nZXROYW1lU3BhY2UoKSsiLiIrY2hlY2tSb2xlLmdldE5hbWUoKS5yZXBsYWNlQWxsKCIgIiwgIl8iKTsKKwkJU3RyaW5nIHJvbGVOYW1lID0gYXBwLmdldE5hbWVTcGFjZSgpICsgIi4iICsgY2hlY2tSb2xlLmdldE5hbWUoKS5yZXBsYWNlQWxsKCIgIiwgIl8iKTsKIAkJSHR0cEVudGl0eTxTdHJpbmc+IGNoZWNrUm9sZUVudGl0eSA9IG5ldyBIdHRwRW50aXR5PD4oaGVhZGVycyk7Ci0JCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJDb25uZWN0aW5nIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0iKTsKLQkJUmVzcG9uc2VFbnRpdHk8U3RyaW5nPiBjaGVja1JvbGVJbkV4dGVybmFsU3lzdGVtID0gdGVtcGxhdGUuZXhjaGFuZ2UoU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKQotCQkJCQkJKyAicm9sZXMvIityb2xlTmFtZSwgSHR0cE1ldGhvZC5HRVQsIGNoZWNrUm9sZUVudGl0eSwgU3RyaW5nLmNsYXNzKTsKLQkJaWYoIWNoZWNrUm9sZUluRXh0ZXJuYWxTeXN0ZW0uZ2V0Qm9keSgpLmVxdWFscygie30iKSl7Ci0JCQlsb2dnZXIuZGVidWcoIlJvbGUgYWxyZWFkeSBleGlzdHMgaW4gZXh0ZXJuYWwgc3lzdGVtICIsIGNoZWNrUm9sZUluRXh0ZXJuYWxTeXN0ZW0uZ2V0Qm9keSgpKTsKKwkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgImNoZWNrSWZSb2xlRXhpdHNJbkV4dGVybmFsU3lzdGVtOiB7fSAiICwgQ09OTkVDVElOR19UT19FWFRFUk5BTF9BVVRIX1NZU1RFTV9MT0dfTUVTU0FHRSk7CisJCVJlc3BvbnNlRW50aXR5PFN0cmluZz4gY2hlY2tSb2xlSW5FeHRlcm5hbFN5c3RlbSA9IHRlbXBsYXRlCisJCQkJLmV4Y2hhbmdlKFN5c3RlbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkVYVEVSTkFMX0NFTlRSQUxfQUNDRVNTX1VSTCkgKyAicm9sZXMvIgorCQkJCQkJKyByb2xlTmFtZSwgSHR0cE1ldGhvZC5HRVQsIGNoZWNrUm9sZUVudGl0eSwgU3RyaW5nLmNsYXNzKTsKKwkJaWYgKCFjaGVja1JvbGVJbkV4dGVybmFsU3lzdGVtLmdldEJvZHkoKS5lcXVhbHMoSVNfRU1QVFlfSlNPTl9TVFJJTkcpKSB7CisJCQlsb2dnZXIuZGVidWcoImNoZWNrSWZSb2xlRXhpdHNJbkV4dGVybmFsU3lzdGVtOiBSb2xlIGFscmVhZHkgZXhpc3RzIGluIGV4dGVybmFsIHN5c3RlbSB7fSBhbmQgc3RhdHVzIGNvZGU6IHt9ICIsIGNoZWNrUm9sZUluRXh0ZXJuYWxTeXN0ZW0uZ2V0Qm9keSgpLCBjaGVja1JvbGVJbkV4dGVybmFsU3lzdGVtLmdldFN0YXR1c0NvZGUoKS52YWx1ZSgpKTsKIAkJCXRocm93IG5ldyBFeGNlcHRpb24oIlJvbGUgYWxyZWFkeSBleGlzdHMgaW4gZXh0ZXJuYWwgc3lzdGVtIik7Ci0JCX0JCQorCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNhdmVSb2xlRnVuY3Rpb24oTGlzdDxSb2xlRnVuY3Rpb24+IHJvbGVGdW5jdGlvbkxpc3ROZXcsIEVQQXBwIGFwcCwgTGlzdDxFUFJvbGU+IGFwcGxpY2F0aW9uUm9sZXMpCXRocm93cyBFeGNlcHRpb24geworCS8qKgorCSAqIEl0IHNhdmVzIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIHRoZSByb2xlIGluIHBvcnRhbAorCSAqIAorCSAqIEBwYXJhbSByb2xlRnVuY3Rpb25MaXN0TmV3CisJICogQHBhcmFtIGFwcAorCSAqIEBwYXJhbSBhcHBsaWNhdGlvblJvbGVzCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIHZvaWQgc2F2ZVJvbGVGdW5jdGlvbihMaXN0PFJvbGVGdW5jdGlvbj4gcm9sZUZ1bmN0aW9uTGlzdE5ldywgRVBBcHAgYXBwLCBMaXN0PEVQUm9sZT4gYXBwbGljYXRpb25Sb2xlcykKKwkJCXRocm93cyBFeGNlcHRpb24gewogCQlmb3IgKFJvbGVGdW5jdGlvbiByb2xlRnVuYyA6IHJvbGVGdW5jdGlvbkxpc3ROZXcpIHsKIAkJCUVQQXBwUm9sZUZ1bmN0aW9uIGFwcFJvbGVGdW5jID0gbmV3IEVQQXBwUm9sZUZ1bmN0aW9uKCk7CiAJCQlhcHBSb2xlRnVuYy5zZXRBcHBJZChhcHAuZ2V0SWQoKSk7CkBAIC01MjIsMjAgKzY2MiwzMyBAQAogCQkJZGF0YUFjY2Vzc1NlcnZpY2Uuc2F2ZURvbWFpbk9iamVjdChhcHBSb2xlRnVuYywgbnVsbCk7CiAJCX0KIAl9Ci0KKwkKKwkvKioKKwkgKiBJdCBkZWxldGVzIGFsbCBFUEFwcFJvbGVGdW5jdGlvbiByZWNvcmRzIGluIHRoZSBwb3J0YWwKKwkgKiAKKwkgKiBAcGFyYW0gYXBwCisJICogQHBhcmFtIHJvbGUKKwkgKi8KIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlwcml2YXRlIHZvaWQgZGVsZXRlUm9sZUZ1bmN0aW9uKEVQQXBwIGFwcCwgTGlzdDxFUFJvbGU+IHJvbGUpIHsKIAkJTGlzdDxFUEFwcFJvbGVGdW5jdGlvbj4gYXBwUm9sZUZ1bmN0aW9uTGlzdCA9IGRhdGFBY2Nlc3NTZXJ2aWNlLmdldExpc3QoRVBBcHBSb2xlRnVuY3Rpb24uY2xhc3MsCi0JCQkJIiB3aGVyZSBhcHBfaWQgPSAiICsgYXBwLmdldElkKCkgKyAiIGFuZCByb2xlX2lkID0gIiArIHJvbGUuZ2V0KDApLmdldElkKCksIG51bGwsIG51bGwpOwotCQlpZiAoIWFwcFJvbGVGdW5jdGlvbkxpc3QuaXNFbXB0eSgpIHx8IGFwcFJvbGVGdW5jdGlvbkxpc3Quc2l6ZSgpID4gMCkgeworCQkJCVdIRVJFX0FQUF9JRF9FUVVBTFMgKyBhcHAuZ2V0SWQoKSArICIgYW5kIHJvbGVfaWQgPSAiICsgcm9sZS5nZXQoMCkuZ2V0SWQoKSwgbnVsbCwgbnVsbCk7CisJCWlmICghYXBwUm9sZUZ1bmN0aW9uTGlzdC5pc0VtcHR5KCkpIHsKIAkJCWZvciAoRVBBcHBSb2xlRnVuY3Rpb24gYXBwcm9sZUZ1bmN0aW9uIDogYXBwUm9sZUZ1bmN0aW9uTGlzdCkgewogCQkJCWRhdGFBY2Nlc3NTZXJ2aWNlLmRlbGV0ZURvbWFpbk9iamVjdChhcHByb2xlRnVuY3Rpb24sIG51bGwpOwogCQkJfQogCQl9CiAJfQotCisJCisJQE92ZXJyaWRlCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFN0cmluZyBnZXRVc2VyKFN0cmluZyBsb2dpbklkLCBTdHJpbmcgdWVia2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgTGlzdDxFUFVzZXI+IGdldFVzZXIoU3RyaW5nIGxvZ2luSWQpeworCQlyZXR1cm4gKExpc3Q8RVBVc2VyPikgZGF0YUFjY2Vzc1NlcnZpY2UuZ2V0TGlzdChFUFVzZXIuY2xhc3MsCisJCQkJIiB3aGVyZSBvcmdfdXNlcl9pZCA9ICciICsgbG9naW5JZCArICInIiwgbnVsbCwgbnVsbCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVc2VyV2l0aFJvbGVzKFN0cmluZyBsb2dpbklkLCBTdHJpbmcgdWVia2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAJCUxpc3Q8RVBVc2VyPiB1c2VyTGlzdCA9IG51bGw7CiAJCUNlbnRyYWxVc2VyIGNlblVzZXIgPSBudWxsOwpAQCAtNTQzLDQzICs2OTYsNDIgQEAKIAkJU3RyaW5nIHJlc3VsdCA9IG51bGw7CiAJCXRyeSB7CiAJCQlwYXJhbXMucHV0KCJvcmdVc2VySWRWYWx1ZSIsIGxvZ2luSWQpOwotCQkJTGlzdDxFUEFwcD4gYXBwTGlzdCA9IChMaXN0PEVQQXBwPikgZ2V0QXBwKHVlYmtleSk7Ci0JCQlpZiAoYXBwTGlzdC5zaXplKCkgPiAwKSB7CisJCQlMaXN0PEVQQXBwPiBhcHBMaXN0ID0gZ2V0QXBwKHVlYmtleSk7CisJCQlpZiAoIWFwcExpc3QuaXNFbXB0eSgpKSB7CiAJCQkJYXBwID0gYXBwTGlzdC5nZXQoMCk7Ci0JCQkJdXNlckxpc3QgPSAoTGlzdDxFUFVzZXI+KSBkYXRhQWNjZXNzU2VydmljZS5nZXRMaXN0KEVQVXNlci5jbGFzcywKLQkJCQkJCSIgd2hlcmUgb3JnX3VzZXJfaWQgPSAnIiArIGxvZ2luSWQgKyAiJyIsIG51bGwsIG51bGwpOwotCQkJCWlmICh1c2VyTGlzdC5zaXplKCkgPiAwKSB7CisJCQkJdXNlckxpc3QgPSBnZXRVc2VyKGxvZ2luSWQpOworCQkJCWlmICghdXNlckxpc3QuaXNFbXB0eSgpKSB7CiAJCQkJCUVQVXNlciB1c2VyID0gdXNlckxpc3QuZ2V0KDApOwogCQkJCQlPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOwogCQkJCQlTZXQ8RVBVc2VyQXBwPiB1c2VyQXBwU2V0ID0gdXNlci5nZXRFUFVzZXJBcHBzKCk7CiAJCQkJCWNlblVzZXIgPSBjcmVhdGVFUFVzZXIodXNlciwgdXNlckFwcFNldCwgYXBwKTsKIAkJCQkJcmVzdWx0ID0gbWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZyhjZW5Vc2VyKTsKLQkJCQl9IGVsc2UgaWYgKHVzZXJMaXN0LnNpemUoKSA9PSAwKSB7CisJCQkJfSBlbHNlIGlmICh1c2VyTGlzdC5pc0VtcHR5KCkpIHsKIAkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVXNlciBub3QgZm91bmQiKTsKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkFwcGxpY2F0aW9uIG5vdCBmb3VuZCIpOwogCQkJfQogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImdldFVzZXIgaXMgZmFpbGVkIiwgZSk7CisJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiZ2V0VXNlcjogZmFpbGVkIiwgZSk7CiAJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKIAkJfQogCQlyZXR1cm4gcmVzdWx0OwogCX0KLQkKKwogCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0PENlbnRyYWxSb2xlPiBnZXRSb2xlc0ZvckFwcChTdHJpbmcgdWVia2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkVudGVyaW5nIGludG8gZ2V0Um9sZXNGb3JBcHAiKTsKKwkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgImdldFJvbGVzRm9yQXBwOiBFbnRlcmluZyBpbnRvIGdldFJvbGVzRm9yQXBwIik7CiAJCUxpc3Q8Q2VudHJhbFJvbGU+IHJvbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCWZpbmFsIE1hcDxTdHJpbmcsIExvbmc+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAkJdHJ5IHsKIAkJCUxpc3Q8RVBBcHA+IGFwcCA9IGdldEFwcCh1ZWJrZXkpOwotCQkJTGlzdDxFUFJvbGU+IGFwcFJvbGVzTGlzdCA9IGdldEFwcFJvbGVzKGFwcC5nZXQoMCkuZ2V0SWQoKSwgbnVsbCk7CisJCQlMaXN0PEVQUm9sZT4gYXBwUm9sZXNMaXN0ID0gZ2V0QXBwUm9sZXMoYXBwLmdldCgwKS5nZXRJZCgpKTsKIAkJCWNyZWF0ZUNlbnRyYWxSb2xlT2JqZWN0KGFwcCwgYXBwUm9sZXNMaXN0LCByb2xlTGlzdCwgcGFyYW1zKTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJCXRocm93IG5ldyBFeGNlcHRpb24oImdldFJvbGVzRm9yQXBwIEZhaWxlZCIsIGUpOwogCQl9Ci0JCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJGaW5pc2hlZCBnZXRSb2xlc0ZvckFwcCIpOworCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiZ2V0Um9sZXNGb3JBcHA6IEZpbmlzaGVkIGdldFJvbGVzRm9yQXBwIik7CiAJCXJldHVybiByb2xlTGlzdDsKIAl9CiAKQEAgLTU4OSwxNyArNzQxLDI2IEBACiAJCUVQQXBwIGFwcCA9IGdldEFwcCh1ZWJrZXkpLmdldCgwKTsKIAkJTGlzdDxDZW50cmFsUm9sZUZ1bmN0aW9uPiBnZXRSb2xlRnVuY0xpc3QgPSBudWxsOwogCQlmaW5hbCBNYXA8U3RyaW5nLCBMb25nPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCXBhcmFtcy5wdXQoImFwcElkIiwgYXBwLmdldElkKCkpOwotCQkvL1N5bmMgYWxsIGZ1bmN0aW9ucyBmcm9tIGV4dGVybmFsIHN5c3RlbSBpbnRvIEVjb21wIHBvcnRhbCBEQgotCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiRW50ZXJpbmcgaW50byBzeW5jUm9sZUZ1bmN0aW9uRnJvbUV4dGVybmFsQWNjZXNzU3lzdGVtIik7CisJCXBhcmFtcy5wdXQoQVBQX0lELCBhcHAuZ2V0SWQoKSk7CisJCS8vIFN5bmMgYWxsIGZ1bmN0aW9ucyBmcm9tIGV4dGVybmFsIHN5c3RlbSBpbnRvIEVjb21wIHBvcnRhbCBEQgorCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiZ2V0Um9sZUZ1bmNMaXN0OiBFbnRlcmluZyBpbnRvIHN5bmNSb2xlRnVuY3Rpb25Gcm9tRXh0ZXJuYWxBY2Nlc3NTeXN0ZW0iKTsKIAkJc3luY1JvbGVGdW5jdGlvbkZyb21FeHRlcm5hbEFjY2Vzc1N5c3RlbShhcHApOwotCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiRmluaXNoZWQgc3luY1JvbGVGdW5jdGlvbkZyb21FeHRlcm5hbEFjY2Vzc1N5c3RlbSIpOworCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiZ2V0Um9sZUZ1bmNMaXN0OiBGaW5pc2hlZCBzeW5jUm9sZUZ1bmN0aW9uRnJvbUV4dGVybmFsQWNjZXNzU3lzdGVtIik7CiAJCWdldFJvbGVGdW5jTGlzdCA9IGRhdGFBY2Nlc3NTZXJ2aWNlLmV4ZWN1dGVOYW1lZFF1ZXJ5KCJnZXRBbGxSb2xlRnVuY3Rpb25zIiwgcGFyYW1zLCBudWxsKTsKIAkJcmV0dXJuIGdldFJvbGVGdW5jTGlzdDsKIAl9CiAKKwkvKioKKwkgKiBJdCByZXR1cm5zIHVzZXIgZGV0YWlsIGluZm9ybWF0aW9uIHdoaWNoIGlzIGRlZXAgY29weSBvZiBFUFVzZXIuY2xhc3Mgb2JqZWN0CisJICogCisJICogQHBhcmFtIHVzZXJJbmZvCisJICogQHBhcmFtIHVzZXJBcHBTZXQKKwkgKiBAcGFyYW0gYXBwCisJICogQHJldHVybgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENlbnRyYWxVc2VyIGNyZWF0ZUVQVXNlcihFUFVzZXIgdXNlckluZm8sIFNldDxFUFVzZXJBcHA+IHVzZXJBcHBTZXQsIEVQQXBwIGFwcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBDZW50cmFsVXNlciBjcmVhdGVFUFVzZXIoRVBVc2VyIHVzZXJJbmZvLCBTZXQ8RVBVc2VyQXBwPiB1c2VyQXBwU2V0LCBFUEFwcCBhcHApIHRocm93cyBFeGNlcHRpb24gewogCiAJCWZpbmFsIE1hcDxTdHJpbmcsIExvbmc+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAkJQ2VudHJhbFVzZXIgdXNlckFwcExpc3QgPSBuZXcgQ2VudHJhbFVzZXIoKTsKQEAgLTYyNiwyNyArNzg3LDI3IEBACiAJCQkJCQkJCWVwQXBwLmdldFVlYlRvcGljTmFtZSgpKTsKIAkJCQkJCWN1YS5zZXRBcHAoY2VuQXBwKTsKIAkJCQkJCXBhcmFtcy5wdXQoInJvbGVJZCIsIHVzZXJBcHAuZ2V0Um9sZSgpLmdldElkKCkpOwotCQkJCQkJcGFyYW1zLnB1dCgiYXBwSWQiLCB1c2VyQXBwLmdldEFwcCgpLmdldElkKCkpOworCQkJCQkJcGFyYW1zLnB1dChBUFBfSUQsIHVzZXJBcHAuZ2V0QXBwKCkuZ2V0SWQoKSk7CiAJCQkJCQlMaXN0PENlbnRyYWxSb2xlRnVuY3Rpb24+IGFwcFJvbGVGdW5jdGlvbkxpc3QgPSBkYXRhQWNjZXNzU2VydmljZQogCQkJCQkJCQkuZXhlY3V0ZU5hbWVkUXVlcnkoImdldEFwcFJvbGVGdW5jdGlvbkxpc3QiLCBwYXJhbXMsIG51bGwpOwotCQkJCQkJU29ydGVkU2V0PENlbnRyYWxSb2xlRnVuY3Rpb24+IHJvbGVGdW5jdGlvblNldCA9IG5ldyBUcmVlU2V0PENlbnRyYWxSb2xlRnVuY3Rpb24+KCk7CisJCQkJCQlTb3J0ZWRTZXQ8Q2VudHJhbFJvbGVGdW5jdGlvbj4gcm9sZUZ1bmN0aW9uU2V0ID0gbmV3IFRyZWVTZXQ8PigpOwogCQkJCQkJZm9yIChDZW50cmFsUm9sZUZ1bmN0aW9uIHJvbGVGdW5jIDogYXBwUm9sZUZ1bmN0aW9uTGlzdCkgewogCQkJCQkJCUNlbnRyYWxSb2xlRnVuY3Rpb24gY2VuUm9sZUZ1bmMgPSBuZXcgQ2VudHJhbFJvbGVGdW5jdGlvbihyb2xlRnVuYy5nZXRJZCgpLAogCQkJCQkJCQkJcm9sZUZ1bmMuZ2V0Q29kZSgpLCByb2xlRnVuYy5nZXROYW1lKCksIG51bGwsIG51bGwpOwogCQkJCQkJCXJvbGVGdW5jdGlvblNldC5hZGQoY2VuUm9sZUZ1bmMpOwogCQkJCQkJfQogCQkJCQkJTG9uZyB1c2VyUm9sZUlkID0gbnVsbDsKLQkJCQkJCWlmKGdsb2JhbFJvbGUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJnbG9iYWxfIikgJiYgZXBBcHAuZ2V0SWQoKS5lcXVhbHMoUG9ydGFsQ29uc3RhbnRzLlBPUlRBTF9BUFBfSUQpKXsKKwkJCQkJCWlmIChnbG9iYWxSb2xlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiZ2xvYmFsXyIpCisJCQkJCQkJCSYmIGVwQXBwLmdldElkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5QT1JUQUxfQVBQX0lEKSkgewogCQkJCQkJCXVzZXJSb2xlSWQgPSB1c2VyQXBwLmdldFJvbGUoKS5nZXRJZCgpOwotCQkJCQkJfSBlbHNleworCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQl1c2VyUm9sZUlkID0gdXNlckFwcC5nZXRSb2xlKCkuZ2V0QXBwUm9sZUlkKCk7CiAJCQkJCQl9Ci0JCQkJCQlDZW50cmFsUm9sZSBjZW5Sb2xlID0gbmV3IENlbnRyYWxSb2xlKHVzZXJSb2xlSWQsCi0JCQkJCQkJCXVzZXJBcHAuZ2V0Um9sZSgpLmdldENyZWF0ZWQoKSwgdXNlckFwcC5nZXRSb2xlKCkuZ2V0TW9kaWZpZWQoKSwKLQkJCQkJCQkJdXNlckFwcC5nZXRSb2xlKCkuZ2V0Q3JlYXRlZElkKCksIHVzZXJBcHAuZ2V0Um9sZSgpLmdldE1vZGlmaWVkSWQoKSwKLQkJCQkJCQkJdXNlckFwcC5nZXRSb2xlKCkuZ2V0Um93TnVtKCksIHVzZXJBcHAuZ2V0Um9sZSgpLmdldE5hbWUoKSwKLQkJCQkJCQkJdXNlckFwcC5nZXRSb2xlKCkuZ2V0QWN0aXZlKCksIHVzZXJBcHAuZ2V0Um9sZSgpLmdldFByaW9yaXR5KCksIHJvbGVGdW5jdGlvblNldCwgbnVsbCwKLQkJCQkJCQkJbnVsbCk7CisJCQkJCQlDZW50cmFsUm9sZSBjZW5Sb2xlID0gbmV3IENlbnRyYWxSb2xlKHVzZXJSb2xlSWQsIHVzZXJBcHAuZ2V0Um9sZSgpLmdldENyZWF0ZWQoKSwKKwkJCQkJCQkJdXNlckFwcC5nZXRSb2xlKCkuZ2V0TW9kaWZpZWQoKSwgdXNlckFwcC5nZXRSb2xlKCkuZ2V0Q3JlYXRlZElkKCksCisJCQkJCQkJCXVzZXJBcHAuZ2V0Um9sZSgpLmdldE1vZGlmaWVkSWQoKSwgdXNlckFwcC5nZXRSb2xlKCkuZ2V0Um93TnVtKCksCisJCQkJCQkJCXVzZXJBcHAuZ2V0Um9sZSgpLmdldE5hbWUoKSwgdXNlckFwcC5nZXRSb2xlKCkuZ2V0QWN0aXZlKCksCisJCQkJCQkJCXVzZXJBcHAuZ2V0Um9sZSgpLmdldFByaW9yaXR5KCksIHJvbGVGdW5jdGlvblNldCwgbnVsbCwgbnVsbCk7CiAJCQkJCQljdWEuc2V0Um9sZShjZW5Sb2xlKTsKIAogCQkJCQkJdXNlckFwcExpc3QudXNlckFwcHMuYWRkKGN1YSk7CkBAIC02NzAsNyArODMxLDcgQEAKIAkJCQkJdXNlckluZm8uZ2V0SW50ZXJuYWwoKSwgdXNlckluZm8uZ2V0U2VsZWN0ZWRQcm9maWxlSWQoKSwgdXNlckluZm8uZ2V0VGltZVpvbmVJZCgpLAogCQkJCQl1c2VySW5mby5pc09ubGluZSgpLCB1c2VySW5mby5nZXRDaGF0SWQoKSwgdXNlckFwcExpc3QudXNlckFwcHMsIG51bGwpOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImNyZWF0ZUVQVXNlciBmYWlsZWQiLCBlKTsKKwkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJjcmVhdGVFUFVzZXI6IGNyZWF0ZUVQVXNlciBmYWlsZWQiLCBlKTsKIAkJCXRocm93IG5ldyBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwogCQl9CiAKQEAgLTY4NywxMiArODQ4LDEyIEBACiAJCUxpc3Q8RVBBcHA+IGFwcCA9IG51bGw7CiAJCXRyeSB7CiAJCQlhcHAgPSBnZXRBcHAodWVia2V5KTsKLQkJCWlmIChhcHAuaXNFbXB0eSgpIHx8IGFwcC5zaXplKCkgPT0gMCkgeworCQkJaWYgKGFwcC5pc0VtcHR5KCkpIHsKIAkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJBcHBsaWNhdGlvbiBub3QgZm91bmQiKTsKIAkJCX0KIAkJCVN0cmluZyBmaWx0ZXIgPSBudWxsOwotCQkJaWYgKGFwcC5nZXQoMCkuZ2V0SWQoKSA9PSBQb3J0YWxDb25zdGFudHMuUE9SVEFMX0FQUF9JRCkgewotCQkJCWZpbHRlciA9ICIgd2hlcmUgcm9sZV9pZCA9ICIgKyByb2xlSWQgKyAiIGFuZCBhcHBfaWQgaXMgbnVsbCAiOworCQkJaWYgKGFwcC5nZXQoMCkuZ2V0SWQoKS5lcXVhbHMoUG9ydGFsQ29uc3RhbnRzLlBPUlRBTF9BUFBfSUQpKSB7CisJCQkJZmlsdGVyID0gV0hFUkVfUk9MRV9JRF9FUVVBTFMgKyByb2xlSWQgKyAiIGFuZCBhcHBfaWQgaXMgbnVsbCAiOwogCQkJfSBlbHNlIHsKIAkJCQlmaWx0ZXIgPSAiIHdoZXJlIGFwcF9yb2xlX2lkID0gIiArIHJvbGVJZCArICIgYW5kIGFwcF9pZCA9ICIgKyBhcHAuZ2V0KDApLmdldElkKCk7CiAKQEAgLTcwNCwyOCArODY1LDM4IEBACiAJCQl9CiAKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJnZXRSb2xlSW5mbyBmYWlsZWQiLCBlKTsKKwkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJnZXRSb2xlSW5mbzogZmFpbGVkIiwgZSk7CiAJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKIAogCQl9CiAJCXJldHVybiByb2xlTGlzdC5nZXQoMCk7CiAJfQotCisJCisJLyoqCisJICogCisJICogSXQgcmV0dXJucyBsaXN0IG9mIGFwcCByb2xlcyBhbG9uZyB3aXRoIHJvbGUgZnVuY3Rpb25zIGFuZCB3aGljaCB3ZW50IHRocm91Z2ggZGVlcCBjb3B5CisJICogCisJICogQHBhcmFtIGFwcAorCSAqIEBwYXJhbSByb2xlSW5mbworCSAqIEBwYXJhbSByb2xlTGlzdAorCSAqIEBwYXJhbSBwYXJhbXMKKwkgKiBAcmV0dXJuCisJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJcHJpdmF0ZSBMaXN0PENlbnRyYWxSb2xlPiBjcmVhdGVDZW50cmFsUm9sZU9iamVjdChMaXN0PEVQQXBwPiBhcHAsIExpc3Q8RVBSb2xlPiByb2xlSW5mbywKIAkJCUxpc3Q8Q2VudHJhbFJvbGU+IHJvbGVMaXN0LCBNYXA8U3RyaW5nLCBMb25nPiBwYXJhbXMpIHsKIAkJZm9yIChFUFJvbGUgcm9sZSA6IHJvbGVJbmZvKSB7CiAJCQlwYXJhbXMucHV0KCJyb2xlSWQiLCByb2xlLmdldElkKCkpOwotCQkJcGFyYW1zLnB1dCgiYXBwSWQiLCBhcHAuZ2V0KDApLmdldElkKCkpOworCQkJcGFyYW1zLnB1dChBUFBfSUQsIGFwcC5nZXQoMCkuZ2V0SWQoKSk7CiAJCQlMaXN0PENlbnRyYWxSb2xlRnVuY3Rpb24+IGNlblJvbGVGdW5jTGlzdCA9IGRhdGFBY2Nlc3NTZXJ2aWNlLmV4ZWN1dGVOYW1lZFF1ZXJ5KCJnZXRBcHBSb2xlRnVuY3Rpb25MaXN0IiwKIAkJCQkJcGFyYW1zLCBudWxsKTsKLQkJCVNvcnRlZFNldDxDZW50cmFsUm9sZUZ1bmN0aW9uPiByb2xlRnVuY3Rpb25TZXQgPSBuZXcgVHJlZVNldDxDZW50cmFsUm9sZUZ1bmN0aW9uPigpOworCQkJU29ydGVkU2V0PENlbnRyYWxSb2xlRnVuY3Rpb24+IHJvbGVGdW5jdGlvblNldCA9IG5ldyBUcmVlU2V0PD4oKTsKIAkJCWZvciAoQ2VudHJhbFJvbGVGdW5jdGlvbiByb2xlRnVuYyA6IGNlblJvbGVGdW5jTGlzdCkgewogCQkJCUNlbnRyYWxSb2xlRnVuY3Rpb24gY2VuUm9sZUZ1bmMgPSBuZXcgQ2VudHJhbFJvbGVGdW5jdGlvbihyb2xlLmdldElkKCksIHJvbGVGdW5jLmdldENvZGUoKSwKIAkJCQkJCXJvbGVGdW5jLmdldE5hbWUoKSwgbnVsbCwgbnVsbCk7CiAJCQkJcm9sZUZ1bmN0aW9uU2V0LmFkZChjZW5Sb2xlRnVuYyk7CiAJCQl9Ci0JCQlTb3J0ZWRTZXQ8Q2VudHJhbFJvbGU+IGNoaWxkUm9sZXMgPSBuZXcgVHJlZVNldDxDZW50cmFsUm9sZT4oKTsKKwkJCVNvcnRlZFNldDxDZW50cmFsUm9sZT4gY2hpbGRSb2xlcyA9IG5ldyBUcmVlU2V0PD4oKTsKIAkJCUNlbnRyYWxSb2xlIGNlblJvbGUgPSBudWxsOwogCQkJaWYgKHJvbGUuZ2V0QXBwUm9sZUlkKCkgPT0gbnVsbCkgewogCQkJCWNlblJvbGUgPSBuZXcgQ2VudHJhbFJvbGUocm9sZS5nZXRJZCgpLCByb2xlLmdldENyZWF0ZWQoKSwgcm9sZS5nZXRNb2RpZmllZCgpLCByb2xlLmdldENyZWF0ZWRJZCgpLApAQCAtNzUwLDM3ICs5MjEsNDcgQEAKIAkJZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAJCXRyeSB7CiAJCQlwYXJhbXMucHV0KCJmdW5jdGlvbkNvZGUiLCBmdW5jdGlvbkNvZGUpOwotCQkJcGFyYW1zLnB1dCgiYXBwSWQiLCBTdHJpbmcudmFsdWVPZihhcHAuZ2V0SWQoKSkpOworCQkJcGFyYW1zLnB1dChBUFBfSUQsIFN0cmluZy52YWx1ZU9mKGFwcC5nZXRJZCgpKSk7CiAJCQlnZXRSb2xlRnVuY0xpc3QgPSBkYXRhQWNjZXNzU2VydmljZS5leGVjdXRlTmFtZWRRdWVyeSgiZ2V0Um9sZUZ1bmN0aW9uIiwgcGFyYW1zLCBudWxsKTsKLQkJCWlmIChnZXRSb2xlRnVuY0xpc3QuaXNFbXB0eSgpIHwgZ2V0Um9sZUZ1bmNMaXN0LnNpemUoKSA9PSAwKSB7CisJCQlpZiAoZ2V0Um9sZUZ1bmNMaXN0LmlzRW1wdHkoKSkgewogCQkJCXJldHVybiByb2xlRnVuYzsKIAkJCX0KIAogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImdldFJvbGVGdW5jdGlvbiBmYWlsZWQiLCBlKTsKKwkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJnZXRSb2xlRnVuY3Rpb246IGZhaWxlZCIsIGUpOwogCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiZ2V0Um9sZUZ1bmN0aW9uIGZhaWxlZCIsIGUpOwogCQl9CiAJCXJldHVybiBnZXRSb2xlRnVuY0xpc3QuZ2V0KDApOwogCX0KIAogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNhdmVDZW50cmFsUm9sZUZ1bmN0aW9uKENlbnRyYWxSb2xlRnVuY3Rpb24gZG9tYWluQ2VudHJhbFJvbGVGdW5jdGlvbiwgRVBBcHAgYXBwKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgYm9vbGVhbiBzYXZlQ2VudHJhbFJvbGVGdW5jdGlvbihDZW50cmFsUm9sZUZ1bmN0aW9uIGRvbWFpbkNlbnRyYWxSb2xlRnVuY3Rpb24sIEVQQXBwIGFwcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWJvb2xlYW4gc2F2ZU9yVXBkYXRlRnVuY3Rpb24gPSBmYWxzZTsKIAkJdHJ5IHsKIAkJCWFkZFJvbGVGdW5jdGlvbkluRXh0ZXJuYWxTeXN0ZW0oZG9tYWluQ2VudHJhbFJvbGVGdW5jdGlvbiwgYXBwKTsKIAkJCWRhdGFBY2Nlc3NTZXJ2aWNlLnNhdmVEb21haW5PYmplY3QoZG9tYWluQ2VudHJhbFJvbGVGdW5jdGlvbiwgbnVsbCk7CisJCQlzYXZlT3JVcGRhdGVGdW5jdGlvbiA9IHRydWU7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAic2F2ZUNlbnRyYWxSb2xlRnVuY3Rpb24gZmFpbGVkIiwgZSk7Ci0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKwkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJzYXZlQ2VudHJhbFJvbGVGdW5jdGlvbjogZmFpbGVkIiwgZSk7CisJCQlzYXZlT3JVcGRhdGVGdW5jdGlvbiA9IGZhbHNlOwogCQl9CisJCXJldHVybiBzYXZlT3JVcGRhdGVGdW5jdGlvbjsKIAl9Ci0KKwkKKwkvKioKKwkgKiBJdCBjcmVhdGVzIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24gaW4gZXh0ZXJuYWwgYXV0aCBzeXN0ZW0KKwkgKiAKKwkgKiBAcGFyYW0gZG9tYWluQ2VudHJhbFJvbGVGdW5jdGlvbgorCSAqIEBwYXJhbSBhcHAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCXByaXZhdGUgdm9pZCBhZGRSb2xlRnVuY3Rpb25JbkV4dGVybmFsU3lzdGVtKENlbnRyYWxSb2xlRnVuY3Rpb24gZG9tYWluQ2VudHJhbFJvbGVGdW5jdGlvbiwgRVBBcHAgYXBwKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CiAJCWZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gbmV3IEhhc2hNYXA8PigpOwogCQlwYXJhbXMucHV0KCJmdW5jdGlvbkNkIiwgZG9tYWluQ2VudHJhbFJvbGVGdW5jdGlvbi5nZXRDb2RlKCkpOwotCQlwYXJhbXMucHV0KCJhcHBJZCIsIFN0cmluZy52YWx1ZU9mKGFwcC5nZXRJZCgpKSk7CisJCXBhcmFtcy5wdXQoQVBQX0lELCBTdHJpbmcudmFsdWVPZihhcHAuZ2V0SWQoKSkpOwogCQlFeHRlcm5hbEFjY2Vzc1Blcm1zIGV4dFBlcm1zID0gbmV3IEV4dGVybmFsQWNjZXNzUGVybXMoKTsKIAkJSHR0cEhlYWRlcnMgaGVhZGVycyA9IEVjb21wUG9ydGFsVXRpbHMuYmFzZTY0ZW5jb2RlS2V5Rm9yQUFGQmFzaWNBdXRoKCk7CiAJCUxpc3Q8Q2VudHJhbFJvbGVGdW5jdGlvbj4gYXBwUm9sZUZ1bmMgPSBkYXRhQWNjZXNzU2VydmljZS5leGVjdXRlTmFtZWRRdWVyeSgiZ2V0QXBwRnVuY3Rpb25EZXRhaWxzIiwgcGFyYW1zLApAQCAtNzkzLDcgKzk3NCw3IEBACiAJCX0KIAkJU3RyaW5nIGNoZWNrVHlwZSA9IGRvbWFpbkNlbnRyYWxSb2xlRnVuY3Rpb24uZ2V0Q29kZSgpLmNvbnRhaW5zKCJtZW51IikgPyAibWVudSIgOiAidXJsIjsKIAkJSHR0cEVudGl0eTxTdHJpbmc+IGdldFNpbmdsZVBlcm1FbnRpdHkgPSBuZXcgSHR0cEVudGl0eTw+KGhlYWRlcnMpOwotCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiQ29ubmVjdGluZyB0byBFeHRlcm5hbCBBY2Nlc3Mgc3lzdGVtIik7CisJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJhZGRSb2xlRnVuY3Rpb25JbkV4dGVybmFsU3lzdGVtOiB7fSAiLCBDT05ORUNUSU5HX1RPX0VYVEVSTkFMX0FVVEhfU1lTVEVNX0xPR19NRVNTQUdFKTsKIAkJUmVzcG9uc2VFbnRpdHk8U3RyaW5nPiBnZXRSZXNwb25zZSA9IHRlbXBsYXRlLmV4Y2hhbmdlKAogCQkJCVN5c3RlbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkVYVEVSTkFMX0NFTlRSQUxfQUNDRVNTX1VSTCkgKyAicGVybXMvIgogCQkJCQkJKyBhcHAuZ2V0TmFtZVNwYWNlKCkgKyAiLiIgKyBjaGVja1R5cGUgKyAiLyIgKyByb2xlRnVuY05hbWUgKyAiLyoiLApAQCAtODAyLDE3MiArOTgzLDIwMCBAQAogCQkJRVBMb2dVdGlsLmxvZ0V4dGVybmFsQXV0aEFjY2Vzc0FsYXJtKGxvZ2dlciwgZ2V0UmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpKTsKIAkJCXRocm93IG5ldyBFeGNlcHRpb24oZ2V0UmVzcG9uc2UuZ2V0Qm9keSgpKTsKIAkJfQotCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiQ29ubmVjdGVkIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0iKTsKKwkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgImFkZFJvbGVGdW5jdGlvbkluRXh0ZXJuYWxTeXN0ZW06IEZpbmlzaGVkIEdFVCBwZXJtaXNzaW9uIGZyb20gRXh0ZXJuYWwgQXV0aCBzeXN0ZW0gYW5kIHJlc3BvbnNlOiB7fSAiLCBnZXRSZXNwb25zZS5nZXRCb2R5KCkpOwogCQlTdHJpbmcgcmVzID0gZ2V0UmVzcG9uc2UuZ2V0Qm9keSgpOwotCQlpZiAocmVzLmVxdWFscygie30iKSkgewotCQkJdHJ5ewotCQkJZXh0UGVybXMuc2V0QWN0aW9uKCIqIik7Ci0JCQlleHRQZXJtcy5zZXRJbnN0YW5jZShkb21haW5DZW50cmFsUm9sZUZ1bmN0aW9uLmdldENvZGUoKSk7Ci0JCQlleHRQZXJtcy5zZXRUeXBlKGFwcC5nZXROYW1lU3BhY2UoKSArICIuIiArIGNoZWNrVHlwZSk7Ci0JCQlleHRQZXJtcy5zZXREZXNjcmlwdGlvbihkb21haW5DZW50cmFsUm9sZUZ1bmN0aW9uLmdldE5hbWUoKSk7Ci0JCQlTdHJpbmcgdXBkYXRlUm9sZSA9IG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoZXh0UGVybXMpOwotCQkJSHR0cEVudGl0eTxTdHJpbmc+IGVudGl0eSA9IG5ldyBIdHRwRW50aXR5PD4odXBkYXRlUm9sZSwgaGVhZGVycyk7Ci0JCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiQ29ubmVjdGluZyB0byBFeHRlcm5hbCBBY2Nlc3Mgc3lzdGVtIik7Ci0JCQl0ZW1wbGF0ZS5leGNoYW5nZSgKLQkJCQkJU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKSArICJwZXJtIiwKLQkJCQkJSHR0cE1ldGhvZC5QT1NULCBlbnRpdHksIFN0cmluZy5jbGFzcyk7Ci0JCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiQ29ubmVjdGVkIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0iKTsKLQkJCX1jYXRjaChIdHRwQ2xpZW50RXJyb3JFeGNlcHRpb24gZSl7CisJCWlmIChyZXMuZXF1YWxzKElTX0VNUFRZX0pTT05fU1RSSU5HKSkgeworCQkJdHJ5IHsKKwkJCQlleHRQZXJtcy5zZXRBY3Rpb24oIioiKTsKKwkJCQlleHRQZXJtcy5zZXRJbnN0YW5jZShkb21haW5DZW50cmFsUm9sZUZ1bmN0aW9uLmdldENvZGUoKSk7CisJCQkJZXh0UGVybXMuc2V0VHlwZShhcHAuZ2V0TmFtZVNwYWNlKCkgKyAiLiIgKyBjaGVja1R5cGUpOworCQkJCWV4dFBlcm1zLnNldERlc2NyaXB0aW9uKGRvbWFpbkNlbnRyYWxSb2xlRnVuY3Rpb24uZ2V0TmFtZSgpKTsKKwkJCQlTdHJpbmcgdXBkYXRlUm9sZSA9IG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoZXh0UGVybXMpOworCQkJCUh0dHBFbnRpdHk8U3RyaW5nPiBlbnRpdHkgPSBuZXcgSHR0cEVudGl0eTw+KHVwZGF0ZVJvbGUsIGhlYWRlcnMpOworCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJhZGRSb2xlRnVuY3Rpb25JbkV4dGVybmFsU3lzdGVtOiB7fSAiICwgQ09OTkVDVElOR19UT19FWFRFUk5BTF9BVVRIX1NZU1RFTV9MT0dfTUVTU0FHRSk7CisJCQkJUmVzcG9uc2VFbnRpdHk8U3RyaW5nPiBhZGRQZXJtUmVzcG9uc2U9IHRlbXBsYXRlLmV4Y2hhbmdlKAorCQkJCQkJU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKSArICJwZXJtIiwKKwkJCQkJCUh0dHBNZXRob2QuUE9TVCwgZW50aXR5LCBTdHJpbmcuY2xhc3MpOworCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJhZGRSb2xlRnVuY3Rpb25JbkV4dGVybmFsU3lzdGVtOiBGaW5pc2hlZCBhZGRpbmcgcGVybWlzc2lvbiBpbiAgYW5kIHN0YXR1cyBjb2RlOiB7fSAiLCBhZGRQZXJtUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLnZhbHVlKCkpOworCQkJfSBjYXRjaChIdHRwQ2xpZW50RXJyb3JFeGNlcHRpb24gZSl7CiAJCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgIkh0dHBDbGllbnRFcnJvckV4Y2VwdGlvbiAtIEZhaWxlZCB0byBhZGQgZnVuY3Rpb24gaW4gZXh0ZXJuYWwgY2VudHJhbCBhdXRoIHN5c3RlbSIsIGUpOwogCQkJCUVQTG9nVXRpbC5sb2dFeHRlcm5hbEF1dGhBY2Nlc3NBbGFybShsb2dnZXIsIGUuZ2V0U3RhdHVzQ29kZSgpKTsKLQkJCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgIkZhaWxlZCB0byBhZGQgZnVuY3Rpb24gaW4gZXh0ZXJuYWwgY2VudHJhbCBhdXRoIHN5c3RlbSIsIGUpOworCQkJfWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJhZGRSb2xlRnVuY3Rpb25JbkV4dGVybmFsU3lzdGVtOiBGYWlsZWQgdG8gYWRkIGZ1Y250aW9uIGluIGV4dGVybmFsIGNlbnRyYWwgYXV0aCBzeXN0ZW0iLAorCQkJCQkJZSk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQl0cnl7Ci0JCQlleHRQZXJtcy5zZXRBY3Rpb24oIioiKTsKLQkJCWV4dFBlcm1zLnNldEluc3RhbmNlKGRvbWFpbkNlbnRyYWxSb2xlRnVuY3Rpb24uZ2V0Q29kZSgpKTsKLQkJCWV4dFBlcm1zLnNldFR5cGUoYXBwLmdldE5hbWVTcGFjZSgpICsgIi4iICsgY2hlY2tUeXBlKTsKLQkJCWV4dFBlcm1zLnNldERlc2NyaXB0aW9uKGRvbWFpbkNlbnRyYWxSb2xlRnVuY3Rpb24uZ2V0TmFtZSgpKTsKLQkJCVN0cmluZyB1cGRhdGVSb2xlID0gbWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZyhleHRQZXJtcyk7Ci0JCQlIdHRwRW50aXR5PFN0cmluZz4gZW50aXR5ID0gbmV3IEh0dHBFbnRpdHk8Pih1cGRhdGVSb2xlLCBoZWFkZXJzKTsKLQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJDb25uZWN0aW5nIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0iKTsKLQkJCXRlbXBsYXRlLmV4Y2hhbmdlKAotCQkJCQlTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VUkwpICsgInBlcm0iLAotCQkJCQlIdHRwTWV0aG9kLlBVVCwgZW50aXR5LCBTdHJpbmcuY2xhc3MpOwotCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkNvbm5lY3RlZCB0byBFeHRlcm5hbCBBY2Nlc3Mgc3lzdGVtIik7Ci0JCQl9Y2F0Y2goSHR0cENsaWVudEVycm9yRXhjZXB0aW9uIGUpeworCQkJdHJ5IHsKKwkJCQlleHRQZXJtcy5zZXRBY3Rpb24oIioiKTsKKwkJCQlleHRQZXJtcy5zZXRJbnN0YW5jZShkb21haW5DZW50cmFsUm9sZUZ1bmN0aW9uLmdldENvZGUoKSk7CisJCQkJZXh0UGVybXMuc2V0VHlwZShhcHAuZ2V0TmFtZVNwYWNlKCkgKyAiLiIgKyBjaGVja1R5cGUpOworCQkJCWV4dFBlcm1zLnNldERlc2NyaXB0aW9uKGRvbWFpbkNlbnRyYWxSb2xlRnVuY3Rpb24uZ2V0TmFtZSgpKTsKKwkJCQlTdHJpbmcgdXBkYXRlUm9sZSA9IG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoZXh0UGVybXMpOworCQkJCUh0dHBFbnRpdHk8U3RyaW5nPiBlbnRpdHkgPSBuZXcgSHR0cEVudGl0eTw+KHVwZGF0ZVJvbGUsIGhlYWRlcnMpOworCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJhZGRSb2xlRnVuY3Rpb25JbkV4dGVybmFsU3lzdGVtOiB7fSAiICwgQ09OTkVDVElOR19UT19FWFRFUk5BTF9BVVRIX1NZU1RFTV9MT0dfTUVTU0FHRSk7CisJCQkJUmVzcG9uc2VFbnRpdHk8U3RyaW5nPiB1cGRhdGVQZXJtUmVzcG9uc2UgPSB0ZW1wbGF0ZS5leGNoYW5nZSgKKwkJCQkJCVN5c3RlbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkVYVEVSTkFMX0NFTlRSQUxfQUNDRVNTX1VSTCkgKyAicGVybSIsCisJCQkJCQlIdHRwTWV0aG9kLlBVVCwgZW50aXR5LCBTdHJpbmcuY2xhc3MpOworCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJhZGRSb2xlRnVuY3Rpb25JbkV4dGVybmFsU3lzdGVtOiBGaW5pc2hlZCB1cGRhdGluZyBwZXJtaXNzaW9uIGluIEV4dGVybmFsIEF1dGggc3lzdGVtIGFuZCByZXNwb25zZToge30gIiwgdXBkYXRlUGVybVJlc3BvbnNlLmdldEJvZHkoKSk7CisJCQl9IGNhdGNoKEh0dHBDbGllbnRFcnJvckV4Y2VwdGlvbiBlKXsKIAkJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiSHR0cENsaWVudEVycm9yRXhjZXB0aW9uIC0gRmFpbGVkIHRvIGFkZCBmdW5jdGlvbiBpbiBleHRlcm5hbCBjZW50cmFsIGF1dGggc3lzdGVtIiwgZSk7CiAJCQkJRVBMb2dVdGlsLmxvZ0V4dGVybmFsQXV0aEFjY2Vzc0FsYXJtKGxvZ2dlciwgZS5nZXRTdGF0dXNDb2RlKCkpOwotCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiRmFpbGVkIHRvIGFkZCBmdW5jdGlvbiBpbiBleHRlcm5hbCBjZW50cmFsIGF1dGggc3lzdGVtIiwgZSk7Ci0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImFkZFJvbGVGdW5jdGlvbkluRXh0ZXJuYWxTeXN0ZW06IEZhaWxlZCB0byB1cGRhdGUgZnVuY3Rpb24gaW4gZXh0ZXJuYWwgY2VudHJhbCBhdXRoIHN5c3RlbSIsCisJCQkJCQllKTsKIAkJCX0KIAkJfQogCX0KIAogCUBPdmVycmlkZQogCUBUcmFuc2FjdGlvbmFsCi0JcHVibGljIHZvaWQgZGVsZXRlQ2VudHJhbFJvbGVGdW5jdGlvbihTdHJpbmcgY29kZSwgU3RyaW5nIHVlYmtleSkgeworCXB1YmxpYyBib29sZWFuIGRlbGV0ZUNlbnRyYWxSb2xlRnVuY3Rpb24oU3RyaW5nIGNvZGUsIEVQQXBwIGFwcCkgeworCQlib29sZWFuIGRlbGV0ZUZ1bmN0aW9uUmVzcG9uc2UgPSBmYWxzZTsKIAkJdHJ5IHsKLQkJCUVQQXBwIGFwcCA9IGdldEFwcCh1ZWJrZXkpLmdldCgwKTsKIAkJCWZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gbmV3IEhhc2hNYXA8PigpOwogCQkJcGFyYW1zLnB1dCgiZnVuY3Rpb25DZCIsIGNvZGUpOwotCQkJcGFyYW1zLnB1dCgiYXBwSWQiLCBTdHJpbmcudmFsdWVPZihhcHAuZ2V0SWQoKSkpOwotCQkJQ2VudHJhbFJvbGVGdW5jdGlvbiBkb21haW5DZW50cmFsUm9sZUZ1bmN0aW9uID0gKENlbnRyYWxSb2xlRnVuY3Rpb24pIGRhdGFBY2Nlc3NTZXJ2aWNlLmV4ZWN1dGVOYW1lZFF1ZXJ5KCJnZXRBcHBGdW5jdGlvbkRldGFpbHMiLCBwYXJhbXMsIG51bGwpLmdldCgwKTsKLSAJCQlkZWxldGVSb2xlRnVuY3Rpb25JbkV4dGVybmFsU3lzdGVtKGRvbWFpbkNlbnRyYWxSb2xlRnVuY3Rpb24sIGFwcCk7Ci0gCQkJLy9EZWxldGUgcm9sZSBmdW5jdGlvbiBkZXBlbmRlY3kgcmVjb3JkcwotIAkJCWRlbGV0ZUFwcFJvbGVGdW5jdGlvbnMoY29kZSwgYXBwKTsKKwkJCXBhcmFtcy5wdXQoQVBQX0lELCBTdHJpbmcudmFsdWVPZihhcHAuZ2V0SWQoKSkpOworCQkJQ2VudHJhbFJvbGVGdW5jdGlvbiBkb21haW5DZW50cmFsUm9sZUZ1bmN0aW9uID0gKENlbnRyYWxSb2xlRnVuY3Rpb24pIGRhdGFBY2Nlc3NTZXJ2aWNlCisJCQkJCS5leGVjdXRlTmFtZWRRdWVyeSgiZ2V0QXBwRnVuY3Rpb25EZXRhaWxzIiwgcGFyYW1zLCBudWxsKS5nZXQoMCk7CisJCQlkZWxldGVSb2xlRnVuY3Rpb25JbkV4dGVybmFsU3lzdGVtKGRvbWFpbkNlbnRyYWxSb2xlRnVuY3Rpb24sIGFwcCk7CisJCQkvLyBEZWxldGUgcm9sZSBmdW5jdGlvbiBkZXBlbmRlbmN5IHJlY29yZHMKKwkJCWRlbGV0ZUFwcFJvbGVGdW5jdGlvbnMoY29kZSwgYXBwKTsKIAkJCWRhdGFBY2Nlc3NTZXJ2aWNlLmRlbGV0ZURvbWFpbk9iamVjdChkb21haW5DZW50cmFsUm9sZUZ1bmN0aW9uLCBudWxsKTsKKwkJCWRlbGV0ZUZ1bmN0aW9uUmVzcG9uc2UgPSB0cnVlOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImRlbGV0ZUNlbnRyYWxSb2xlRnVuY3Rpb24gZmFpbGVkIiwgZSk7CisJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiZGVsZXRlQ2VudHJhbFJvbGVGdW5jdGlvbjogZmFpbGVkIiwgZSk7CiAJCX0KKwkJcmV0dXJuIGRlbGV0ZUZ1bmN0aW9uUmVzcG9uc2U7CiAJfQogCisJLyoqCisJICogSXQgZGVsZXRlcyBhcHAgZnVuY3Rpb24gcmVjb3JkIGluIHBvcnRhbCAKKwkgKiAKKwkgKiBAcGFyYW0gY29kZQorCSAqIEBwYXJhbSBhcHAKKwkgKi8KIAlwcml2YXRlIHZvaWQgZGVsZXRlQXBwUm9sZUZ1bmN0aW9ucyhTdHJpbmcgY29kZSwgRVBBcHAgYXBwKSB7Ci0JCQlkYXRhQWNjZXNzU2VydmljZS5kZWxldGVEb21haW5PYmplY3RzKEVQQXBwUm9sZUZ1bmN0aW9uLmNsYXNzLCAiIGFwcF9pZCA9ICIrYXBwLmdldElkKCkrIiBhbmQgZnVuY3Rpb25fY2QgPSAnIisgY29kZSArIiciLCBudWxsKTsKKwkJZGF0YUFjY2Vzc1NlcnZpY2UuZGVsZXRlRG9tYWluT2JqZWN0cyhFUEFwcFJvbGVGdW5jdGlvbi5jbGFzcywKKwkJCQlBUFBfSURfRVFVQUxTICsgYXBwLmdldElkKCkgKyAiIGFuZCBmdW5jdGlvbl9jZCA9ICciICsgY29kZSArICInIiwgbnVsbCk7CiAJfQotCisJCisJLyoqCisJICogCisJICogSXQgZGVsZXRlcyBwZXJtaXNzaW9uIGluIHRoZSBleHRlcm5hbCBhdXRoIHN5c3RlbSAgCisJICogCisJICogQHBhcmFtIGRvbWFpbkNlbnRyYWxSb2xlRnVuY3Rpb24KKwkgKiBAcGFyYW0gYXBwCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KIAlwcml2YXRlIHZvaWQgZGVsZXRlUm9sZUZ1bmN0aW9uSW5FeHRlcm5hbFN5c3RlbShDZW50cmFsUm9sZUZ1bmN0aW9uIGRvbWFpbkNlbnRyYWxSb2xlRnVuY3Rpb24sIEVQQXBwIGFwcCkKIAkJCXRocm93cyBFeGNlcHRpb24gewotCQl0cnl7Ci0JCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7Ci0JCUV4dGVybmFsQWNjZXNzUGVybXMgZXh0UGVybXMgPSBuZXcgRXh0ZXJuYWxBY2Nlc3NQZXJtcygpOwotCQlTdHJpbmcgY2hlY2tUeXBlID0gZG9tYWluQ2VudHJhbFJvbGVGdW5jdGlvbi5nZXRDb2RlKCkuY29udGFpbnMoIm1lbnUiKSA/ICJtZW51IiA6ICJ1cmwiOwotCQlIdHRwSGVhZGVycyBoZWFkZXJzID0gRWNvbXBQb3J0YWxVdGlscy5iYXNlNjRlbmNvZGVLZXlGb3JBQUZCYXNpY0F1dGgoKTsKLQkJZXh0UGVybXMuc2V0QWN0aW9uKCIqIik7Ci0JCWV4dFBlcm1zLnNldEluc3RhbmNlKGRvbWFpbkNlbnRyYWxSb2xlRnVuY3Rpb24uZ2V0Q29kZSgpKTsKLQkJZXh0UGVybXMuc2V0VHlwZShhcHAuZ2V0TmFtZVNwYWNlKCkgKyAiLiIgKyBjaGVja1R5cGUpOwotCQlleHRQZXJtcy5zZXREZXNjcmlwdGlvbihkb21haW5DZW50cmFsUm9sZUZ1bmN0aW9uLmdldE5hbWUoKSk7Ci0JCVN0cmluZyB1cGRhdGVSb2xlID0gbWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZyhleHRQZXJtcyk7Ci0JCUh0dHBFbnRpdHk8U3RyaW5nPiBlbnRpdHkgPSBuZXcgSHR0cEVudGl0eTw+KHVwZGF0ZVJvbGUsIGhlYWRlcnMpOwotCQl0ZW1wbGF0ZS5leGNoYW5nZSgKLQkJCQlTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VUkwpICsgInBlcm0/Zm9yY2U9dHJ1ZSIsCi0JCQkJSHR0cE1ldGhvZC5ERUxFVEUsIGVudGl0eSwgU3RyaW5nLmNsYXNzKTsKKwkJdHJ5IHsKKwkJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisJCQlFeHRlcm5hbEFjY2Vzc1Blcm1zIGV4dFBlcm1zID0gbmV3IEV4dGVybmFsQWNjZXNzUGVybXMoKTsKKwkJCVN0cmluZyBjaGVja1R5cGUgPSBkb21haW5DZW50cmFsUm9sZUZ1bmN0aW9uLmdldENvZGUoKS5jb250YWlucygibWVudSIpID8gIm1lbnUiIDogInVybCI7CisJCQlIdHRwSGVhZGVycyBoZWFkZXJzID0gRWNvbXBQb3J0YWxVdGlscy5iYXNlNjRlbmNvZGVLZXlGb3JBQUZCYXNpY0F1dGgoKTsKKwkJCWV4dFBlcm1zLnNldEFjdGlvbigiKiIpOworCQkJZXh0UGVybXMuc2V0SW5zdGFuY2UoZG9tYWluQ2VudHJhbFJvbGVGdW5jdGlvbi5nZXRDb2RlKCkpOworCQkJZXh0UGVybXMuc2V0VHlwZShhcHAuZ2V0TmFtZVNwYWNlKCkgKyAiLiIgKyBjaGVja1R5cGUpOworCQkJZXh0UGVybXMuc2V0RGVzY3JpcHRpb24oZG9tYWluQ2VudHJhbFJvbGVGdW5jdGlvbi5nZXROYW1lKCkpOworCQkJU3RyaW5nIHVwZGF0ZVJvbGUgPSBtYXBwZXIud3JpdGVWYWx1ZUFzU3RyaW5nKGV4dFBlcm1zKTsKKwkJCUh0dHBFbnRpdHk8U3RyaW5nPiBlbnRpdHkgPSBuZXcgSHR0cEVudGl0eTw+KHVwZGF0ZVJvbGUsIGhlYWRlcnMpOworCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwiZGVsZXRlUm9sZUZ1bmN0aW9uSW5FeHRlcm5hbFN5c3RlbToge30gIiAsIENPTk5FQ1RJTkdfVE9fRVhURVJOQUxfQVVUSF9TWVNURU1fTE9HX01FU1NBR0UpOworCQkJUmVzcG9uc2VFbnRpdHk8U3RyaW5nPiBkZWxQZXJtUmVzcG9uc2UgPSB0ZW1wbGF0ZS5leGNoYW5nZShTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VUkwpCisJCQkJCSsgInBlcm0/Zm9yY2U9dHJ1ZSIsIEh0dHBNZXRob2QuREVMRVRFLCBlbnRpdHksIFN0cmluZy5jbGFzcyk7CisJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiZGVsZXRlUm9sZUZ1bmN0aW9uSW5FeHRlcm5hbFN5c3RlbTogRmluaXNoZWQgZGVsZXRpbmcgcGVybWlzc2lvbiBpbiBFeHRlcm5hbCBBdXRoIHN5c3RlbSBhbmQgc3RhdHVzIGNvZGU6IHt9ICIsIGRlbFBlcm1SZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkudmFsdWUoKSk7CiAJCX0gY2F0Y2goSHR0cENsaWVudEVycm9yRXhjZXB0aW9uIGUpewogCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgIkh0dHBDbGllbnRFcnJvckV4Y2VwdGlvbiAtIEZhaWxlZCB0byBkZWxldGUgZnVuY3Rpb25zIGluIEV4dGVybmFsIFN5c3RlbSIsIGUpOwogCQkJRVBMb2dVdGlsLmxvZ0V4dGVybmFsQXV0aEFjY2Vzc0FsYXJtKGxvZ2dlciwgZS5nZXRTdGF0dXNDb2RlKCkpOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCWlmKGUuZ2V0TWVzc2FnZSgpLmVxdWFsc0lnbm9yZUNhc2UoIjQwNCBOb3QgRm91bmQiKSl7Ci0JCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiIEl0IHNlZW1zIGxpa2UgZnVuY3Rpb24gaXMgYWxyZWFkeSBkZWxldGVkIGluIGV4dGVybmFsIGNlbnRyYWwgYXV0aCBzeXN0ZW0gIGJ1dCBleGlzdHMgaW4gbG9jYWwgREIiLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGVsc2V7Ci0JCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgIkZhaWxlZCB0byBkZWxldGUgZnVuY3Rpb25zIGluIEV4dGVybmFsIFN5c3RlbSIsIGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmVxdWFsc0lnbm9yZUNhc2UoIjQwNCBOb3QgRm91bmQiKSkgeworCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsCisJCQkJCQkiIGRlbGV0ZVJvbGVGdW5jdGlvbkluRXh0ZXJuYWxTeXN0ZW06IEl0IHNlZW1zIGxpa2UgZnVuY3Rpb24gaXMgYWxyZWFkeSBkZWxldGVkIGluIGV4dGVybmFsIGNlbnRyYWwgYXV0aCBzeXN0ZW0gIGJ1dCBleGlzdHMgaW4gbG9jYWwgREIiLAorCQkJCQkJZS5nZXRNZXNzYWdlKCkpOworCQkJfSBlbHNlIHsKKwkJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiZGVsZXRlUm9sZUZ1bmN0aW9uSW5FeHRlcm5hbFN5c3RlbTogRmFpbGVkIHRvIGRlbGV0ZSBmdW5jdGlvbnMgaW4gRXh0ZXJuYWwgU3lzdGVtIiwgZSk7CiAJCQl9CiAJCX0KIAl9CiAKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzYXZlUm9sZUZvckFwcGxpY2F0aW9uKFJvbGUgc2F2ZVJvbGUsIFN0cmluZyB1ZWJrZXkpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyBib29sZWFuIHNhdmVSb2xlRm9yQXBwbGljYXRpb24oUm9sZSBzYXZlUm9sZSwgU3RyaW5nIHVlYmtleSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWJvb2xlYW4gYWRkUm9sZVJlc3BvbnNlID0gZmFsc2U7CiAJCXRyeSB7CiAJCQlFUEFwcCBhcHAgPSBnZXRBcHAodWVia2V5KS5nZXQoMCk7CiAJCQlhZGRSb2xlSW5FY29tcERCKHNhdmVSb2xlLCBhcHApOworCQkJYWRkUm9sZVJlc3BvbnNlID0gdHJ1ZTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJzYXZlUm9sZUZvckFwcGxpY2F0aW9uIGZhaWxlZCIsIGUpOwotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CiAJCX0KKwkJcmV0dXJuIGFkZFJvbGVSZXNwb25zZTsKIAl9CiAKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkZWxldGVSb2xlRm9yQXBwbGljYXRpb24oU3RyaW5nIGRlbGV0ZVJvbGUsIFN0cmluZyB1ZWJrZXkpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXNzaW9uIGxvY2FsU2Vzc2lvbiA9IG51bGw7CisJcHVibGljIGJvb2xlYW4gZGVsZXRlUm9sZUZvckFwcGxpY2F0aW9uKFN0cmluZyBkZWxldGVSb2xlLCBTdHJpbmcgdWVia2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU2Vzc2lvbiBsb2NhbFNlc3Npb24gPSBzZXNzaW9uRmFjdG9yeS5vcGVuU2Vzc2lvbigpOwogCQlUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiA9IG51bGw7CiAJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAJCXRyeSB7Ci0JCQlsb2NhbFNlc3Npb24gPSBzZXNzaW9uRmFjdG9yeS5vcGVuU2Vzc2lvbigpOwogCQkJdHJhbnNhY3Rpb24gPSBsb2NhbFNlc3Npb24uYmVnaW5UcmFuc2FjdGlvbigpOwogCiAJCQlMaXN0PEVQUm9sZT4gZXBSb2xlTGlzdCA9IG51bGw7CiAJCQlSZXNwb25zZUVudGl0eTxTdHJpbmc+IGRlbGV0ZVJlc3BvbnNlID0gbnVsbDsKIAkJCUVQQXBwIGFwcCA9IGdldEFwcCh1ZWJrZXkpLmdldCgwKTsKLQkJCWlmKGFwcC5nZXRJZCgpID09IDEpCi0JCQl7CisJCQlpZiAoYXBwLmdldElkKCkgPT0gMSkgewogCQkJCWVwUm9sZUxpc3QgPSBkYXRhQWNjZXNzU2VydmljZS5nZXRMaXN0KEVQUm9sZS5jbGFzcywKLQkJCQkJCSIgd2hlcmUgYXBwX2lkIGlzIG51bGwgIiArICJhbmQgcm9sZV9uYW1lID0gJyIgKyBkZWxldGVSb2xlICsiJyIsIG51bGwsIG51bGwpOwotCQkJfQotCQkJZWxzZXsKLQkJCWVwUm9sZUxpc3QgPSBkYXRhQWNjZXNzU2VydmljZS5nZXRMaXN0KEVQUm9sZS5jbGFzcywKLQkJCQkJIiB3aGVyZSBhcHBfaWQgPSAiICsgYXBwLmdldElkKCkgKyAiIGFuZCByb2xlX25hbWUgPSAnIiArIGRlbGV0ZVJvbGUgKyInIiwgbnVsbCwgbnVsbCk7CisJCQkJCQkiIHdoZXJlIGFwcF9pZCBpcyBudWxsICIgKyAiYW5kIHJvbGVfbmFtZSA9ICciICsgZGVsZXRlUm9sZSArICInIiwgbnVsbCwgbnVsbCk7CisJCQl9IGVsc2UgeworCQkJCWVwUm9sZUxpc3QgPSBkYXRhQWNjZXNzU2VydmljZS5nZXRMaXN0KEVQUm9sZS5jbGFzcywKKwkJCQkJCVdIRVJFX0FQUF9JRF9FUVVBTFMgKyBhcHAuZ2V0SWQoKSArICIgYW5kIHJvbGVfbmFtZSA9ICciICsgZGVsZXRlUm9sZSArICInIiwgbnVsbCwgbnVsbCk7CiAJCQl9CiAJCQkvLyBEZWxldGUgYXBwIHJvbGUgZnVuY3Rpb25zIGJlZm9yZSBkZWxldGluZyByb2xlCiAJCQlkZWxldGVSb2xlRnVuY3Rpb24oYXBwLCBlcFJvbGVMaXN0KTsKLQkJCWlmKGFwcC5nZXRJZCgpID09IDEpCi0JCQl7CisJCQlpZiAoYXBwLmdldElkKCkgPT0gMSkgewogCQkJCS8vIERlbGV0ZSBmbl91c2VyXyByb2xlCiAJCQkJZGF0YUFjY2Vzc1NlcnZpY2UuZGVsZXRlRG9tYWluT2JqZWN0cyhFUFVzZXJBcHAuY2xhc3MsCi0JCQkJCQkiIGFwcF9pZCA9ICIgKyBhcHAuZ2V0SWQoKSArICIgYW5kIHJvbGVfaWQgPSAiICsgZXBSb2xlTGlzdC5nZXQoMCkuZ2V0SWQoKSwgbnVsbCk7Ci0JCQkJCi0JCQkJZGVsZXRlUm9sZURlcGVuZGVjaWVzUmVjb3JkKGxvY2FsU2Vzc2lvbiwgZXBSb2xlTGlzdC5nZXQoMCkuZ2V0SWQoKSk7CisJCQkJCQlBUFBfSURfRVFVQUxTICsgYXBwLmdldElkKCkgKyAiIGFuZCByb2xlX2lkID0gIiArIGVwUm9sZUxpc3QuZ2V0KDApLmdldElkKCksIG51bGwpOworCisJCQkJZGVsZXRlUm9sZURlcGVuZGVuY3lSZWNvcmRzKGxvY2FsU2Vzc2lvbiwgZXBSb2xlTGlzdC5nZXQoMCkuZ2V0SWQoKSwgYXBwLmdldElkKCkpOwogCQkJfQogCQkJLy8gRGVsZXRlIFJvbGUgaW4gRXh0ZXJuYWwgU3lzdGVtCiAJCQlTdHJpbmcgZGVsZXRlUm9sZUtleSA9ICJ7XCJuYW1lXCI6XCIiICsgYXBwLmdldE5hbWVTcGFjZSgpICsgIi4iCiAJCQkJCSsgZXBSb2xlTGlzdC5nZXQoMCkuZ2V0TmFtZSgpLnJlcGxhY2VBbGwoIiAiLCAiXyIpICsgIlwifSI7CiAJCQlkZWxldGVSZXNwb25zZSA9IGRlbGV0ZVJvbGVJbkV4dGVybmFsU3lzdGVtKGRlbGV0ZVJvbGVLZXkpOwotCQkJaWYgKGRlbGV0ZVJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKS52YWx1ZSgpICE9IDIwMCkgeworCQkJaWYgKGRlbGV0ZVJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKS52YWx1ZSgpICE9IDIwMCB8fCBkZWxldGVSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkudmFsdWUoKSAhPSA0MDQpIHsKIAkJCQlFUExvZ1V0aWwubG9nRXh0ZXJuYWxBdXRoQWNjZXNzQWxhcm0obG9nZ2VyLCBkZWxldGVSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkpOwotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB0byBkZWxldGUgcm9sZSBpbiBleHRlcm5hbCBhY2Nlc3Mgc3lzdGVtISIpOworCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsCisJCQkJCQkiZGVsZXRlUm9sZUZvckFwcGxpY2F0aW9uOiBGYWlsZWQgdG8gZGVsZXRlIHJvbGUgaW4gZXh0ZXJuYWwgYXV0aCBzeXN0ZW0hIGR1ZSB0byB7fSAiLAorCQkJCQkJZGVsZXRlUmVzcG9uc2UuZ2V0Qm9keSgpKTsKIAkJCX0KLQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJhYm91dCB0byBjb21taXQgdGhlIHRyYW5zYWN0aW9uIik7CisJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiZGVsZXRlUm9sZUZvckFwcGxpY2F0aW9uOiBhYm91dCB0byBjb21taXQgdGhlIHRyYW5zYWN0aW9uIik7CiAJCQl0cmFuc2FjdGlvbi5jb21taXQoKTsKLQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJjb21taXR0ZWQgdGhlIHRyYW5zYWN0aW9uIik7CisJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiZGVsZXRlUm9sZUZvckFwcGxpY2F0aW9uOiBjb21taXR0ZWQgdGhlIHRyYW5zYWN0aW9uIik7CiAJCQlkYXRhQWNjZXNzU2VydmljZS5kZWxldGVEb21haW5PYmplY3QoZXBSb2xlTGlzdC5nZXQoMCksIG51bGwpOwogCQkJcmVzdWx0ID0gdHJ1ZTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJkZWxldGVSb2xlRm9yQXBwbGljYXRpb24gZmFpbGVkIiwgZSk7Ci0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfWZpbmFsbHkgeworCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImRlbGV0ZVJvbGVGb3JBcHBsaWNhdGlvbjogZmFpbGVkIiwgZSk7CisJCQlyZXN1bHQgPSBmYWxzZTsKKwkJfSBmaW5hbGx5IHsKIAkJCWxvY2FsU2Vzc2lvbi5jbG9zZSgpOwotCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotCQkJCQkJIkV4Y2VwdGlvbiBvY2N1cnJlZCBpbiBkZWxldGVSb2xlRm9yQXBwbGljYXRpb24gd2hpbGUgY2xvc2luZyBkYXRhYmFzZSBzZXNzaW9uIGZvciByb2xlOiAnIiArIGRlbGV0ZVJvbGUgKyAiJy4iKTsKLQkJCX0KIAkJfQorCQlyZXR1cm4gcmVzdWx0OwogCX0KIAorCS8qKgorCSAqIAorCSAqIEl0IGRlbGV0ZXMgYXBwbGljYXRpb24gdXNlciByb2xlIGluIGV4dGVybmFsIGF1dGggc3lzdGVtCisJICogCisJICogQHBhcmFtIHJvbGUKKwkgKiBAcGFyYW0gYXBwCisJICogQHBhcmFtIExvZ2luSWQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLwogCXByaXZhdGUgdm9pZCBkZWxldGVVc2VyUm9sZUluRXh0ZXJuYWxTeXN0ZW0oRVBSb2xlIHJvbGUsIEVQQXBwIGFwcCwgU3RyaW5nIExvZ2luSWQpIHRocm93cyBFeGNlcHRpb24gewogCQlIdHRwSGVhZGVycyBoZWFkZXJzID0gRWNvbXBQb3J0YWxVdGlscy5iYXNlNjRlbmNvZGVLZXlGb3JBQUZCYXNpY0F1dGgoKTsKIAkJSHR0cEVudGl0eTxTdHJpbmc+IGVudGl0eSA9IG5ldyBIdHRwRW50aXR5PD4oaGVhZGVycyk7Ci0JCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJDb25uZWN0aW5nIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0iKTsKKwkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwiZGVsZXRlVXNlclJvbGVJbkV4dGVybmFsU3lzdGVtOiB7fSAiICwgQ09OTkVDVElOR19UT19FWFRFUk5BTF9BVVRIX1NZU1RFTV9MT0dfTUVTU0FHRSk7CiAJCVJlc3BvbnNlRW50aXR5PFN0cmluZz4gZ2V0UmVzcG9uc2UgPSB0ZW1wbGF0ZQogCQkJCS5leGNoYW5nZSgKIAkJCQkJCVN5c3RlbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkVYVEVSTkFMX0NFTlRSQUxfQUNDRVNTX1VSTCkgKyAidXNlclJvbGUvIgpAQCAtOTc2LDE0ICsxMTg1LDE0IEBACiAJCQkJCQkJCQkJLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VU0VSX0RPTUFJTikKIAkJCQkJCQkJKyAiLyIgKyBhcHAuZ2V0TmFtZVNwYWNlKCkgKyAiLiIgKyByb2xlLmdldE5hbWUoKS5yZXBsYWNlQWxsKCIgIiwgIl8iKSwKIAkJCQkJCUh0dHBNZXRob2QuR0VULCBlbnRpdHksIFN0cmluZy5jbGFzcyk7CisJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJkZWxldGVVc2VyUm9sZUluRXh0ZXJuYWxTeXN0ZW06IEZpbmlzaGVkIEdFVCB1c2VyIHJvbGVzIGZyb20gRXh0ZXJuYWwgQXV0aCBzeXN0ZW0gYW5kIHJlc3BvbnNlOiB7fSAiLCBnZXRSZXNwb25zZS5nZXRCb2R5KCkpOwogCQlpZiAoZ2V0UmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLnZhbHVlKCkgIT0gMjAwKSB7CiAJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKGdldFJlc3BvbnNlLmdldEJvZHkoKSk7CiAJCX0KLQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkNvbm5lY3RlZCB0byBFeHRlcm5hbCBBY2Nlc3Mgc3lzdGVtIik7CiAJCVN0cmluZyByZXMgPSBnZXRSZXNwb25zZS5nZXRCb2R5KCk7Ci0JCWlmICghcmVzLmVxdWFscygie30iKSkgeworCQlpZiAoIXJlcy5lcXVhbHMoSVNfRU1QVFlfSlNPTl9TVFJJTkcpKSB7CiAJCQlIdHRwRW50aXR5PFN0cmluZz4gdXNlclJvbGVlbnRpdHkgPSBuZXcgSHR0cEVudGl0eTw+KGhlYWRlcnMpOwotCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkNvbm5lY3RpbmcgdG8gRXh0ZXJuYWwgQWNjZXNzIHN5c3RlbSIpOworCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgImRlbGV0ZVVzZXJSb2xlSW5FeHRlcm5hbFN5c3RlbToge30gIiAsIENPTk5FQ1RJTkdfVE9fRVhURVJOQUxfQVVUSF9TWVNURU1fTE9HX01FU1NBR0UpOwogCQkJUmVzcG9uc2VFbnRpdHk8U3RyaW5nPiBkZWxldGVSZXNwb25zZSA9IHRlbXBsYXRlCiAJCQkJCS5leGNoYW5nZSgKIAkJCQkJCQlTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VUkwpCkBAIC05OTUsNyArMTIwNCw3IEBACiAJCQlpZiAoZGVsZXRlUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLnZhbHVlKCkgIT0gMjAwKSB7CiAJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHRvIGRlbGV0ZSB1c2VyIHJvbGUiKTsKIAkJCX0KLQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJDb25uZWN0ZWQgdG8gRXh0ZXJuYWwgQWNjZXNzIHN5c3RlbSIpOworCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgImRlbGV0ZVVzZXJSb2xlSW5FeHRlcm5hbFN5c3RlbTogRmluaXNoZWQgZGVsZXRpbmcgdXNlciByb2xlIGluIEV4dGVybmFsIEF1dGggc3lzdGVtIGFuZCBzdGF0dXMgY29kZToge30gIiwgZGVsZXRlUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLnZhbHVlKCkpOwogCQl9CiAJfQogCkBAIC0xMDEyLDEwICsxMjIxLDEwIEBACiAJCQkJYXBwSWQgPSBhcHAuZ2V0KDApLmdldElkKCk7CiAJCQl9CiAJCQlMaXN0PEVQUm9sZT4gZXBSb2xlID0gZGF0YUFjY2Vzc1NlcnZpY2UuZ2V0TGlzdChFUFJvbGUuY2xhc3MsCi0JCQkJCSIgd2hlcmUgYXBwX2lkID0gIiArIGFwcElkICsgIiBhbmQgYWN0aXZlX3luID0gJ1knIiwgbnVsbCwgbnVsbCk7CisJCQkJCVdIRVJFX0FQUF9JRF9FUVVBTFMgKyBhcHBJZCArICIgYW5kIGFjdGl2ZV95biA9ICdZJyIsIG51bGwsIG51bGwpOwogCQkJcm9sZUxpc3QgPSBjcmVhdGVDZW50cmFsUm9sZU9iamVjdChhcHAsIGVwUm9sZSwgcm9sZUxpc3QsIHBhcmFtcyk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiZ2V0QWN0aXZlUm9sZXMgZmFpbGVkIiwgZSk7CisJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiZ2V0QWN0aXZlUm9sZXM6IGZhaWxlZCIsIGUpOwogCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CiAJCX0KIAkJcmV0dXJuIHJvbGVMaXN0OwpAQCAtMTAyNCwxNTkgKzEyMzMsMTY5IEBACiAKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkZWxldGVEZXBlbmRjeVJvbGVSZWNvcmQoTG9uZyByb2xlSWQsIFN0cmluZyB1ZWJrZXksIFN0cmluZyBMb2dpbklkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgYm9vbGVhbiBkZWxldGVEZXBlbmRlbmN5Um9sZVJlY29yZChMb25nIHJvbGVJZCwgU3RyaW5nIHVlYmtleSwgU3RyaW5nIExvZ2luSWQpIHRocm93cyBFeGNlcHRpb24gewogCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlTZXNzaW9uIGxvY2FsU2Vzc2lvbiA9IG51bGw7CisJCVNlc3Npb24gbG9jYWxTZXNzaW9uID0gc2Vzc2lvbkZhY3Rvcnkub3BlblNlc3Npb24oKTsKIAkJVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBudWxsOwogCQlFUEFwcCBhcHAgPSBudWxsOwogCQl0cnkgewotCQkJbG9jYWxTZXNzaW9uID0gc2Vzc2lvbkZhY3Rvcnkub3BlblNlc3Npb24oKTsKIAkJCXRyYW5zYWN0aW9uID0gbG9jYWxTZXNzaW9uLmJlZ2luVHJhbnNhY3Rpb24oKTsKIAkJCUxpc3Q8RVBSb2xlPiBlcFJvbGVMaXN0ID0gbnVsbDsKIAkJCWFwcCA9IGdldEFwcCh1ZWJrZXkpLmdldCgwKTsKIAkJCWVwUm9sZUxpc3QgPSBkYXRhQWNjZXNzU2VydmljZS5nZXRMaXN0KEVQUm9sZS5jbGFzcywKLQkJCQkJIiB3aGVyZSBhcHBfaWQgPSAiICsgYXBwLmdldElkKCkgKyAiIGFuZCBhcHBfcm9sZV9pZCA9ICIgKyByb2xlSWQsIG51bGwsIG51bGwpOwotCQkJaWYoZXBSb2xlTGlzdC5pc0VtcHR5KCkpeworCQkJCQlXSEVSRV9BUFBfSURfRVFVQUxTICsgYXBwLmdldElkKCkgKyAiIGFuZCBhcHBfcm9sZV9pZCA9ICIgKyByb2xlSWQsIG51bGwsIG51bGwpOworCQkJaWYgKGVwUm9sZUxpc3QuaXNFbXB0eSgpKSB7CiAJCQkJZXBSb2xlTGlzdCA9IGRhdGFBY2Nlc3NTZXJ2aWNlLmdldExpc3QoRVBSb2xlLmNsYXNzLAotCQkJCQkJIiB3aGVyZSBhcHBfaWQgPSAiICsgYXBwLmdldElkKCkgKyAiIGFuZCByb2xlX2lkID0gIiArIHJvbGVJZCwgbnVsbCwgbnVsbCk7CisJCQkJCQlXSEVSRV9BUFBfSURfRVFVQUxTICsgYXBwLmdldElkKCkgKyAiIGFuZCByb2xlX2lkID0gIiArIHJvbGVJZCwgbnVsbCwgbnVsbCk7CiAJCQl9CiAJCQkvLyBEZWxldGUgVXNlciBSb2xlIGluIEV4dGVybmFsIFN5c3RlbSBiZWZvcmUgZGVsZXRpbmcgcm9sZQogCQkJZGVsZXRlVXNlclJvbGVJbkV4dGVybmFsU3lzdGVtKGVwUm9sZUxpc3QuZ2V0KDApLCBhcHAsIExvZ2luSWQpOwogCQkJLy8gRGVsZXRlIHVzZXIgYXBwIHJvbGVzCiAJCQlkYXRhQWNjZXNzU2VydmljZS5kZWxldGVEb21haW5PYmplY3RzKEVQVXNlckFwcC5jbGFzcywKLQkJCQkJIiBhcHBfaWQgPSAiICsgYXBwLmdldElkKCkgKyAiIGFuZCByb2xlX2lkID0gIiArIGVwUm9sZUxpc3QuZ2V0KDApLmdldElkKCksIG51bGwpOwotCQkJCi0JCQlkZWxldGVSb2xlRGVwZW5kZWNpZXNSZWNvcmQobG9jYWxTZXNzaW9uLCBlcFJvbGVMaXN0LmdldCgwKS5nZXRJZCgpKTsKLQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJhYm91dCB0byBjb21taXQgdGhlIHRyYW5zYWN0aW9uIik7CisJCQkJCUFQUF9JRF9FUVVBTFMgKyBhcHAuZ2V0SWQoKSArICIgYW5kIHJvbGVfaWQgPSAiICsgZXBSb2xlTGlzdC5nZXQoMCkuZ2V0SWQoKSwgbnVsbCk7CisKKwkJCWRlbGV0ZVJvbGVEZXBlbmRlbmN5UmVjb3Jkcyhsb2NhbFNlc3Npb24sIGVwUm9sZUxpc3QuZ2V0KDApLmdldElkKCksIGFwcC5nZXRJZCgpKTsKKwkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJkZWxldGVEZXBlbmRlbmN5Um9sZVJlY29yZDogYWJvdXQgdG8gY29tbWl0IHRoZSB0cmFuc2FjdGlvbiIpOwogCQkJdHJhbnNhY3Rpb24uY29tbWl0KCk7Ci0JCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiY29tbWl0dGVkIHRoZSB0cmFuc2FjdGlvbiIpOworCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgImRlbGV0ZURlcGVuZGVuY3lSb2xlUmVjb3JkOiBjb21taXR0ZWQgdGhlIHRyYW5zYWN0aW9uIik7CiAJCQlyZXN1bHQgPSB0cnVlOwotCQl9Y2F0Y2goSHR0cENsaWVudEVycm9yRXhjZXB0aW9uIGUpeworCQl9IGNhdGNoKEh0dHBDbGllbnRFcnJvckV4Y2VwdGlvbiBlKXsKIAkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJIdHRwQ2xpZW50RXJyb3JFeGNlcHRpb24gLSBGYWlsZWQgdG8gZGVsZXRlUm9sZURlcGVuZGVjaWVzUmVjb3JkIiwgZSk7CiAJCQlFUExvZ1V0aWwubG9nRXh0ZXJuYWxBdXRoQWNjZXNzQWxhcm0obG9nZ2VyLCBlLmdldFN0YXR1c0NvZGUoKSk7Ci0JCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUVjb21wUG9ydGFsVXRpbHMucm9sbGJhY2tUcmFuc2FjdGlvbih0cmFuc2FjdGlvbiwKLQkJCQkJImRlbGV0ZURlcGVuZGN5Um9sZVJlY29yZCByb2xsYmFjaywgZXhjZXB0aW9uID0gIiArIGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJRWNvbXBQb3J0YWxVdGlscy5yb2xsYmFja1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLCAiZGVsZXRlRGVwZW5kZW5jeVJvbGVSZWNvcmQ6IHJvbGxiYWNrLCBleGNlcHRpb24gPSAiICsgZSk7CiAJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCBFY29tcFBvcnRhbFV0aWxzLmdldFN0YWNrVHJhY2UoZSkpOwotCQl9ZmluYWxseSB7CisJCQlyZXN1bHQgPSBmYWxzZTsKKwkJfSBmaW5hbGx5IHsKIAkJCWxvY2FsU2Vzc2lvbi5jbG9zZSgpOwotCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotCQkJCQkJIkV4Y2VwdGlvbiBvY2N1cnJlZCBpbiBzeW5jQXBwUm9sZXMgd2hpbGUgY2xvc2luZyBkYXRhYmFzZSBzZXNzaW9uIGZvciByb2xlOiAnIiArIGFwcC5nZXRJZCgpICsgIicuIik7Ci0JCQl9CiAJCX0KKwkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlAVHJhbnNhY3Rpb25hbAotCXB1YmxpYyB2b2lkIHN5bmNSb2xlRnVuY3Rpb25Gcm9tRXh0ZXJuYWxBY2Nlc3NTeXN0ZW0oRVBBcHAgYXBwKXsKLQkJdHJ5ewotCQlSZXNwb25zZUVudGl0eTxTdHJpbmc+IHJlc3BvbnNlID0gbnVsbDsKLQkJSHR0cEhlYWRlcnMgaGVhZGVycyA9IEVjb21wUG9ydGFsVXRpbHMuYmFzZTY0ZW5jb2RlS2V5Rm9yQUFGQmFzaWNBdXRoKCk7Ci0JCUh0dHBFbnRpdHk8U3RyaW5nPiBlbnRpdHkgPSBuZXcgSHR0cEVudGl0eTw+KGhlYWRlcnMpOwotCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiQ29ubmVjdGluZyB0byBFeHRlcm5hbCBBY2Nlc3Mgc3lzdGVtIik7Ci0JCXJlc3BvbnNlID0gdGVtcGxhdGUuZXhjaGFuZ2UoU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKQotCQkJCSsgInBlcm1zL25zLyIgKyBhcHAuZ2V0TmFtZVNwYWNlKCksIEh0dHBNZXRob2QuR0VULCBlbnRpdHksIFN0cmluZy5jbGFzcyk7CisJcHVibGljIHZvaWQgc3luY1JvbGVGdW5jdGlvbkZyb21FeHRlcm5hbEFjY2Vzc1N5c3RlbShFUEFwcCBhcHApIHsKKwkJdHJ5IHsKKwkJCVJlc3BvbnNlRW50aXR5PFN0cmluZz4gcmVzcG9uc2UgPSBudWxsOworCQkJSHR0cEhlYWRlcnMgaGVhZGVycyA9IEVjb21wUG9ydGFsVXRpbHMuYmFzZTY0ZW5jb2RlS2V5Rm9yQUFGQmFzaWNBdXRoKCk7CisJCQlIdHRwRW50aXR5PFN0cmluZz4gZW50aXR5ID0gbmV3IEh0dHBFbnRpdHk8PihoZWFkZXJzKTsKKwkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJzeW5jUm9sZUZ1bmN0aW9uRnJvbUV4dGVybmFsQWNjZXNzU3lzdGVtOiB7fSAiICwgQ09OTkVDVElOR19UT19FWFRFUk5BTF9BVVRIX1NZU1RFTV9MT0dfTUVTU0FHRSk7CisJCQlyZXNwb25zZSA9IHRlbXBsYXRlCisJCQkJCS5leGNoYW5nZShTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VUkwpCisJCQkJCQkJKyAicGVybXMvbnMvIiArIGFwcC5nZXROYW1lU3BhY2UoKSwgSHR0cE1ldGhvZC5HRVQsIGVudGl0eSwgU3RyaW5nLmNsYXNzKTsKIAotCQlTdHJpbmcgcmVzID0gcmVzcG9uc2UuZ2V0Qm9keSgpOwotCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiQ29ubmVjdGVkIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0gYW5kIHRoZSByZXN1bHQgaXMgOiIsIHJlcyk7Ci0JCUpTT05PYmplY3QganNvbk9iaiA9IG5ldyBKU09OT2JqZWN0KHJlcyk7Ci0JCUpTT05BcnJheSBleHRQZXJtcyA9IGpzb25PYmouZ2V0SlNPTkFycmF5KCJwZXJtIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0UGVybXMubGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGV4dFBlcm1zLmdldEpTT05PYmplY3QoaSkuZ2V0U3RyaW5nKCJ0eXBlIikuZXF1YWxzKGFwcC5nZXROYW1lU3BhY2UoKSArICIuYWNjZXNzIikpIHsKLQkJCQlleHRQZXJtcy5yZW1vdmUoaSk7Ci0JCQkJaS0tOworCQkJU3RyaW5nIHJlcyA9IHJlc3BvbnNlLmdldEJvZHkoKTsKKwkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJzeW5jUm9sZUZ1bmN0aW9uRnJvbUV4dGVybmFsQWNjZXNzU3lzdGVtOiBGaW5pc2hlZCBHRVQgcGVybWlzc2lvbnMgZnJvbSBFeHRlcm5hbCBBdXRoIHN5c3RlbSBhbmQgcmVzcG9uc2U6IHt9ICIsIHJlc3BvbnNlLmdldEJvZHkoKSk7CisJCQlKU09OT2JqZWN0IGpzb25PYmogPSBuZXcgSlNPTk9iamVjdChyZXMpOworCQkJSlNPTkFycmF5IGV4dFBlcm1zID0ganNvbk9iai5nZXRKU09OQXJyYXkoInBlcm0iKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0UGVybXMubGVuZ3RoKCk7IGkrKykgeworCQkJCWlmIChleHRQZXJtcy5nZXRKU09OT2JqZWN0KGkpLmdldFN0cmluZygidHlwZSIpLmVxdWFscyhhcHAuZ2V0TmFtZVNwYWNlKCkgKyAiLmFjY2VzcyIpKSB7CisJCQkJCWV4dFBlcm1zLnJlbW92ZShpKTsKKwkJCQkJaS0tOworCQkJCX0KIAkJCX0KLQkJfQotCQlFeHRlcm5hbEFjY2Vzc1Blcm1zRGV0YWlsIHBlcm1EZXRhaWxzID0gbnVsbDsKLQkJTGlzdDxFeHRlcm5hbEFjY2Vzc1Blcm1zRGV0YWlsPiBwZXJtc0RldGFpbExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRQZXJtcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoZXh0UGVybXMuZ2V0SlNPTk9iamVjdChpKS5oYXMoInJvbGVzIikpIHsKLQkJCQlPYmplY3RNYXBwZXIgcm9sZXNMaXN0TWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOwotCQkJCUpTT05BcnJheSByZXNSb2xlcyA9IGV4dFBlcm1zLmdldEpTT05PYmplY3QoaSkuZ2V0SlNPTkFycmF5KCJyb2xlcyIpOwotCQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gcm9sZXNMaXN0TWFwcGVyLnJlYWRWYWx1ZShyZXNSb2xlcy50b1N0cmluZygpLAotCQkJCQkJVHlwZUZhY3RvcnkuZGVmYXVsdEluc3RhbmNlKCkuY29uc3RydWN0Q29sbGVjdGlvblR5cGUoTGlzdC5jbGFzcywgU3RyaW5nLmNsYXNzKSk7Ci0JCQkJcGVybURldGFpbHMgPSBuZXcgRXh0ZXJuYWxBY2Nlc3NQZXJtc0RldGFpbChleHRQZXJtcy5nZXRKU09OT2JqZWN0KGkpLmdldFN0cmluZygidHlwZSIpLAotCQkJCQkJZXh0UGVybXMuZ2V0SlNPTk9iamVjdChpKS5nZXRTdHJpbmcoImluc3RhbmNlIiksIGV4dFBlcm1zLmdldEpTT05PYmplY3QoaSkuZ2V0U3RyaW5nKCJhY3Rpb24iKSwKLQkJCQkJCWxpc3QsIGV4dFBlcm1zLmdldEpTT05PYmplY3QoaSkuZ2V0U3RyaW5nKCJkZXNjcmlwdGlvbiIpKTsKLQkJCQlwZXJtc0RldGFpbExpc3QuYWRkKHBlcm1EZXRhaWxzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGVybURldGFpbHMgPSBuZXcgRXh0ZXJuYWxBY2Nlc3NQZXJtc0RldGFpbChleHRQZXJtcy5nZXRKU09OT2JqZWN0KGkpLmdldFN0cmluZygidHlwZSIpLAotCQkJCQkJZXh0UGVybXMuZ2V0SlNPTk9iamVjdChpKS5nZXRTdHJpbmcoImluc3RhbmNlIiksIGV4dFBlcm1zLmdldEpTT05PYmplY3QoaSkuZ2V0U3RyaW5nKCJhY3Rpb24iKSwKLQkJCQkJCWV4dFBlcm1zLmdldEpTT05PYmplY3QoaSkuZ2V0U3RyaW5nKCJkZXNjcmlwdGlvbiIpKTsKLQkJCQlwZXJtc0RldGFpbExpc3QuYWRkKHBlcm1EZXRhaWxzKTsKKwkJCUV4dGVybmFsQWNjZXNzUGVybXNEZXRhaWwgcGVybURldGFpbHMgPSBudWxsOworCQkJTGlzdDxFeHRlcm5hbEFjY2Vzc1Blcm1zRGV0YWlsPiBwZXJtc0RldGFpbExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0UGVybXMubGVuZ3RoKCk7IGkrKykgeworCQkJCWlmIChleHRQZXJtcy5nZXRKU09OT2JqZWN0KGkpLmhhcygicm9sZXMiKSkgeworCQkJCQlPYmplY3RNYXBwZXIgcm9sZXNMaXN0TWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworCQkJCQlKU09OQXJyYXkgcmVzUm9sZXMgPSBleHRQZXJtcy5nZXRKU09OT2JqZWN0KGkpLmdldEpTT05BcnJheSgicm9sZXMiKTsKKwkJCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSByb2xlc0xpc3RNYXBwZXIucmVhZFZhbHVlKHJlc1JvbGVzLnRvU3RyaW5nKCksCisJCQkJCQkJVHlwZUZhY3RvcnkuZGVmYXVsdEluc3RhbmNlKCkuY29uc3RydWN0Q29sbGVjdGlvblR5cGUoTGlzdC5jbGFzcywgU3RyaW5nLmNsYXNzKSk7CisJCQkJCXBlcm1EZXRhaWxzID0gbmV3IEV4dGVybmFsQWNjZXNzUGVybXNEZXRhaWwoZXh0UGVybXMuZ2V0SlNPTk9iamVjdChpKS5nZXRTdHJpbmcoInR5cGUiKSwKKwkJCQkJCQlleHRQZXJtcy5nZXRKU09OT2JqZWN0KGkpLmdldFN0cmluZygiaW5zdGFuY2UiKSwKKwkJCQkJCQlleHRQZXJtcy5nZXRKU09OT2JqZWN0KGkpLmdldFN0cmluZygiYWN0aW9uIiksIGxpc3QsCisJCQkJCQkJZXh0UGVybXMuZ2V0SlNPTk9iamVjdChpKS5nZXRTdHJpbmcoRVhURVJOQUxfQVVUSF9ST0xFX0RFU0NSSVBUSU9OKSk7CisJCQkJCXBlcm1zRGV0YWlsTGlzdC5hZGQocGVybURldGFpbHMpOworCQkJCX0gZWxzZSB7CisJCQkJCXBlcm1EZXRhaWxzID0gbmV3IEV4dGVybmFsQWNjZXNzUGVybXNEZXRhaWwoZXh0UGVybXMuZ2V0SlNPTk9iamVjdChpKS5nZXRTdHJpbmcoInR5cGUiKSwKKwkJCQkJCQlleHRQZXJtcy5nZXRKU09OT2JqZWN0KGkpLmdldFN0cmluZygiaW5zdGFuY2UiKSwKKwkJCQkJCQlleHRQZXJtcy5nZXRKU09OT2JqZWN0KGkpLmdldFN0cmluZygiYWN0aW9uIiksCisJCQkJCQkJZXh0UGVybXMuZ2V0SlNPTk9iamVjdChpKS5nZXRTdHJpbmcoRVhURVJOQUxfQVVUSF9ST0xFX0RFU0NSSVBUSU9OKSk7CisJCQkJCXBlcm1zRGV0YWlsTGlzdC5hZGQocGVybURldGFpbHMpOworCQkJCX0KIAkJCX0KLQkJfQogCi0JCWZpbmFsIE1hcDxTdHJpbmcsIExvbmc+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKLQkJZmluYWwgTWFwPFN0cmluZywgQ2VudHJhbFJvbGVGdW5jdGlvbj4gcm9sZUZ1bmNNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCXBhcmFtcy5wdXQoImFwcElkIiwgYXBwLmdldElkKCkpOwotCQlMaXN0PENlbnRyYWxSb2xlRnVuY3Rpb24+IGFwcEZ1bmN0aW9ucyA9IGRhdGFBY2Nlc3NTZXJ2aWNlLmV4ZWN1dGVOYW1lZFF1ZXJ5KCJnZXRBbGxSb2xlRnVuY3Rpb25zIiwgcGFyYW1zLAotCQkJCW51bGwpOwotCQlpZiAoYXBwRnVuY3Rpb25zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoQ2VudHJhbFJvbGVGdW5jdGlvbiByb2xlRnVuYyA6IGFwcEZ1bmN0aW9ucykgewotCQkJCXJvbGVGdW5jTWFwLnB1dChyb2xlRnVuYy5nZXRDb2RlKCksIHJvbGVGdW5jKTsKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIExvbmc+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIENlbnRyYWxSb2xlRnVuY3Rpb24+IHJvbGVGdW5jTWFwID0gbmV3IEhhc2hNYXA8PigpOworCQkJcGFyYW1zLnB1dChBUFBfSUQsIGFwcC5nZXRJZCgpKTsKKwkJCUxpc3Q8Q2VudHJhbFJvbGVGdW5jdGlvbj4gYXBwRnVuY3Rpb25zID0gZGF0YUFjY2Vzc1NlcnZpY2UuZXhlY3V0ZU5hbWVkUXVlcnkoImdldEFsbFJvbGVGdW5jdGlvbnMiLCBwYXJhbXMsCisJCQkJCW51bGwpOworCQkJaWYgKCFhcHBGdW5jdGlvbnMuaXNFbXB0eSgpKSB7CisJCQkJZm9yIChDZW50cmFsUm9sZUZ1bmN0aW9uIHJvbGVGdW5jIDogYXBwRnVuY3Rpb25zKSB7CisJCQkJCXJvbGVGdW5jTWFwLnB1dChyb2xlRnVuYy5nZXRDb2RlKCksIHJvbGVGdW5jKTsKKwkJCQl9CiAJCQl9Ci0JCX0KLQkJLy8gZGVsZXRlIGFsbCBhcHBsaWNhdGlvbiByb2xlIGZ1bmN0aW9ucwotCQlkYXRhQWNjZXNzU2VydmljZS5kZWxldGVEb21haW5PYmplY3RzKEVQQXBwUm9sZUZ1bmN0aW9uLmNsYXNzLCAiIGFwcF9pZCA9ICIgKyBhcHAuZ2V0SWQoKSwgbnVsbCk7Ci0JCQotCQkvLyBBZGQgaWYgbmV3IGZ1bmN0aW9ucyBhbmQgYXBwIHJvbGUgZnVuY3Rpb25zIHdlcmUgYWRkZWQgaW4gRXh0ZXJuYWxzeXN0ZW0KLQkJZm9yIChFeHRlcm5hbEFjY2Vzc1Blcm1zRGV0YWlsIHBlcm1zRGV0YWlsIDogcGVybXNEZXRhaWxMaXN0KSB7Ci0JCQlpZiAoIXJvbGVGdW5jTWFwLmNvbnRhaW5zS2V5KHBlcm1zRGV0YWlsLmdldEluc3RhbmNlKCkpKSB7Ci0JCQkJQ2VudHJhbFJvbGVGdW5jdGlvbiBhZGRGdW5jdGlvbiA9IG5ldyBDZW50cmFsUm9sZUZ1bmN0aW9uKCk7Ci0JCQkJYWRkRnVuY3Rpb24uc2V0QXBwSWQoYXBwLmdldElkKCkpOwotCQkJCWFkZEZ1bmN0aW9uLnNldENvZGUocGVybXNEZXRhaWwuZ2V0SW5zdGFuY2UoKSk7Ci0JCQkJYWRkRnVuY3Rpb24uc2V0TmFtZShwZXJtc0RldGFpbC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQlkYXRhQWNjZXNzU2VydmljZS5zYXZlRG9tYWluT2JqZWN0KGFkZEZ1bmN0aW9uLCBudWxsKTsKLQkJCX0KKwkJCS8vIGRlbGV0ZSBhbGwgYXBwbGljYXRpb24gcm9sZSBmdW5jdGlvbnMKKwkJCWRhdGFBY2Nlc3NTZXJ2aWNlLmRlbGV0ZURvbWFpbk9iamVjdHMoRVBBcHBSb2xlRnVuY3Rpb24uY2xhc3MsIEFQUF9JRF9FUVVBTFMgKyBhcHAuZ2V0SWQoKSwgbnVsbCk7CisKKwkJCS8vIEFkZCBpZiBuZXcgZnVuY3Rpb25zIGFuZCBhcHAgcm9sZSBmdW5jdGlvbnMgd2VyZSBhZGRlZCBpbiBleHRlcm5hbCBhdXRoIHN5c3RlbQorCQkJZm9yIChFeHRlcm5hbEFjY2Vzc1Blcm1zRGV0YWlsIHBlcm1zRGV0YWlsIDogcGVybXNEZXRhaWxMaXN0KSB7CisJCQkJaWYgKCFyb2xlRnVuY01hcC5jb250YWluc0tleShwZXJtc0RldGFpbC5nZXRJbnN0YW5jZSgpKSkgeworCQkJCQl0cnl7CisJCQkJCUNlbnRyYWxSb2xlRnVuY3Rpb24gYWRkRnVuY3Rpb24gPSBuZXcgQ2VudHJhbFJvbGVGdW5jdGlvbigpOworCQkJCQlhZGRGdW5jdGlvbi5zZXRBcHBJZChhcHAuZ2V0SWQoKSk7CisJCQkJCWFkZEZ1bmN0aW9uLnNldENvZGUocGVybXNEZXRhaWwuZ2V0SW5zdGFuY2UoKSk7CisJCQkJCWFkZEZ1bmN0aW9uLnNldE5hbWUocGVybXNEZXRhaWwuZ2V0RGVzY3JpcHRpb24oKSk7CisJCQkJCWRhdGFBY2Nlc3NTZXJ2aWNlLnNhdmVEb21haW5PYmplY3QoYWRkRnVuY3Rpb24sIG51bGwpOworCQkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKKwkJCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJzeW5jUm9sZUZ1bmN0aW9uRnJvbUV4dGVybmFsQWNjZXNzU3lzdGVtOiBGYWlsZWQgdG8gYWRkIGZ1bmN0aW9uIiwgZSk7CisJCQkJCX0KKwkJCQl9CiAJCQkJTGlzdDxFUFJvbGU+IGVwUm9sZXNMaXN0ID0gbnVsbDsKIAkJCQlMaXN0PFN0cmluZz4gcm9sZXMgPSBwZXJtc0RldGFpbC5nZXRSb2xlcygpOwogCQkJCWlmIChyb2xlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChTdHJpbmcgcm9sZUxpc3QgOiByb2xlcykgewotCQkJCQlpZiAoYXBwLmdldElkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5QT1JUQUxfQVBQX0lEKSkgewotCQkJCQkJZXBSb2xlc0xpc3QgPSBkYXRhQWNjZXNzU2VydmljZS5nZXRMaXN0KEVQUm9sZS5jbGFzcywKLQkJCQkJCQkJIiB3aGVyZSBhcHBfaWQgaXMgbnVsbCAiICsgIiBhbmQgcm9sZV9uYW1lID0gJyIKLQkJCQkJCQkJCQkrIHJvbGVMaXN0LnN1YnN0cmluZyhhcHAuZ2V0TmFtZVNwYWNlKCkubGVuZ3RoKCkgKyAxKS5yZXBsYWNlQWxsKCJfIiwgIiAiKSArIiciLAotCQkJCQkJCQludWxsLCBudWxsKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVwUm9sZXNMaXN0ID0gZGF0YUFjY2Vzc1NlcnZpY2UuZ2V0TGlzdChFUFJvbGUuY2xhc3MsCi0JCQkJCQkJCSIgd2hlcmUgYXBwX2lkID0gIiArIGFwcC5nZXRJZCgpICsgIiBhbmQgcm9sZV9uYW1lID0gJyIKLQkJCQkJCQkJCQkrIHJvbGVMaXN0LnN1YnN0cmluZyhhcHAuZ2V0TmFtZVNwYWNlKCkubGVuZ3RoKCkgKyAxKS5yZXBsYWNlQWxsKCJfIiwgIiAiKSArIiciLAotCQkJCQkJCQludWxsLCBudWxsKTsKLQkJCQkJfQotCQkJCQlpZihlcFJvbGVzTGlzdC5pc0VtcHR5KCkpeworCQkJCQlmb3IgKFN0cmluZyByb2xlTGlzdCA6IHJvbGVzKSB7CiAJCQkJCQlpZiAoYXBwLmdldElkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5QT1JUQUxfQVBQX0lEKSkgewogCQkJCQkJCWVwUm9sZXNMaXN0ID0gZGF0YUFjY2Vzc1NlcnZpY2UuZ2V0TGlzdChFUFJvbGUuY2xhc3MsCiAJCQkJCQkJCQkiIHdoZXJlIGFwcF9pZCBpcyBudWxsICIgKyAiIGFuZCByb2xlX25hbWUgPSAnIgotCQkJCQkJCQkJCQkrIHJvbGVMaXN0LnN1YnN0cmluZyhhcHAuZ2V0TmFtZVNwYWNlKCkubGVuZ3RoKCkgKyAxKQorCQkJCQkJCQkJCQkrIHJvbGVMaXN0LnN1YnN0cmluZyhhcHAuZ2V0TmFtZVNwYWNlKCkubGVuZ3RoKCkgKyAxKS5yZXBsYWNlQWxsKCJfIiwgIiAiKQogCQkJCQkJCQkJCQkrICInIiwKIAkJCQkJCQkJCW51bGwsIG51bGwpOwogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQllcFJvbGVzTGlzdCA9IGRhdGFBY2Nlc3NTZXJ2aWNlLmdldExpc3QoRVBSb2xlLmNsYXNzLAotCQkJCQkJCQkJIiB3aGVyZSBhcHBfaWQgPSAiICsgYXBwLmdldElkKCkgKyAiIGFuZCByb2xlX25hbWUgPSAnIgotCQkJCQkJCQkJCQkrIHJvbGVMaXN0LnN1YnN0cmluZyhhcHAuZ2V0TmFtZVNwYWNlKCkubGVuZ3RoKCkgKyAxKSsiJyIsCisJCQkJCQkJCQlXSEVSRV9BUFBfSURfRVFVQUxTICsgYXBwLmdldElkKCkgKyAiIGFuZCByb2xlX25hbWUgPSAnIgorCQkJCQkJCQkJCQkrIHJvbGVMaXN0LnN1YnN0cmluZyhhcHAuZ2V0TmFtZVNwYWNlKCkubGVuZ3RoKCkgKyAxKS5yZXBsYWNlQWxsKCJfIiwgIiAiKQorCQkJCQkJCQkJCQkrICInIiwKIAkJCQkJCQkJCW51bGwsIG51bGwpOwogCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIHNhdmUgYWxsIGFwcGxpY2F0aW9uIHJvbGUgZnVuY3Rpb25zCi0JCQkJCWlmIChlcFJvbGVzTGlzdC5zaXplKCkgPiAwIHx8ICFlcFJvbGVzTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCUVQQXBwUm9sZUZ1bmN0aW9uIGFkZEFwcFJvbGVGdW5jID0gbmV3IEVQQXBwUm9sZUZ1bmN0aW9uKCk7Ci0JCQkJCQlhZGRBcHBSb2xlRnVuYy5zZXRBcHBJZChhcHAuZ2V0SWQoKSk7Ci0JCQkJCQlhZGRBcHBSb2xlRnVuYy5zZXRDb2RlKHBlcm1zRGV0YWlsLmdldEluc3RhbmNlKCkpOwotCQkJCQkJYWRkQXBwUm9sZUZ1bmMuc2V0Um9sZUlkKGVwUm9sZXNMaXN0LmdldCgwKS5nZXRJZCgpKTsKLQkJCQkJCWRhdGFBY2Nlc3NTZXJ2aWNlLnNhdmVEb21haW5PYmplY3QoYWRkQXBwUm9sZUZ1bmMsIG51bGwpOworCQkJCQkJaWYgKGVwUm9sZXNMaXN0LmlzRW1wdHkoKSkgeworCQkJCQkJCWlmIChhcHAuZ2V0SWQoKS5lcXVhbHMoUG9ydGFsQ29uc3RhbnRzLlBPUlRBTF9BUFBfSUQpKSB7CisJCQkJCQkJCWVwUm9sZXNMaXN0ID0gZGF0YUFjY2Vzc1NlcnZpY2UuZ2V0TGlzdChFUFJvbGUuY2xhc3MsCisJCQkJCQkJCQkJIiB3aGVyZSBhcHBfaWQgaXMgbnVsbCAiICsgIiBhbmQgcm9sZV9uYW1lID0gJyIKKwkJCQkJCQkJCQkJCSsgcm9sZUxpc3Quc3Vic3RyaW5nKGFwcC5nZXROYW1lU3BhY2UoKS5sZW5ndGgoKSArIDEpICsgIiciLAorCQkJCQkJCQkJCW51bGwsIG51bGwpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWVwUm9sZXNMaXN0ID0gZGF0YUFjY2Vzc1NlcnZpY2UuZ2V0TGlzdChFUFJvbGUuY2xhc3MsCisJCQkJCQkJCQkJV0hFUkVfQVBQX0lEX0VRVUFMUyArIGFwcC5nZXRJZCgpICsgIiBhbmQgcm9sZV9uYW1lID0gJyIKKwkJCQkJCQkJCQkJCSsgcm9sZUxpc3Quc3Vic3RyaW5nKGFwcC5nZXROYW1lU3BhY2UoKS5sZW5ndGgoKSArIDEpICsgIiciLAorCQkJCQkJCQkJCW51bGwsIG51bGwpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCS8vIHNhdmUgYWxsIGFwcGxpY2F0aW9uIHJvbGUgZnVuY3Rpb25zCisJCQkJCQlpZiAoIWVwUm9sZXNMaXN0LmlzRW1wdHkoKSkgeworCQkJCQkJCXRyeXsKKwkJCQkJCQlFUEFwcFJvbGVGdW5jdGlvbiBhZGRBcHBSb2xlRnVuYyA9IG5ldyBFUEFwcFJvbGVGdW5jdGlvbigpOworCQkJCQkJCWFkZEFwcFJvbGVGdW5jLnNldEFwcElkKGFwcC5nZXRJZCgpKTsKKwkJCQkJCQlhZGRBcHBSb2xlRnVuYy5zZXRDb2RlKHBlcm1zRGV0YWlsLmdldEluc3RhbmNlKCkpOworCQkJCQkJCWFkZEFwcFJvbGVGdW5jLnNldFJvbGVJZChlcFJvbGVzTGlzdC5nZXQoMCkuZ2V0SWQoKSk7CisJCQkJCQkJZGF0YUFjY2Vzc1NlcnZpY2Uuc2F2ZURvbWFpbk9iamVjdChhZGRBcHBSb2xlRnVuYywgbnVsbCk7CisJCQkJCQkJfSBjYXRjaChFeGNlcHRpb24gZSl7CisJCQkJCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJzeW5jUm9sZUZ1bmN0aW9uRnJvbUV4dGVybmFsQWNjZXNzU3lzdGVtOiBGYWlsZWQgdG8gc2F2ZSBhcHAgcm9sZSBmdW5jdGlvbiAiLCBlKTsKKwkJCQkJCQl9CisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCX0KLQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkZpbmlzaGVkIHN5bmNSb2xlRnVuY3Rpb25Gcm9tRXh0ZXJuYWxBY2Nlc3NTeXN0ZW0iKTsKLQkJfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0JCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiRmFpbGVkIHN5bmNSb2xlRnVuY3Rpb25Gcm9tRXh0ZXJuYWxBY2Nlc3NTeXN0ZW0iLCBlKTsKKwkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJzeW5jUm9sZUZ1bmN0aW9uRnJvbUV4dGVybmFsQWNjZXNzU3lzdGVtOiBGaW5pc2hlZCBzeW5jUm9sZUZ1bmN0aW9uRnJvbUV4dGVybmFsQWNjZXNzU3lzdGVtIik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAic3luY1JvbGVGdW5jdGlvbkZyb21FeHRlcm5hbEFjY2Vzc1N5c3RlbTogRmFpbGVkIHN5bmNSb2xlRnVuY3Rpb25Gcm9tRXh0ZXJuYWxBY2Nlc3NTeXN0ZW0iLCBlKTsKIAogCQl9CiAJfQotCQorCisJQE92ZXJyaWRlCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJcHVibGljIEludGVnZXIgYnVsa1VwbG9hZEZ1bmN0aW9ucyhTdHJpbmcgdWVia2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJRVBBcHAgYXBwID0gZ2V0QXBwKHVlYmtleSkuZ2V0KDApOwpAQCAtMTE5MCwxOCArMTQwOSwxOSBAQAogCQkJCWFkZFJvbGVGdW5jdGlvbkluRXh0ZXJuYWxTeXN0ZW0oY2VuUm9sZUZ1bmMsIGFwcCk7CiAJCQkJZnVuY3Rpb25zQWRkZWQrKzsKIAkJCX0KLQkJfWNhdGNoKEh0dHBDbGllbnRFcnJvckV4Y2VwdGlvbiBlKXsKKwkJfSBjYXRjaChIdHRwQ2xpZW50RXJyb3JFeGNlcHRpb24gZSl7CiAJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiSHR0cENsaWVudEVycm9yRXhjZXB0aW9uIC0gYnVsa1VwbG9hZEZ1bmN0aW9ucyBmYWlsZWQiLCBlKTsKIAkJCUVQTG9nVXRpbC5sb2dFeHRlcm5hbEF1dGhBY2Nlc3NBbGFybShsb2dnZXIsIGUuZ2V0U3RhdHVzQ29kZSgpKTsKLQkJfWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImJ1bGtVcGxvYWRGdW5jdGlvbnMgZmFpbGVkIiwgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImJ1bGtVcGxvYWRGdW5jdGlvbnM6IGZhaWxlZCIsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKIAkJfQogCQlyZXR1cm4gZnVuY3Rpb25zQWRkZWQ7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEludGVnZXIgYnVsa1VwbG9hZFJvbGVzKFN0cmluZyB1ZWJrZXkpIHRocm93cyBFeGNlcHRpb24gewogCQlMaXN0PEVQQXBwPiBhcHAgPSBnZXRBcHAodWVia2V5KTsKLQkJTGlzdDxFUFJvbGU+IHJvbGVzID0gZ2V0QXBwUm9sZXMoYXBwLmdldCgwKS5nZXRJZCgpLCBudWxsKTsKKwkJTGlzdDxFUFJvbGU+IHJvbGVzID0gZ2V0QXBwUm9sZXMoYXBwLmdldCgwKS5nZXRJZCgpKTsKIAkJTGlzdDxDZW50cmFsUm9sZT4gY2VuUm9sZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJZmluYWwgTWFwPFN0cmluZywgTG9uZz4gcGFyYW1zID0gbmV3IEhhc2hNYXA8PigpOwogCQlJbnRlZ2VyIHJvbGVzTGlzdEFkZGVkID0gMDsKQEAgLTEyMTcsNDQgKzE0MzcsNTMgQEAKIAkJCQlyb2xlc0xpc3RBZGRlZCsrOwogCQkJfQogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImJ1bGtVcGxvYWRSb2xlcyBmYWlsZWQiLCBlKTsKKwkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJidWxrVXBsb2FkUm9sZXM6IGZhaWxlZCIsIGUpOwogCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CiAJCX0KIAkJcmV0dXJuIHJvbGVzTGlzdEFkZGVkOwogCX0KLQkKKworCS8qKgorCSAqIEl0IGNyZWF0aW5nIG5ldyByb2xlIGluIGV4dGVybmFsIGF1dGggc3lzdGVtIHdoaWxlIGRvaW5nIGJ1bGsgdXBsb2FkCisJICogCisJICogQHBhcmFtIHJvbGUKKwkgKiBAcGFyYW0gYXBwCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KIAlwcml2YXRlIHZvaWQgYWRkUm9sZUluRXh0ZXJuYWxTeXN0ZW0oUm9sZSByb2xlLCBFUEFwcCBhcHApIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgYWRkUm9sZU5ldyA9IGNyZWF0ZU5ld1JvbGVJbkV4dGVybmFsU3lzdGVtKHJvbGUsIGFwcCk7CisJCVN0cmluZyBhZGRSb2xlTmV3ID0gdXBkYXRlRXhpc3RpbmdSb2xlSW5FeHRlcm5hbFN5c3RlbShyb2xlLCBhcHApOwogCQlIdHRwSGVhZGVycyBoZWFkZXJzID0gRWNvbXBQb3J0YWxVdGlscy5iYXNlNjRlbmNvZGVLZXlGb3JBQUZCYXNpY0F1dGgoKTsKLQkJdHJ5ewotCQlIdHRwRW50aXR5PFN0cmluZz4gZW50aXR5ID0gbmV3IEh0dHBFbnRpdHk8PihhZGRSb2xlTmV3LCBoZWFkZXJzKTsKLQkJdGVtcGxhdGUuZXhjaGFuZ2UoCi0JCQkJU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKSArICJyb2xlIiwKLQkJCQlIdHRwTWV0aG9kLlBPU1QsIGVudGl0eSwgU3RyaW5nLmNsYXNzKTsKLQkJfWNhdGNoKEh0dHBDbGllbnRFcnJvckV4Y2VwdGlvbiBlKXsKKwkJdHJ5IHsKKwkJCUh0dHBFbnRpdHk8U3RyaW5nPiBlbnRpdHkgPSBuZXcgSHR0cEVudGl0eTw+KGFkZFJvbGVOZXcsIGhlYWRlcnMpOworCQkJdGVtcGxhdGUuZXhjaGFuZ2UoCisJCQkJCVN5c3RlbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkVYVEVSTkFMX0NFTlRSQUxfQUNDRVNTX1VSTCkgKyAicm9sZSIsCisJCQkJCUh0dHBNZXRob2QuUE9TVCwgZW50aXR5LCBTdHJpbmcuY2xhc3MpOworCQl9IGNhdGNoKEh0dHBDbGllbnRFcnJvckV4Y2VwdGlvbiBlKXsKIAkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJIdHRwQ2xpZW50RXJyb3JFeGNlcHRpb24gLSBGYWlsZWQgdG8gYWRkUm9sZUluRXh0ZXJuYWxTeXN0ZW0iLCBlKTsKIAkJCUVQTG9nVXRpbC5sb2dFeHRlcm5hbEF1dGhBY2Nlc3NBbGFybShsb2dnZXIsIGUuZ2V0U3RhdHVzQ29kZSgpKTsKLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHNJZ25vcmVDYXNlKCI0MDkgQ29uZmxpY3QiKSkgewotCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJSb2xlIGFscmVhZHkgZXhpdHMgYnV0IGRvZXMgbm90IGJyZWFrIGZ1bmN0aW9uYWxpdHkiKTsKKwkJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiYWRkUm9sZUluRXh0ZXJuYWxTeXN0ZW06IFJvbGUgYWxyZWFkeSBleGl0cyBidXQgZG9lcyBub3QgYnJlYWsgZnVuY3Rpb25hbGl0eSIsIGUpOwogCQkJfSBlbHNlIHsKLQkJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiRmFpbGVkIHRvIGFkZFJvbGVJbkV4dGVybmFsU3lzdGVtIiwgZS5nZXRNZXNzYWdlKCkpOworCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJhZGRSb2xlSW5FeHRlcm5hbFN5c3RlbTogRmFpbGVkIHRvIGFkZFJvbGVJbkV4dGVybmFsU3lzdGVtIiwgZS5nZXRNZXNzYWdlKCkpOwogCQkJfQogCQl9CiAJfQotCQorCisJQE92ZXJyaWRlCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJcHVibGljIEludGVnZXIgYnVsa1VwbG9hZFJvbGVzRnVuY3Rpb25zKFN0cmluZyB1ZWJrZXkpIHRocm93cyBFeGNlcHRpb24gewogCQlFUEFwcCBhcHAgPSBnZXRBcHAodWVia2V5KS5nZXQoMCk7Ci0JCUxpc3Q8RVBSb2xlPiByb2xlcyA9IGdldEFwcFJvbGVzKGFwcC5nZXRJZCgpLCBudWxsKTsKKwkJTGlzdDxFUFJvbGU+IHJvbGVzID0gZ2V0QXBwUm9sZXMoYXBwLmdldElkKCkpOwogCQlmaW5hbCBNYXA8U3RyaW5nLCBMb25nPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAJCUludGVnZXIgcm9sZUZ1bmN0aW9ucyA9IDA7CiAJCXRyeSB7CiAJCQlmb3IgKEVQUm9sZSByb2xlIDogcm9sZXMpIHsKIAkJCQlwYXJhbXMucHV0KCJyb2xlSWQiLCByb2xlLmdldElkKCkpOwotCQkJCUxpc3Q8QnVsa1VwbG9hZFJvbGVGdW5jdGlvbj4gYXBwUm9sZUZ1bmMgPSBkYXRhQWNjZXNzU2VydmljZS5leGVjdXRlTmFtZWRRdWVyeSgidXBsb2FkQWxsUm9sZUZ1bmN0aW9ucyIsIHBhcmFtcywgbnVsbCk7Ci0JCQkJaWYoIWFwcFJvbGVGdW5jLmlzRW1wdHkoKSl7Ci0JCQkJCWZvcihCdWxrVXBsb2FkUm9sZUZ1bmN0aW9uIGFkZFJvbGVGdW5jIDogYXBwUm9sZUZ1bmMpeworCQkJCUxpc3Q8QnVsa1VwbG9hZFJvbGVGdW5jdGlvbj4gYXBwUm9sZUZ1bmMgPSBkYXRhQWNjZXNzU2VydmljZS5leGVjdXRlTmFtZWRRdWVyeSgidXBsb2FkQWxsUm9sZUZ1bmN0aW9ucyIsCisJCQkJCQlwYXJhbXMsIG51bGwpOworCQkJCWlmICghYXBwUm9sZUZ1bmMuaXNFbXB0eSgpKSB7CisJCQkJCWZvciAoQnVsa1VwbG9hZFJvbGVGdW5jdGlvbiBhZGRSb2xlRnVuYyA6IGFwcFJvbGVGdW5jKSB7CiAJCQkJCQlhZGRSb2xlRnVuY3Rpb25zSW5FeHRlcm5hbFN5c3RlbShhZGRSb2xlRnVuYywgcm9sZSwgYXBwKTsKIAkJCQkJCXJvbGVGdW5jdGlvbnMrKzsKIAkJCQkJfQpAQCAtMTI2NCwzNCArMTQ5Myw0NCBAQAogCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgIkh0dHBDbGllbnRFcnJvckV4Y2VwdGlvbiAtIEZhaWxlZCB0byBidWxrVXBsb2FkUm9sZXNGdW5jdGlvbnMiLCBlKTsKIAkJCUVQTG9nVXRpbC5sb2dFeHRlcm5hbEF1dGhBY2Nlc3NBbGFybShsb2dnZXIsIGUuZ2V0U3RhdHVzQ29kZSgpKTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJidWxrVXBsb2FkUm9sZXNGdW5jdGlvbnMgZmFpbGVkIiwgZSk7CisJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiYnVsa1VwbG9hZFJvbGVzRnVuY3Rpb25zOiBmYWlsZWQiLCBlKTsKIAkJfQogCQlyZXR1cm4gcm9sZUZ1bmN0aW9uczsKIAl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUm9sZUZ1bmN0aW9uc0luRXh0ZXJuYWxTeXN0ZW0oQnVsa1VwbG9hZFJvbGVGdW5jdGlvbiBhZGRSb2xlRnVuYywgRVBSb2xlIHJvbGUsIEVQQXBwIGFwcCl7Ci0JCQlTdHJpbmcgY2hlY2tUeXBlID0gYWRkUm9sZUZ1bmMuZ2V0RnVuY3Rpb25DZCgpLmNvbnRhaW5zKCJtZW51IikgPyAibWVudSIgOiAidXJsIjsKLQkJCUV4dGVybmFsQWNjZXNzUm9sZVBlcm1zIGV4dFJvbGVQZXJtcyA9IG51bGw7Ci0JCQlFeHRlcm5hbEFjY2Vzc1Blcm1zIGV4dFBlcm1zID0gbnVsbDsKLQkJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7Ci0JCQl0cnl7CisJCisJLyoqCisJICogSXRzIGFkZGluZyBhIHJvbGUgZnVuY3Rpb24gd2hpbGUgZG9pbmcgYnVsayB1cGxvYWQKKwkgKiAKKwkgKiBAcGFyYW0gYWRkUm9sZUZ1bmMKKwkgKiBAcGFyYW0gcm9sZQorCSAqIEBwYXJhbSBhcHAKKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRkUm9sZUZ1bmN0aW9uc0luRXh0ZXJuYWxTeXN0ZW0oQnVsa1VwbG9hZFJvbGVGdW5jdGlvbiBhZGRSb2xlRnVuYywgRVBSb2xlIHJvbGUsIEVQQXBwIGFwcCkgeworCQlTdHJpbmcgY2hlY2tUeXBlID0gYWRkUm9sZUZ1bmMuZ2V0RnVuY3Rpb25DZCgpLmNvbnRhaW5zKCJtZW51IikgPyAibWVudSIgOiAidXJsIjsKKwkJRXh0ZXJuYWxBY2Nlc3NSb2xlUGVybXMgZXh0Um9sZVBlcm1zID0gbnVsbDsKKwkJRXh0ZXJuYWxBY2Nlc3NQZXJtcyBleHRQZXJtcyA9IG51bGw7CisJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisJCXRyeSB7CiAJCQlIdHRwSGVhZGVycyBoZWFkZXJzID0gRWNvbXBQb3J0YWxVdGlscy5iYXNlNjRlbmNvZGVLZXlGb3JBQUZCYXNpY0F1dGgoKTsKIAotCQkJZXh0UGVybXMgPSBuZXcgRXh0ZXJuYWxBY2Nlc3NQZXJtcyhhcHAuZ2V0TmFtZVNwYWNlKCkgKyAiLiIgKyBjaGVja1R5cGUsIGFkZFJvbGVGdW5jLmdldEZ1bmN0aW9uQ2QoKSwgIioiLCBhZGRSb2xlRnVuYy5nZXRGdW5jdGlvbk5hbWUoKSk7CisJCQlleHRQZXJtcyA9IG5ldyBFeHRlcm5hbEFjY2Vzc1Blcm1zKGFwcC5nZXROYW1lU3BhY2UoKSArICIuIiArIGNoZWNrVHlwZSwgYWRkUm9sZUZ1bmMuZ2V0RnVuY3Rpb25DZCgpLCAiKiIsCisJCQkJCWFkZFJvbGVGdW5jLmdldEZ1bmN0aW9uTmFtZSgpKTsKIAkJCWV4dFJvbGVQZXJtcyA9IG5ldyBFeHRlcm5hbEFjY2Vzc1JvbGVQZXJtcyhleHRQZXJtcywKIAkJCQkJYXBwLmdldE5hbWVTcGFjZSgpICsgIi4iICsgcm9sZS5nZXROYW1lKCkucmVwbGFjZUFsbCgiICIsICJfIikpOwogCQkJU3RyaW5nIHVwZGF0ZVJvbGVQZXJtcyA9IG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoZXh0Um9sZVBlcm1zKTsKIAkJCUh0dHBFbnRpdHk8U3RyaW5nPiBlbnRpdHkgPSBuZXcgSHR0cEVudGl0eTw+KHVwZGF0ZVJvbGVQZXJtcywgaGVhZGVycyk7Ci0JCQl0ZW1wbGF0ZQotCQkJCQkuZXhjaGFuZ2UoU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKQotCQkJCQkJCSsgInJvbGUvcGVybSIsIEh0dHBNZXRob2QuUE9TVCwgZW50aXR5LCBTdHJpbmcuY2xhc3MpOwotCQkJfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0JCQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmVxdWFsc0lnbm9yZUNhc2UoIjQwOSBDb25mbGljdCIpKSB7Ci0JCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJSb2xlRnVuY3Rpb24gYWxyZWFkeSBleGl0cyBidXQgZG9lcyBub3QgYnJlYWsgZnVuY3Rpb25hbGl0eSIsZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgIkZhaWxlZCB0byBhZGRSb2xlRnVuY3Rpb25zSW5FeHRlcm5hbFN5c3RlbSIsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQl9CisJCQl0ZW1wbGF0ZS5leGNoYW5nZSgKKwkJCQkJU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKSArICJyb2xlL3Blcm0iLAorCQkJCQlIdHRwTWV0aG9kLlBPU1QsIGVudGl0eSwgU3RyaW5nLmNsYXNzKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHNJZ25vcmVDYXNlKCI0MDkgQ29uZmxpY3QiKSkgeworCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsCisJCQkJCQkiYWRkUm9sZUZ1bmN0aW9uc0luRXh0ZXJuYWxTeXN0ZW06IFJvbGVGdW5jdGlvbiBhbHJlYWR5IGV4aXRzIGJ1dCBkb2VzIG5vdCBicmVhayBmdW5jdGlvbmFsaXR5IiwgZSk7CisJCQl9IGVsc2UgeworCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJhZGRSb2xlRnVuY3Rpb25zSW5FeHRlcm5hbFN5c3RlbTogRmFpbGVkIHRvIGFkZFJvbGVGdW5jdGlvbnNJbkV4dGVybmFsU3lzdGVtIiwKKwkJCQkJCWUuZ2V0TWVzc2FnZSgpKTsKIAkJCX0KKwkJfQogCX0KIAogCUBPdmVycmlkZQpAQCAtMTM0NywxNDMgKzE1ODYsMTQzIEBACiAJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHNJZ25vcmVDYXNlKCI0MDkgQ29uZmxpY3QiKSkgewogCQkJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLAotCQkJCQkJCSJSb2xlRnVuY3Rpb24gYWxyZWFkeSBleGl0cyBidXQgZG9lcyBub3QgYnJlYWsgZnVuY3Rpb25hbGl0eSIpOworCQkJCQkJCSJidWxrVXBsb2FkUGFydG5lclJvbGVGdW5jdGlvbnM6IFJvbGVGdW5jdGlvbiBhbHJlYWR5IGV4aXRzIGJ1dCBkb2VzIG5vdCBicmVhayBmdW5jdGlvbmFsaXR5Iik7CiAJCQkJfSBlbHNlIHsKLQkJCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgIkZhaWxlZCB0byBhZGRSb2xlRnVuY3Rpb25zSW5FeHRlcm5hbFN5c3RlbSIsCisJCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJidWxrVXBsb2FkUGFydG5lclJvbGVGdW5jdGlvbnM6IEZhaWxlZCB0byBhZGRSb2xlRnVuY3Rpb25zSW5FeHRlcm5hbFN5c3RlbSIsCiAJCQkJCQkJZS5nZXRNZXNzYWdlKCkpOwogCQkJCX0KIAkJCX0KIAogCQl9CiAJfQotCQorCisJQE92ZXJyaWRlCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJQFRyYW5zYWN0aW9uYWwKLQlwdWJsaWMgdm9pZCBTeW5jQXBwbGljYXRpb25Sb2xlc1dpdGhFY29tcERCKEVQQXBwIGFwcCl7Ci0JCXRyeXsKLQkJUmVzcG9uc2VFbnRpdHk8U3RyaW5nPiByZXNwb25zZSA9IG51bGw7Ci0JCUxpc3Q8RVBSb2xlPiBmaW5hbFJvbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0JCUV4dGVybmFsUm9sZURlc2NyaXB0aW9uIEFwcGxpY2F0aW9uUm9sZSA9IG5ldyBFeHRlcm5hbFJvbGVEZXNjcmlwdGlvbigpOwotCQlFeHRlcm5hbEFjY2Vzc1Blcm1zIGV4dGVybmFsQWNjZXNzUGVybXMgPSBudWxsOwotCQlMaXN0PFN0cmluZz4gZnVuY3Rpb25Db2RlbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQlMaXN0PEV4dGVybmFsUm9sZURldGFpbHM+IGV4dGVybmFsUm9sZURldGFpbHNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0JCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7Ci0JCUh0dHBIZWFkZXJzIGhlYWRlcnMgPSBFY29tcFBvcnRhbFV0aWxzLmJhc2U2NGVuY29kZUtleUZvckFBRkJhc2ljQXV0aCgpOwotCQlIdHRwRW50aXR5PFN0cmluZz4gZW50aXR5ID0gbmV3IEh0dHBFbnRpdHk8PihoZWFkZXJzKTsKLQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkNvbm5lY3RpbmcgdG8gRXh0ZXJuYWwgQWNjZXNzIHN5c3RlbSIpOwotCQlyZXNwb25zZSA9IHRlbXBsYXRlLmV4Y2hhbmdlKFN5c3RlbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkVYVEVSTkFMX0NFTlRSQUxfQUNDRVNTX1VSTCkKLQkJCQkrICJyb2xlcy9ucy8iICsgYXBwLmdldE5hbWVTcGFjZSgpLCBIdHRwTWV0aG9kLkdFVCwgZW50aXR5LCBTdHJpbmcuY2xhc3MpOwotCQlTdHJpbmcgcmVzID0gcmVzcG9uc2UuZ2V0Qm9keSgpOwotCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiQ29ubmVjdGVkIHRvIEV4dGVybmFsIEFjY2VzcyBzeXN0ZW0gYW5kIHRoZSByZXN1bHQgaXMgOiIsIHJlcyk7Ci0JCUpTT05PYmplY3QganNvbk9iaiA9IG5ldyBKU09OT2JqZWN0KHJlcyk7Ci0JCUpTT05BcnJheSBleHRSb2xlID0ganNvbk9iai5nZXRKU09OQXJyYXkoInJvbGUiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRSb2xlLmxlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChleHRSb2xlLmdldEpTT05PYmplY3QoaSkuZ2V0U3RyaW5nKCJuYW1lIikuZXF1YWxzKGFwcC5nZXROYW1lU3BhY2UoKSArICIuYWRtaW4iKQotCQkJCQl8fCBleHRSb2xlLmdldEpTT05PYmplY3QoaSkuZ2V0U3RyaW5nKCJuYW1lIikuZXF1YWxzKGFwcC5nZXROYW1lU3BhY2UoKSArICIub3duZXIiKQotCQkJCQkpIHsKLQkJCQlleHRSb2xlLnJlbW92ZShpKTsKLQkJCQlpLS07CisJcHVibGljIHZvaWQgc3luY0FwcGxpY2F0aW9uUm9sZXNXaXRoRWNvbXBEQihFUEFwcCBhcHApIHsKKwkJdHJ5IHsKKwkJCVJlc3BvbnNlRW50aXR5PFN0cmluZz4gcmVzcG9uc2UgPSBudWxsOworCQkJTGlzdDxFUFJvbGU+IGZpbmFsUm9sZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCUV4dGVybmFsUm9sZURlc2NyaXB0aW9uIEFwcGxpY2F0aW9uUm9sZSA9IG5ldyBFeHRlcm5hbFJvbGVEZXNjcmlwdGlvbigpOworCQkJRXh0ZXJuYWxBY2Nlc3NQZXJtcyBleHRlcm5hbEFjY2Vzc1Blcm1zID0gbnVsbDsKKwkJCUxpc3Q8U3RyaW5nPiBmdW5jdGlvbkNvZGVsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlMaXN0PEV4dGVybmFsUm9sZURldGFpbHM+IGV4dGVybmFsUm9sZURldGFpbHNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworCQkJSHR0cEhlYWRlcnMgaGVhZGVycyA9IEVjb21wUG9ydGFsVXRpbHMuYmFzZTY0ZW5jb2RlS2V5Rm9yQUFGQmFzaWNBdXRoKCk7CisJCQlIdHRwRW50aXR5PFN0cmluZz4gZW50aXR5ID0gbmV3IEh0dHBFbnRpdHk8PihoZWFkZXJzKTsKKwkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJzeW5jQXBwbGljYXRpb25Sb2xlc1dpdGhFY29tcERCOiB7fSAiICwgQ09OTkVDVElOR19UT19FWFRFUk5BTF9BVVRIX1NZU1RFTV9MT0dfTUVTU0FHRSk7CisJCQlyZXNwb25zZSA9IHRlbXBsYXRlCisJCQkJCS5leGNoYW5nZShTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VUkwpCisJCQkJCQkJKyAicm9sZXMvbnMvIiArIGFwcC5nZXROYW1lU3BhY2UoKSwgSHR0cE1ldGhvZC5HRVQsIGVudGl0eSwgU3RyaW5nLmNsYXNzKTsKKwkJCVN0cmluZyByZXMgPSByZXNwb25zZS5nZXRCb2R5KCk7CisJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAic3luY0FwcGxpY2F0aW9uUm9sZXNXaXRoRWNvbXBEQjogRmluaXNoZWQgR0VUIHJvbGVzIGZyb20gRXh0ZXJuYWwgQXV0aCBzeXN0ZW0gYW5kIHRoZSByZXN1bHQgaXMgOiIsCisJCQkJCXJlcyk7CisJCQlKU09OT2JqZWN0IGpzb25PYmogPSBuZXcgSlNPTk9iamVjdChyZXMpOworCQkJSlNPTkFycmF5IGV4dFJvbGUgPSBqc29uT2JqLmdldEpTT05BcnJheSgicm9sZSIpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRSb2xlLmxlbmd0aCgpOyBpKyspIHsKKwkJCQlpZiAoZXh0Um9sZS5nZXRKU09OT2JqZWN0KGkpLmdldFN0cmluZyhST0xFX05BTUUpLmVxdWFscyhhcHAuZ2V0TmFtZVNwYWNlKCkgKyAiLmFkbWluIikKKwkJCQkJCXx8IGV4dFJvbGUuZ2V0SlNPTk9iamVjdChpKS5nZXRTdHJpbmcoUk9MRV9OQU1FKS5lcXVhbHMoYXBwLmdldE5hbWVTcGFjZSgpICsgIi5vd25lciIpKSB7CisJCQkJCWV4dFJvbGUucmVtb3ZlKGkpOworCQkJCQlpLS07CisJCQkJfQorCQkJCWlmICghYXBwLmdldElkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5QT1JUQUxfQVBQX0lEKSAmJiBleHRSb2xlLmdldEpTT05PYmplY3QoaSkuZ2V0KFJPTEVfTkFNRSkKKwkJCQkJCS5lcXVhbHMoYXBwLmdldE5hbWVTcGFjZSgpICsgIi4iICsgUG9ydGFsQ29uc3RhbnRzLkFETUlOX1JPTEUucmVwbGFjZUFsbCgiICIsICJfIikpKSB7CisJCQkJCWV4dFJvbGUucmVtb3ZlKGkpOworCQkJCQlpLS07CisJCQkJfQogCQkJfQotCQkJaWYoIWFwcC5nZXRJZCgpLmVxdWFscyhQb3J0YWxDb25zdGFudHMuUE9SVEFMX0FQUF9JRCkgJiYgZXh0Um9sZS5nZXRKU09OT2JqZWN0KGkpLmdldCgibmFtZSIpLmVxdWFscyhhcHAuZ2V0TmFtZVNwYWNlKCkrIi4iK1BvcnRhbENvbnN0YW50cy5BRE1JTl9ST0xFLnJlcGxhY2VBbGwoIiAiLCAiXyIpKSl7Ci0JCQkJZXh0Um9sZS5yZW1vdmUoaSk7Ci0JCQkJaS0tOwotCQkJfQotCQl9Ci0JCUxpc3Q8RVBBcHBSb2xlRnVuY3Rpb24+IGFwcGxpY2F0aW9uUm9sZUZ1bmN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dFJvbGUubGVuZ3RoKCk7IGkrKykgewotCQkJRXh0ZXJuYWxSb2xlRGV0YWlscyBleHRlcm5hbFJvbGVEZXRhaWwgPSBuZXcgRXh0ZXJuYWxSb2xlRGV0YWlscygpOwotCQkJRVBBcHBSb2xlRnVuY3Rpb24gZVBBcHBSb2xlRnVuY3Rpb24gPSBuZXcgRVBBcHBSb2xlRnVuY3Rpb24oKTsKLQkJCUpTT05PYmplY3QgUm9sZSA9IChKU09OT2JqZWN0KSBleHRSb2xlLmdldChpKTsKLQkJCWlmKCFleHRSb2xlLmdldEpTT05PYmplY3QoaSkuaGFzKCJkZXNjcmlwdGlvbiIpKQotCQkJewotCQkJCUFwcGxpY2F0aW9uUm9sZS5zZXRBY3RpdmUoInRydWUiKTsKLQkJCQkJQXBwbGljYXRpb25Sb2xlLnNldEFwcElkKCJudWxsIik7Ci0JCQkJQXBwbGljYXRpb25Sb2xlLnNldFByaW9yaXR5KCJudWxsIik7Ci0JCQkJQXBwbGljYXRpb25Sb2xlLnNldEFwcFJvbGVJZCgibnVsbCIpOwotCQkJCVN0cmluZyByb2xlTmFtZSA9ZXh0Um9sZS5nZXRKU09OT2JqZWN0KGkpLmdldFN0cmluZygibmFtZSIpOwotCQkJCUFwcGxpY2F0aW9uUm9sZS5zZXROYW1lKHJvbGVOYW1lLnN1YnN0cmluZyhhcHAuZ2V0TmFtZVNwYWNlKCkubGVuZ3RoKCkrMSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQlTdHJpbmcgZGVzYyA9IGV4dFJvbGUuZ2V0SlNPTk9iamVjdChpKS5nZXRTdHJpbmcoImRlc2NyaXB0aW9uIik7Ci0JCQlBcHBsaWNhdGlvblJvbGUgPSBtYXBwZXIucmVhZFZhbHVlKGRlc2MsIEV4dGVybmFsUm9sZURlc2NyaXB0aW9uLmNsYXNzKTsKLQkJCX0KLQkJCQorCQkJTGlzdDxFUEFwcFJvbGVGdW5jdGlvbj4gYXBwbGljYXRpb25Sb2xlRnVuY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dFJvbGUubGVuZ3RoKCk7IGkrKykgeworCQkJCUV4dGVybmFsUm9sZURldGFpbHMgZXh0ZXJuYWxSb2xlRGV0YWlsID0gbmV3IEV4dGVybmFsUm9sZURldGFpbHMoKTsKKwkJCQlFUEFwcFJvbGVGdW5jdGlvbiBlUEFwcFJvbGVGdW5jdGlvbiA9IG5ldyBFUEFwcFJvbGVGdW5jdGlvbigpOworCQkJCUpTT05PYmplY3QgUm9sZSA9IChKU09OT2JqZWN0KSBleHRSb2xlLmdldChpKTsKKwkJCQlpZiAoIWV4dFJvbGUuZ2V0SlNPTk9iamVjdChpKS5oYXMoRVhURVJOQUxfQVVUSF9ST0xFX0RFU0NSSVBUSU9OKSkgeworCQkJCQlBcHBsaWNhdGlvblJvbGUuc2V0QWN0aXZlKCJ0cnVlIik7CisJCQkJCUFwcGxpY2F0aW9uUm9sZS5zZXRBcHBJZChJU19OVUxMX1NUUklORyk7CisJCQkJCUFwcGxpY2F0aW9uUm9sZS5zZXRQcmlvcml0eShJU19OVUxMX1NUUklORyk7CisJCQkJCUFwcGxpY2F0aW9uUm9sZS5zZXRBcHBSb2xlSWQoSVNfTlVMTF9TVFJJTkcpOworCQkJCQlTdHJpbmcgcm9sZU5hbWUgPSBleHRSb2xlLmdldEpTT05PYmplY3QoaSkuZ2V0U3RyaW5nKFJPTEVfTkFNRSk7CisJCQkJCUFwcGxpY2F0aW9uUm9sZS5zZXROYW1lKHJvbGVOYW1lLnN1YnN0cmluZyhhcHAuZ2V0TmFtZVNwYWNlKCkubGVuZ3RoKCkgKyAxKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJU3RyaW5nIGRlc2MgPSBleHRSb2xlLmdldEpTT05PYmplY3QoaSkuZ2V0U3RyaW5nKEVYVEVSTkFMX0FVVEhfUk9MRV9ERVNDUklQVElPTik7CisJCQkJCUFwcGxpY2F0aW9uUm9sZSA9IG1hcHBlci5yZWFkVmFsdWUoZGVzYywgRXh0ZXJuYWxSb2xlRGVzY3JpcHRpb24uY2xhc3MpOworCQkJCX0KIAotCQkJU29ydGVkU2V0PEV4dGVybmFsQWNjZXNzUGVybXM+IGV4dGVybmFsQWNjZXNzUGVybXNPZlJvbGUgPSBuZXcgVHJlZVNldDw+KCk7Ci0JCQlpZiAoZXh0Um9sZS5nZXRKU09OT2JqZWN0KGkpLmhhcygicGVybXMiKSkgewotCQkJCUpTT05BcnJheSBleHRQZXJtID0gKEpTT05BcnJheSkgUm9sZS5nZXQoInBlcm1zIik7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRQZXJtLmxlbmd0aCgpOyBqKyspIHsKLQkJCQkJSlNPTk9iamVjdCBwZXJtcyA9IGV4dFBlcm0uZ2V0SlNPTk9iamVjdChqKTsKLQkJCQkJZXh0ZXJuYWxBY2Nlc3NQZXJtcyA9IG5ldyBFeHRlcm5hbEFjY2Vzc1Blcm1zKHBlcm1zLmdldFN0cmluZygidHlwZSIpLCBwZXJtcy5nZXRTdHJpbmcoImluc3RhbmNlIiksCi0JCQkJCQkJcGVybXMuZ2V0U3RyaW5nKCJhY3Rpb24iKSk7Ci0JCQkJCWVQQXBwUm9sZUZ1bmN0aW9uLnNldENvZGUoZXh0ZXJuYWxBY2Nlc3NQZXJtcy5nZXRJbnN0YW5jZSgpKTsKLQkJCQkJZnVuY3Rpb25Db2RlbGlzdC5hZGQoZVBBcHBSb2xlRnVuY3Rpb24uZ2V0Q29kZSgpKTsKLQkJCQkJZXh0ZXJuYWxBY2Nlc3NQZXJtc09mUm9sZS5hZGQoZXh0ZXJuYWxBY2Nlc3NQZXJtcyk7CisJCQkJU29ydGVkU2V0PEV4dGVybmFsQWNjZXNzUGVybXM+IGV4dGVybmFsQWNjZXNzUGVybXNPZlJvbGUgPSBuZXcgVHJlZVNldDw+KCk7CisJCQkJaWYgKGV4dFJvbGUuZ2V0SlNPTk9iamVjdChpKS5oYXMoRVhURVJOQUxfQVVUSF9QRVJNUykpIHsKKwkJCQkJSlNPTkFycmF5IGV4dFBlcm0gPSAoSlNPTkFycmF5KSBSb2xlLmdldChFWFRFUk5BTF9BVVRIX1BFUk1TKTsKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRQZXJtLmxlbmd0aCgpOyBqKyspIHsKKwkJCQkJCUpTT05PYmplY3QgcGVybXMgPSBleHRQZXJtLmdldEpTT05PYmplY3Qoaik7CisJCQkJCQlleHRlcm5hbEFjY2Vzc1Blcm1zID0gbmV3IEV4dGVybmFsQWNjZXNzUGVybXMocGVybXMuZ2V0U3RyaW5nKCJ0eXBlIiksCisJCQkJCQkJCXBlcm1zLmdldFN0cmluZygiaW5zdGFuY2UiKSwgcGVybXMuZ2V0U3RyaW5nKCJhY3Rpb24iKSk7CisJCQkJCQllUEFwcFJvbGVGdW5jdGlvbi5zZXRDb2RlKGV4dGVybmFsQWNjZXNzUGVybXMuZ2V0SW5zdGFuY2UoKSk7CisJCQkJCQlmdW5jdGlvbkNvZGVsaXN0LmFkZChlUEFwcFJvbGVGdW5jdGlvbi5nZXRDb2RlKCkpOworCQkJCQkJZXh0ZXJuYWxBY2Nlc3NQZXJtc09mUm9sZS5hZGQoZXh0ZXJuYWxBY2Nlc3NQZXJtcyk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoQXBwbGljYXRpb25Sb2xlLmdldEFjdGl2ZSgpLmVxdWFscyhJU19OVUxMX1NUUklORykpIHsKKwkJCQkJZXh0ZXJuYWxSb2xlRGV0YWlsLnNldEFjdGl2ZShmYWxzZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZXh0ZXJuYWxSb2xlRGV0YWlsLnNldEFjdGl2ZShCb29sZWFuLnBhcnNlQm9vbGVhbihBcHBsaWNhdGlvblJvbGUuZ2V0QWN0aXZlKCkudG9TdHJpbmcoKSkpOworCQkJCX0KKwkJCQlleHRlcm5hbFJvbGVEZXRhaWwuc2V0TmFtZShBcHBsaWNhdGlvblJvbGUuZ2V0TmFtZSgpKTsKKworCQkJCWlmIChBcHBsaWNhdGlvblJvbGUuZ2V0QXBwSWQoKS5lcXVhbHMoSVNfTlVMTF9TVFJJTkcpICYmIGFwcC5nZXRJZCgpID09IDEpIHsKKwkJCQkJZXh0ZXJuYWxSb2xlRGV0YWlsLnNldEFwcElkKG51bGwpOworCQkJCX0gZWxzZSBpZiAoQXBwbGljYXRpb25Sb2xlLmdldEFwcElkKCkuZXF1YWxzKElTX05VTExfU1RSSU5HKSkgeworCQkJCQlleHRlcm5hbFJvbGVEZXRhaWwuc2V0QXBwSWQoYXBwLmdldElkKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCWV4dGVybmFsUm9sZURldGFpbC5zZXRBcHBJZChMb25nLnBhcnNlTG9uZyhBcHBsaWNhdGlvblJvbGUuZ2V0QXBwSWQoKS50b1N0cmluZygpKSk7CisJCQkJfQorCisJCQkJaWYgKEFwcGxpY2F0aW9uUm9sZS5nZXRQcmlvcml0eSgpLmVxdWFscyhJU19OVUxMX1NUUklORykpIHsKKwkJCQkJZXh0ZXJuYWxSb2xlRGV0YWlsLnNldFByaW9yaXR5KG51bGwpOworCQkJCX0gZWxzZSB7CisJCQkJCWV4dGVybmFsUm9sZURldGFpbC5zZXRQcmlvcml0eShJbnRlZ2VyLnBhcnNlSW50KEFwcGxpY2F0aW9uUm9sZS5nZXRQcmlvcml0eSgpLnRvU3RyaW5nKCkpKTsKKwkJCQl9CisKKwkJCQlpZiAoQXBwbGljYXRpb25Sb2xlLmdldEFwcFJvbGVJZCgpLmVxdWFscyhJU19OVUxMX1NUUklORykgJiYgYXBwLmdldElkKCkgPT0gMSkgeworCQkJCQlleHRlcm5hbFJvbGVEZXRhaWwuc2V0QXBwUm9sZUlkKG51bGwpOworCQkJCX0KKworCQkJCWlmICghZXh0ZXJuYWxBY2Nlc3NQZXJtc09mUm9sZS5pc0VtcHR5KCkpIHsKKwkJCQkJZm9yIChFeHRlcm5hbEFjY2Vzc1Blcm1zIGV4dGVybmFscGVybWlzc2lvbiA6IGV4dGVybmFsQWNjZXNzUGVybXNPZlJvbGUpIHsKKwkJCQkJCUVQQXBwUm9sZUZ1bmN0aW9uIGFwUm9sZUZ1bmN0aW9uID0gbmV3IEVQQXBwUm9sZUZ1bmN0aW9uKCk7CisJCQkJCQlhcFJvbGVGdW5jdGlvbi5zZXRBcHBJZChhcHAuZ2V0SWQoKSk7CisJCQkJCQlhcFJvbGVGdW5jdGlvbi5zZXRSb2xlSWQoTG9uZy5wYXJzZUxvbmcoQXBwbGljYXRpb25Sb2xlLmdldElkKCkpKTsKKwkJCQkJCWFwUm9sZUZ1bmN0aW9uLnNldENvZGUoZXh0ZXJuYWxwZXJtaXNzaW9uLmdldEluc3RhbmNlKCkpOworCQkJCQkJYXBwbGljYXRpb25Sb2xlRnVuY3Rpb25MaXN0LmFkZChhcFJvbGVGdW5jdGlvbik7CisJCQkJCX0KKwkJCQl9CisJCQkJZXh0ZXJuYWxSb2xlRGV0YWlsc0xpc3QuYWRkKGV4dGVybmFsUm9sZURldGFpbCk7CisJCQl9CisKKwkJCWZvciAoRXh0ZXJuYWxSb2xlRGV0YWlscyBleHRlcm5hbFJvbGUgOiBleHRlcm5hbFJvbGVEZXRhaWxzTGlzdCkgeworCQkJCUVQUm9sZSBlY29tcFJvbGUgPSBjb252ZXJ0RXh0ZXJuYWxSb2xlRGV0YWlsc3RvRXBSb2xlKGV4dGVybmFsUm9sZSk7CisJCQkJZmluYWxSb2xlTGlzdC5hZGQoZWNvbXBSb2xlKTsKKwkJCX0KKworCQkJTGlzdDxFUFJvbGU+IGFwcGxpY2F0aW9uUm9sZXNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlhcHBsaWNhdGlvblJvbGVzTGlzdCA9IGdldEFwcFJvbGVzKGFwcC5nZXRJZCgpKTsKKwkJCUxpc3Q8U3RyaW5nPiBhcHBsaWNhdGlvblJvbGVJZExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWZvciAoRVBSb2xlIGFwcGxpY2F0aW9uUm9sZSA6IGFwcGxpY2F0aW9uUm9sZXNMaXN0KSB7CisJCQkJYXBwbGljYXRpb25Sb2xlSWRMaXN0LmFkZChhcHBsaWNhdGlvblJvbGUuZ2V0TmFtZSgpKTsKKwkJCX0KKworCQkJTGlzdDxFUFJvbGU+IHJvbGVMaXN0VG9CZUFkZEluRWNvbXBEQiA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJZm9yIChFUFJvbGUgYWFmUm9sZSA6IGZpbmFsUm9sZUxpc3QpIHsKKwkJCQlpZiAoIWFwcGxpY2F0aW9uUm9sZUlkTGlzdC5jb250YWlucyhhYWZSb2xlLmdldE5hbWUoKSkpIHsKKwkJCQkJcm9sZUxpc3RUb0JlQWRkSW5FY29tcERCLmFkZChhYWZSb2xlKTsKIAkJCQl9CiAJCQl9CiAKLQkJCWlmIChBcHBsaWNhdGlvblJvbGUuZ2V0QWN0aXZlKCkuZXF1YWxzKCJudWxsIikpIHsKLQkJCQlleHRlcm5hbFJvbGVEZXRhaWwuc2V0QWN0aXZlKGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXh0ZXJuYWxSb2xlRGV0YWlsLnNldEFjdGl2ZShCb29sZWFuLnBhcnNlQm9vbGVhbihBcHBsaWNhdGlvblJvbGUuZ2V0QWN0aXZlKCkudG9TdHJpbmcoKSkpOworCQkJLy8gQ2hlY2sgaWYgcm9sZXMgZXhpdHMgaW4gZXh0ZXJuYWwgQWNjZXNzIHN5c3RlbSBhbmQgbWFrZSBpdAorCQkJLy8gaW5hY3RpdmUKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIEVQUm9sZT4gY2hlY2tSb2xlc0luYWN0aXZlID0gbmV3IEhhc2hNYXA8PigpOworCQkJZm9yIChFUFJvbGUgZXh0cm9sZSA6IGZpbmFsUm9sZUxpc3QpIHsKKwkJCQljaGVja1JvbGVzSW5hY3RpdmUucHV0KGV4dHJvbGUuZ2V0TmFtZSgpLCBleHRyb2xlKTsKIAkJCX0KLQkJCWV4dGVybmFsUm9sZURldGFpbC5zZXROYW1lKEFwcGxpY2F0aW9uUm9sZS5nZXROYW1lKCkpOwotCi0JCQlpZiAoQXBwbGljYXRpb25Sb2xlLmdldEFwcElkKCkuZXF1YWxzKCJudWxsIikgJiYgYXBwLmdldElkKCkgPT0gMSkgewotCQkJCWV4dGVybmFsUm9sZURldGFpbC5zZXRBcHBJZChudWxsKTsKLQkJCX0gZWxzZSBpZihBcHBsaWNhdGlvblJvbGUuZ2V0QXBwSWQoKS5lcXVhbHMoIm51bGwiKSl7Ci0JCQkJZXh0ZXJuYWxSb2xlRGV0YWlsLnNldEFwcElkKGFwcC5nZXRJZCgpKTsKLQkJCX1lbHNlIHsKLQkJCQlleHRlcm5hbFJvbGVEZXRhaWwuc2V0QXBwSWQoTG9uZy5wYXJzZUxvbmcoQXBwbGljYXRpb25Sb2xlLmdldEFwcElkKCkudG9TdHJpbmcoKSkpOwotCQkJfQotCi0JCQlpZiAoQXBwbGljYXRpb25Sb2xlLmdldFByaW9yaXR5KCkuZXF1YWxzKCJudWxsIikpIHsKLQkJCQlleHRlcm5hbFJvbGVEZXRhaWwuc2V0UHJpb3JpdHkobnVsbCk7Ci0JCQl9IGVsc2UgewotCQkJCWV4dGVybmFsUm9sZURldGFpbC5zZXRQcmlvcml0eShJbnRlZ2VyLnBhcnNlSW50KEFwcGxpY2F0aW9uUm9sZS5nZXRQcmlvcml0eSgpLnRvU3RyaW5nKCkpKTsKLQkJCX0KLQotCQkJaWYgKEFwcGxpY2F0aW9uUm9sZS5nZXRBcHBSb2xlSWQoKS5lcXVhbHMoIm51bGwiKSAmJiBhcHAuZ2V0SWQoKSA9PSAxKSB7Ci0JCQkJZXh0ZXJuYWxSb2xlRGV0YWlsLnNldEFwcFJvbGVJZChudWxsKTsKLQkJCX0KLQotCQkJaWYgKCFleHRlcm5hbEFjY2Vzc1Blcm1zT2ZSb2xlLmlzRW1wdHkoKSB8fCBleHRlcm5hbEFjY2Vzc1Blcm1zT2ZSb2xlLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEV4dGVybmFsQWNjZXNzUGVybXMgZXh0ZXJuYWxwZXJtaXNzaW9uIDogZXh0ZXJuYWxBY2Nlc3NQZXJtc09mUm9sZSkgewotCQkJCQlFUEFwcFJvbGVGdW5jdGlvbiBhcFJvbGVGdW5jdGlvbiA9IG5ldyBFUEFwcFJvbGVGdW5jdGlvbigpOwotCQkJCQlhcFJvbGVGdW5jdGlvbi5zZXRBcHBJZChhcHAuZ2V0SWQoKSk7Ci0JCQkJCWFwUm9sZUZ1bmN0aW9uLnNldFJvbGVJZChMb25nLnBhcnNlTG9uZyhBcHBsaWNhdGlvblJvbGUuZ2V0SWQoKSkpOwotCQkJCQlhcFJvbGVGdW5jdGlvbi5zZXRDb2RlKGV4dGVybmFscGVybWlzc2lvbi5nZXRJbnN0YW5jZSgpKTsKLQkJCQkJYXBwbGljYXRpb25Sb2xlRnVuY3Rpb25MaXN0LmFkZChhcFJvbGVGdW5jdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJZXh0ZXJuYWxSb2xlRGV0YWlsc0xpc3QuYWRkKGV4dGVybmFsUm9sZURldGFpbCk7Ci0JCX0KLQkJCQotCQlmb3IgKEV4dGVybmFsUm9sZURldGFpbHMgZXh0ZXJuYWxSb2xlIDogZXh0ZXJuYWxSb2xlRGV0YWlsc0xpc3QpIHsKLQkJCUVQUm9sZSBlY29tcFJvbGUgPSBuZXcgRVBSb2xlKCk7Ci0JCQllY29tcFJvbGUgPSBjb252ZXJ0RXh0ZXJuYWxSb2xlRGV0YWlsc3RvRXBSb2xlKGV4dGVybmFsUm9sZSk7Ci0JCQlmaW5hbFJvbGVMaXN0LmFkZChlY29tcFJvbGUpOwotCQl9Ci0KLQkJTGlzdDxFUFJvbGU+IGFwcGxpY2F0aW9uUm9sZXNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0JCWFwcGxpY2F0aW9uUm9sZXNMaXN0ID0gZ2V0QXBwUm9sZXMoYXBwLmdldElkKCksIG51bGwpOwotCQlMaXN0PFN0cmluZz4gYXBwbGljYXRpb25Sb2xlSWRMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0JCWZvciAoRVBSb2xlIGFwcGxpY2F0aW9uUm9sZSA6IGFwcGxpY2F0aW9uUm9sZXNMaXN0KSB7Ci0JCQlhcHBsaWNhdGlvblJvbGVJZExpc3QuYWRkKGFwcGxpY2F0aW9uUm9sZS5nZXROYW1lKCkpOwotCQl9Ci0KLQkJTGlzdDxFUFJvbGU+IHJvbGVMaXN0VG9CZUFkZEluRWNvbXBEQiA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQlmb3IgKEVQUm9sZSBhYWZSb2xlIDogZmluYWxSb2xlTGlzdCkgewotCQkJaWYgKCFhcHBsaWNhdGlvblJvbGVJZExpc3QuY29udGFpbnMoYWFmUm9sZS5nZXROYW1lKCkpKSB7Ci0JCQkJcm9sZUxpc3RUb0JlQWRkSW5FY29tcERCLmFkZChhYWZSb2xlKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gQ2hlY2sgaWYgcm9sZXMgZXhpdHMgaW4gZXh0ZXJuYWwgQWNjZXNzIHN5c3RlbSBhbmQgbWFrZSBpdCBpbmFjdGl2ZQotCQlmaW5hbCBNYXA8U3RyaW5nLCBFUFJvbGU+IGNoZWNrUm9sZXNJbmFjdGl2ZSA9IG5ldyBIYXNoTWFwPD4oKTsKLQkJZm9yKEVQUm9sZSBleHRyb2xlIDogZmluYWxSb2xlTGlzdCl7Ci0JCQljaGVja1JvbGVzSW5hY3RpdmUucHV0KGV4dHJvbGUuZ2V0TmFtZSgpLCBleHRyb2xlKTsKLQkJfQogCQkJZm9yIChFUFJvbGUgcm9sZSA6IGFwcGxpY2F0aW9uUm9sZXNMaXN0KSB7CiAJCQkJZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBleHRSb2xlUGFyYW1zID0gbmV3IEhhc2hNYXA8PigpOwogCQkJCUxpc3Q8RVBSb2xlPiByb2xlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwpAQCAtMTQ5MiwxNSArMTczMSwxNSBAQAogCQkJCQlpZiAoYXBwLmdldElkKCkgPT0gMSkgewogCQkJCQkJcm9sZUxpc3QgPSBkYXRhQWNjZXNzU2VydmljZS5leGVjdXRlTmFtZWRRdWVyeSgiZ2V0UG9ydGFsQXBwUm9sZXMiLCBleHRSb2xlUGFyYW1zLCBudWxsKTsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCWV4dFJvbGVQYXJhbXMucHV0KCJhcHBJZCIsIGFwcC5nZXRJZCgpLnRvU3RyaW5nKCkpOworCQkJCQkJZXh0Um9sZVBhcmFtcy5wdXQoQVBQX0lELCBhcHAuZ2V0SWQoKS50b1N0cmluZygpKTsKIAkJCQkJCXJvbGVMaXN0ID0gZGF0YUFjY2Vzc1NlcnZpY2UuZXhlY3V0ZU5hbWVkUXVlcnkoImdldFJvbGV0b1VwZGF0ZUFBRiIsIGV4dFJvbGVQYXJhbXMsIG51bGwpOwogCQkJCQl9CiAJCQkJCUVQUm9sZSB1cGRhdGVSb2xlSW5hY3RpdmUgPSByb2xlTGlzdC5nZXQoMCk7CiAJCQkJCXVwZGF0ZVJvbGVJbmFjdGl2ZS5zZXRBY3RpdmUoZmFsc2UpOwotCQkJCQlkYXRhQWNjZXNzU2VydmljZS5zYXZlRG9tYWluT2JqZWN0KHVwZGF0ZVJvbGVJbmFjdGl2ZSwgbnVsbCk7CQkJCQkKKwkJCQkJZGF0YUFjY2Vzc1NlcnZpY2Uuc2F2ZURvbWFpbk9iamVjdCh1cGRhdGVSb2xlSW5hY3RpdmUsIG51bGwpOwogCQkJCX0KIAkJCX0KLQkJCisKIAkJCWZvciAoRVBSb2xlIHJvbGVJdGVtIDogZmluYWxSb2xlTGlzdCkgewogCQkJCWZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcm9sZVBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAkJCQlMaXN0PEVQUm9sZT4gY3VycmVudExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKQEAgLTE1MDgsNyArMTc0Nyw3IEBACiAJCQkJaWYgKGFwcC5nZXRJZCgpID09IDEpIHsKIAkJCQkJY3VycmVudExpc3QgPSBkYXRhQWNjZXNzU2VydmljZS5leGVjdXRlTmFtZWRRdWVyeSgiZ2V0UG9ydGFsQXBwUm9sZXMiLCByb2xlUGFyYW1zLCBudWxsKTsKIAkJCQl9IGVsc2UgewotCQkJCQlyb2xlUGFyYW1zLnB1dCgiYXBwSWQiLCBhcHAuZ2V0SWQoKS50b1N0cmluZygpKTsKKwkJCQkJcm9sZVBhcmFtcy5wdXQoQVBQX0lELCBhcHAuZ2V0SWQoKS50b1N0cmluZygpKTsKIAkJCQkJY3VycmVudExpc3QgPSBkYXRhQWNjZXNzU2VydmljZS5leGVjdXRlTmFtZWRRdWVyeSgiZ2V0Um9sZXRvVXBkYXRlQUFGIiwgcm9sZVBhcmFtcywgbnVsbCk7CiAJCQkJfQogCkBAIC0xNTMzLDU1ICsxNzcyLDYwIEBACiAJCQkJfQogCQkJfQogCi0JCUVQUm9sZSByb2xlVG9CZUFkZGVkSW5FY29tcERCID0gbmV3IEVQUm9sZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvbGVMaXN0VG9CZUFkZEluRWNvbXBEQi5zaXplKCk7IGkrKykgewotCQkJcm9sZVRvQmVBZGRlZEluRWNvbXBEQiA9IHJvbGVMaXN0VG9CZUFkZEluRWNvbXBEQi5nZXQoaSk7Ci0JCQlpZihhcHAuZ2V0SWQoKSA9PSAxKQotCQkJewotCQkJCXJvbGVUb0JlQWRkZWRJbkVjb21wREIuc2V0QXBwUm9sZUlkKG51bGwpOwotCQkJfQotCQkJZGF0YUFjY2Vzc1NlcnZpY2Uuc2F2ZURvbWFpbk9iamVjdChyb2xlVG9CZUFkZGVkSW5FY29tcERCLCBudWxsKTsKLQkJCUxpc3QgPEVQUm9sZT4gZ2V0Um9sZUNyZWF0ZWRJblN5bmMgPSBudWxsOwotCQkJaWYgKCFhcHAuZ2V0SWQoKS5lcXVhbHMoUG9ydGFsQ29uc3RhbnRzLlBPUlRBTF9BUFBfSUQpKSB7Ci0JCQkJZ2V0Um9sZUNyZWF0ZWRJblN5bmMgPSAgZGF0YUFjY2Vzc1NlcnZpY2UuZ2V0TGlzdChFUFJvbGUuY2xhc3MsCi0JCQkJCQkiIHdoZXJlIHJvbGVfbmFtZSA9ICciICsgcm9sZVRvQmVBZGRlZEluRWNvbXBEQi5nZXROYW1lKCkgKyInIiwgbnVsbCwgbnVsbCk7CQotCQkJCUVQUm9sZSBlcFVwZGF0ZVJvbGUgPSBnZXRSb2xlQ3JlYXRlZEluU3luYy5nZXQoMCk7Ci0JCQkJZXBVcGRhdGVSb2xlLnNldEFwcFJvbGVJZChlcFVwZGF0ZVJvbGUuZ2V0SWQoKSk7Ci0JCQkJZGF0YUFjY2Vzc1NlcnZpY2Uuc2F2ZURvbWFpbk9iamVjdChlcFVwZGF0ZVJvbGUsIG51bGwpOwotCQkJfQotCQkJTGlzdDxFUFJvbGU+IHJvbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0JCQlmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCUVQUm9sZSByb2xlVG9CZUFkZGVkSW5FY29tcERCID0gbmV3IEVQUm9sZSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb2xlTGlzdFRvQmVBZGRJbkVjb21wREIuc2l6ZSgpOyBpKyspIHsKKwkJCQlyb2xlVG9CZUFkZGVkSW5FY29tcERCID0gcm9sZUxpc3RUb0JlQWRkSW5FY29tcERCLmdldChpKTsKKwkJCQlpZiAoYXBwLmdldElkKCkgPT0gMSkgeworCQkJCQlyb2xlVG9CZUFkZGVkSW5FY29tcERCLnNldEFwcFJvbGVJZChudWxsKTsKKwkJCQl9CisJCQkJZGF0YUFjY2Vzc1NlcnZpY2Uuc2F2ZURvbWFpbk9iamVjdChyb2xlVG9CZUFkZGVkSW5FY29tcERCLCBudWxsKTsKKwkJCQlMaXN0PEVQUm9sZT4gZ2V0Um9sZUNyZWF0ZWRJblN5bmMgPSBudWxsOworCQkJCWlmICghYXBwLmdldElkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5QT1JUQUxfQVBQX0lEKSkgeworCQkJCQlnZXRSb2xlQ3JlYXRlZEluU3luYyA9IGRhdGFBY2Nlc3NTZXJ2aWNlLmdldExpc3QoRVBSb2xlLmNsYXNzLAorCQkJCQkJCVdIRVJFX1JPTEVfTkFNRV9FUVVBTFMgKyByb2xlVG9CZUFkZGVkSW5FY29tcERCLmdldE5hbWUoKSArICInIiwgbnVsbCwgbnVsbCk7CisJCQkJCUVQUm9sZSBlcFVwZGF0ZVJvbGUgPSBnZXRSb2xlQ3JlYXRlZEluU3luYy5nZXQoMCk7CisJCQkJCWVwVXBkYXRlUm9sZS5zZXRBcHBSb2xlSWQoZXBVcGRhdGVSb2xlLmdldElkKCkpOworCQkJCQlkYXRhQWNjZXNzU2VydmljZS5zYXZlRG9tYWluT2JqZWN0KGVwVXBkYXRlUm9sZSwgbnVsbCk7CisJCQkJfQorCQkJCUxpc3Q8RVBSb2xlPiByb2xlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJCWZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gbmV3IEhhc2hNYXA8PigpOwogCi0JCQlwYXJhbXMucHV0KCJhcHBSb2xlTmFtZSIsIHJvbGVUb0JlQWRkZWRJbkVjb21wREIuZ2V0TmFtZSgpKTsKLQkJCWlmIChhcHAuZ2V0SWQoKSA9PSAxKSB7Ci0JCQkJcm9sZUxpc3QgPSBkYXRhQWNjZXNzU2VydmljZS5leGVjdXRlTmFtZWRRdWVyeSgiZ2V0UG9ydGFsQXBwUm9sZXMiLCBwYXJhbXMsIG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlwYXJhbXMucHV0KCJhcHBJZCIsIGFwcC5nZXRJZCgpLnRvU3RyaW5nKCkpOwotCQkJCXJvbGVMaXN0ID0gZGF0YUFjY2Vzc1NlcnZpY2UuZXhlY3V0ZU5hbWVkUXVlcnkoImdldFJvbGV0b1VwZGF0ZUFBRiIsIHBhcmFtcywgbnVsbCk7CisJCQkJcGFyYW1zLnB1dCgiYXBwUm9sZU5hbWUiLCByb2xlVG9CZUFkZGVkSW5FY29tcERCLmdldE5hbWUoKSk7CisJCQkJaWYgKGFwcC5nZXRJZCgpID09IDEpIHsKKwkJCQkJcm9sZUxpc3QgPSBkYXRhQWNjZXNzU2VydmljZS5leGVjdXRlTmFtZWRRdWVyeSgiZ2V0UG9ydGFsQXBwUm9sZXMiLCBwYXJhbXMsIG51bGwpOworCQkJCX0gZWxzZSB7CisJCQkJCXBhcmFtcy5wdXQoQVBQX0lELCBhcHAuZ2V0SWQoKS50b1N0cmluZygpKTsKKwkJCQkJcm9sZUxpc3QgPSBkYXRhQWNjZXNzU2VydmljZS5leGVjdXRlTmFtZWRRdWVyeSgiZ2V0Um9sZXRvVXBkYXRlQUFGIiwgcGFyYW1zLCBudWxsKTsKKwkJCQl9CisJCQkJRVBSb2xlIHJvbGUgPSByb2xlTGlzdC5nZXQoMCk7CisJCQkJUm9sZSBhYUZyb2xlID0gbmV3IFJvbGUoKTsKKwkJCQlhYUZyb2xlLnNldElkKHJvbGUuZ2V0SWQoKSk7CisJCQkJYWFGcm9sZS5zZXRBY3RpdmUocm9sZS5nZXRBY3RpdmUoKSk7CisJCQkJYWFGcm9sZS5zZXRQcmlvcml0eShyb2xlLmdldFByaW9yaXR5KCkpOworCQkJCWFhRnJvbGUuc2V0TmFtZShyb2xlLmdldE5hbWUoKSk7CisJCQkJdXBkYXRlUm9sZUluRXh0ZXJuYWxTeXN0ZW0oYWFGcm9sZSwgYXBwKTsKIAkJCX0KLQkJCUVQUm9sZSByb2xlID0gcm9sZUxpc3QuZ2V0KDApOwotCQkJUm9sZSBhYUZyb2xlID0gbmV3IFJvbGUoKTsKLQkJCWFhRnJvbGUuc2V0SWQocm9sZS5nZXRJZCgpKTsKLQkJCWFhRnJvbGUuc2V0QWN0aXZlKHJvbGUuZ2V0QWN0aXZlKCkpOwotCQkJYWFGcm9sZS5zZXRQcmlvcml0eShyb2xlLmdldFByaW9yaXR5KCkpOwotCQkJYWFGcm9sZS5zZXROYW1lKHJvbGUuZ2V0TmFtZSgpKTsKLQkJCXVwZGF0ZVJvbGVJbkV4dGVybmFsU3lzdGVtKGFhRnJvbGUsIGFwcCk7Ci0JCSB9Ci0JCQlkYXRhQWNjZXNzU2VydmljZS5kZWxldGVEb21haW5PYmplY3RzKEVQQXBwUm9sZUZ1bmN0aW9uLmNsYXNzLCAiIGFwcF9pZCA9ICIgKyBhcHAuZ2V0SWQoKSwgbnVsbCk7CisJCQlkYXRhQWNjZXNzU2VydmljZS5kZWxldGVEb21haW5PYmplY3RzKEVQQXBwUm9sZUZ1bmN0aW9uLmNsYXNzLCBBUFBfSURfRVFVQUxTICsgYXBwLmdldElkKCksIG51bGwpOwogCQkJZm9yIChFUEFwcFJvbGVGdW5jdGlvbiByb2xlZnVuIDogYXBwbGljYXRpb25Sb2xlRnVuY3Rpb25MaXN0KSB7CiAJCQkJZGF0YUFjY2Vzc1NlcnZpY2Uuc2F2ZURvbWFpbk9iamVjdChyb2xlZnVuLCBudWxsKTsKIAkJCX0KLQkJCi0JCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJGaW5pc2hlZCBTeW5jQXBwbGljYXRpb25Sb2xlc1dpdGhFY29tcERCIik7Ci0JCX1jYXRjaChIdHRwQ2xpZW50RXJyb3JFeGNlcHRpb24gZSl7CisJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAic3luY0FwcGxpY2F0aW9uUm9sZXNXaXRoRWNvbXBEQjogRmluaXNoZWQiKTsKKwkJfSBjYXRjaChIdHRwQ2xpZW50RXJyb3JFeGNlcHRpb24gZSl7CiAJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiRmFpbGVkIHRvIFN5bmNBcHBsaWNhdGlvblJvbGVzV2l0aEVjb21wREIiLCBlKTsKIAkJCUVQTG9nVXRpbC5sb2dFeHRlcm5hbEF1dGhBY2Nlc3NBbGFybShsb2dnZXIsIGUuZ2V0U3RhdHVzQ29kZSgpKTsKLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJGYWlsZWQgdG8gU3luY0FwcGxpY2F0aW9uUm9sZXNXaXRoRWNvbXBEQiIsIGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgInN5bmNBcHBsaWNhdGlvblJvbGVzV2l0aEVjb21wREI6IEZhaWxlZCAiLCBlKTsKIAkJfQogCX0KIAotCXB1YmxpYyBFUFJvbGUgY29udmVydEV4dGVybmFsUm9sZURldGFpbHN0b0VwUm9sZShFeHRlcm5hbFJvbGVEZXRhaWxzIGV4dGVybmFsUm9sZURldGFpbHMpIHsKKwkvKioKKwkgKiAKKwkgKiBJdCBjb252ZXJ0cyBmcm9tIEV4dGVybmFsUm9sZURldGFpbHMuY2xhc3Mgb2JqZWN0IHRvIEVQUm9sZS5jbGFzcyBvYmplY3QKKwkgKiAKKwkgKiBAcGFyYW0gZXh0ZXJuYWxSb2xlRGV0YWlscworCSAqIEByZXR1cm4gRVBSb2xlIG9iamVjdAorCSAqLworCXByaXZhdGUgRVBSb2xlIGNvbnZlcnRFeHRlcm5hbFJvbGVEZXRhaWxzdG9FcFJvbGUoRXh0ZXJuYWxSb2xlRGV0YWlscyBleHRlcm5hbFJvbGVEZXRhaWxzKSB7CiAJCUVQUm9sZSByb2xlID0gbmV3IEVQUm9sZSgpOwogCQlyb2xlLnNldEFjdGl2ZShleHRlcm5hbFJvbGVEZXRhaWxzLmlzQWN0aXZlKCkpOwogCQlyb2xlLnNldEFwcElkKGV4dGVybmFsUm9sZURldGFpbHMuZ2V0QXBwSWQoKSk7CkBAIC0xNjA5LDEwNSArMTg1MywxMTUgQEAKIAkJcmV0dXJuIHVzZXJSb2xlc0FkZGVkOwogCX0KIAotCXByaXZhdGUgdm9pZCBhZGRVc2VyUm9sZUluRXh0ZXJuYWxTeXN0ZW0oQnVsa1VwbG9hZFVzZXJSb2xlcyB1c2VyUm9sZXNVcGxvYWQpewotCQl0cnl7Ci0JCVN0cmluZyBuYW1lID0gIiI7Ci0JCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7Ci0JCWlmIChFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuY29udGFpbnNQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVNFUl9ET01BSU4pKSB7Ci0JCQluYW1lID0gdXNlclJvbGVzVXBsb2FkLmdldE9yZ1VzZXJJZCgpCi0JCQkJCSsgU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVNFUl9ET01BSU4pOwotCQl9Ci0JCUV4dGVybmFsQWNjZXNzVXNlciBleHRVc2VyID0gbmV3IEV4dGVybmFsQWNjZXNzVXNlcihuYW1lLAotCQkJCXVzZXJSb2xlc1VwbG9hZC5nZXRBcHBOYW1lU3BhY2UoKSArICIuIiArIHVzZXJSb2xlc1VwbG9hZC5nZXRSb2xlTmFtZSgpLnJlcGxhY2VBbGwoIiAiLCAiXyIpKTsKLQkJU3RyaW5nIHVzZXJSb2xlID0gbWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZyhleHRVc2VyKTsKLQkJSHR0cEhlYWRlcnMgaGVhZGVycyA9IEVjb21wUG9ydGFsVXRpbHMuYmFzZTY0ZW5jb2RlS2V5Rm9yQUFGQmFzaWNBdXRoKCk7Ci0JCUh0dHBFbnRpdHk8U3RyaW5nPiBlbnRpdHkgPSBuZXcgSHR0cEVudGl0eTw+KHVzZXJSb2xlLCBoZWFkZXJzKTsKLQkJdGVtcGxhdGUuZXhjaGFuZ2UoCi0JCQkJU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKSArICJ1c2VyUm9sZSIsCi0JCQkJSHR0cE1ldGhvZC5QT1NULCBlbnRpdHksIFN0cmluZy5jbGFzcyk7Ci0JCX1jYXRjaChIdHRwQ2xpZW50RXJyb3JFeGNlcHRpb24gZSl7CisJLyoqCisJICogSXRzIGFkZGluZyBhIHVzZXIgcm9sZSBpbiBleHRlcm5hbCBhdXRoIHN5c3RlbSB3aGlsZSBkb2luZyBidWxrIHVwbG9hZCAKKwkgKiAKKwkgKiBAcGFyYW0gdXNlclJvbGVzVXBsb2FkCisJICovCisJcHJpdmF0ZSB2b2lkIGFkZFVzZXJSb2xlSW5FeHRlcm5hbFN5c3RlbShCdWxrVXBsb2FkVXNlclJvbGVzIHVzZXJSb2xlc1VwbG9hZCkgeworCQl0cnkgeworCQkJU3RyaW5nIG5hbWUgPSAiIjsKKwkJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisJCQlpZiAoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzCisJCQkJCS5jb250YWluc1Byb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VU0VSX0RPTUFJTikpIHsKKwkJCQluYW1lID0gdXNlclJvbGVzVXBsb2FkLmdldE9yZ1VzZXJJZCgpCisJCQkJCQkrIFN5c3RlbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkVYVEVSTkFMX0NFTlRSQUxfQUNDRVNTX1VTRVJfRE9NQUlOKTsKKwkJCX0KKwkJCUV4dGVybmFsQWNjZXNzVXNlciBleHRVc2VyID0gbmV3IEV4dGVybmFsQWNjZXNzVXNlcihuYW1lLAorCQkJCQl1c2VyUm9sZXNVcGxvYWQuZ2V0QXBwTmFtZVNwYWNlKCkgKyAiLiIgKyB1c2VyUm9sZXNVcGxvYWQuZ2V0Um9sZU5hbWUoKS5yZXBsYWNlQWxsKCIgIiwgIl8iKSk7CisJCQlTdHJpbmcgdXNlclJvbGUgPSBtYXBwZXIud3JpdGVWYWx1ZUFzU3RyaW5nKGV4dFVzZXIpOworCQkJSHR0cEhlYWRlcnMgaGVhZGVycyA9IEVjb21wUG9ydGFsVXRpbHMuYmFzZTY0ZW5jb2RlS2V5Rm9yQUFGQmFzaWNBdXRoKCk7CisJCQlIdHRwRW50aXR5PFN0cmluZz4gZW50aXR5ID0gbmV3IEh0dHBFbnRpdHk8Pih1c2VyUm9sZSwgaGVhZGVycyk7CisJCQl0ZW1wbGF0ZS5leGNoYW5nZSgKKwkJCQkJU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKSArICJ1c2VyUm9sZSIsCisJCQkJCUh0dHBNZXRob2QuUE9TVCwgZW50aXR5LCBTdHJpbmcuY2xhc3MpOworCQl9IGNhdGNoKEh0dHBDbGllbnRFcnJvckV4Y2VwdGlvbiBlKXsKIAkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJIdHRwQ2xpZW50RXJyb3JFeGNlcHRpb24gLSBGYWlsZWQgdG8gYWRkVXNlclJvbGVJbkV4dGVybmFsU3lzdGVtIiwgZSk7CiAJCQlFUExvZ1V0aWwubG9nRXh0ZXJuYWxBdXRoQWNjZXNzQWxhcm0obG9nZ2VyLCBlLmdldFN0YXR1c0NvZGUoKSk7Ci0JCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHNJZ25vcmVDYXNlKCI0MDkgQ29uZmxpY3QiKSkgewotCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJVc2VyUm9sZSBhbHJlYWR5IGV4aXRzIGJ1dCBkb2VzIG5vdCBicmVhayBmdW5jdGlvbmFsaXR5Iik7CisJCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgImFkZFVzZXJSb2xlSW5FeHRlcm5hbFN5c3RlbTogVXNlclJvbGUgYWxyZWFkeSBleGl0cyBidXQgZG9lcyBub3QgYnJlYWsgZnVuY3Rpb25hbGl0eSIpOwogCQkJfSBlbHNlIHsKLQkJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiRmFpbGVkIHRvIGFkZFVzZXJSb2xlSW5FeHRlcm5hbFN5c3RlbSIsIGUuZ2V0TWVzc2FnZSgpKTsKKwkJCQlsb2dnZXIuZXJyb3IoRUVMRkxvZ2dlckRlbGVnYXRlLmVycm9yTG9nZ2VyLCAiYWRkVXNlclJvbGVJbkV4dGVybmFsU3lzdGVtOiBGYWlsZWQgdG8gYWRkVXNlclJvbGVJbkV4dGVybmFsU3lzdGVtIiwgZS5nZXRNZXNzYWdlKCkpOwogCQkJfQogCQl9CiAJfQogCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVsZXRlUm9sZURlcGVuZGVjaWVzUmVjb3JkKFNlc3Npb24gbG9jYWxTZXNzaW9uLCBMb25nIHJvbGVJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgZGVsZXRlUm9sZURlcGVuZGVuY3lSZWNvcmRzKFNlc3Npb24gbG9jYWxTZXNzaW9uLCBMb25nIHJvbGVJZCwgTG9uZyBhcHBJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSB7CisJCQlTdHJpbmcgc3FsID0gIiI7CisJCQlRdWVyeSBxdWVyeSA9IG51bGw7CisJCQkKKwkJCS8vSXQgc2hvdWxkIGRlbGV0ZSBvbmx5IHdoZW4gaXQgcG9ydGFsJ3Mgcm9sZUlkCisJCQlpZihhcHBJZC5lcXVhbHMoUG9ydGFsQ29uc3RhbnRzLlBPUlRBTF9BUFBfSUQpKXsKIAkJCS8vIERlbGV0ZSBmcm9tIGZuX3JvbGVfZnVuY3Rpb24KLQkJCVN0cmluZyBzcWwgPSAiREVMRVRFIEZST00gZm5fcm9sZV9mdW5jdGlvbiBXSEVSRSByb2xlX2lkPSIgKyByb2xlSWQ7CisJCQlzcWwgPSAiREVMRVRFIEZST00gZm5fcm9sZV9mdW5jdGlvbiBXSEVSRSByb2xlX2lkPSIgKyByb2xlSWQ7CiAJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiRXhlY3V0aW5nIHF1ZXJ5OiAiICsgc3FsKTsKLQkJCVF1ZXJ5IHF1ZXJ5ID0gbG9jYWxTZXNzaW9uLmNyZWF0ZVNRTFF1ZXJ5KHNxbCk7CisJCQlxdWVyeSA9IGxvY2FsU2Vzc2lvbi5jcmVhdGVTUUxRdWVyeShzcWwpOwogCQkJcXVlcnkuZXhlY3V0ZVVwZGF0ZSgpOwogCQkJCisJCQkvLyBEZWxldGUgZnJvbSBmbl9yb2xlX2NvbXBvc2l0ZQorCQkJc3FsID0gIkRFTEVURSBGUk9NIGZuX3JvbGVfY29tcG9zaXRlIFdIRVJFIHBhcmVudF9yb2xlX2lkPSIgKyByb2xlSWQgKyAiIE9SIGNoaWxkX3JvbGVfaWQ9IiArIHJvbGVJZDsKKwkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJFeGVjdXRpbmcgcXVlcnk6ICIgKyBzcWwpOworCQkJcXVlcnkgPSBsb2NhbFNlc3Npb24uY3JlYXRlU1FMUXVlcnkoc3FsKTsKKwkJCXF1ZXJ5LmV4ZWN1dGVVcGRhdGUoKTsKKwkJCX0KKwkJCQogCQkJLy8gRGVsZXRlIGZyb20gZXBfYXBwX3JvbGVfZnVuY3Rpb24KLQkJICAgIHNxbCA9ICJERUxFVEUgRlJPTSBlcF9hcHBfcm9sZV9mdW5jdGlvbiBXSEVSRSByb2xlX2lkPSIgKyByb2xlSWQ7CisJCQlzcWwgPSAiREVMRVRFIEZST00gZXBfYXBwX3JvbGVfZnVuY3Rpb24gV0hFUkUgcm9sZV9pZD0iICsgcm9sZUlkOwogCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkV4ZWN1dGluZyBxdWVyeTogIiArIHNxbCk7Ci0JCQkgcXVlcnkgPSBsb2NhbFNlc3Npb24uY3JlYXRlU1FMUXVlcnkoc3FsKTsKKwkJCXF1ZXJ5ID0gbG9jYWxTZXNzaW9uLmNyZWF0ZVNRTFF1ZXJ5KHNxbCk7CiAJCQlxdWVyeS5leGVjdXRlVXBkYXRlKCk7Ci0JCQkKKwogCQkJLy8gRGVsZXRlIGZyb20gZXBfcm9sZV9ub3RpZmljYXRpb24KIAkJCXNxbCA9ICJERUxFVEUgRlJPTSBlcF9yb2xlX25vdGlmaWNhdGlvbiBXSEVSRSByb2xlX2lkPSIgKyByb2xlSWQ7CiAJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiRXhlY3V0aW5nIHF1ZXJ5OiAiICsgc3FsKTsKIAkJCXF1ZXJ5ID0gbG9jYWxTZXNzaW9uLmNyZWF0ZVNRTFF1ZXJ5KHNxbCk7CiAJCQlxdWVyeS5leGVjdXRlVXBkYXRlKCk7CiAJCQkKLQkJCS8vIERlbGV0ZSBmcm9tIGZuX3JvbGVfY29tcG9zaXRlCi0JCQlzcWwgPSAiREVMRVRFIEZST00gZm5fcm9sZV9jb21wb3NpdGUgV0hFUkUgcGFyZW50X3JvbGVfaWQ9IiArIHJvbGVJZCArICIgT1IgY2hpbGRfcm9sZV9pZD0iCi0JCQkJCSsgcm9sZUlkOwotCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkV4ZWN1dGluZyBxdWVyeTogIiArIHNxbCk7Ci0JCQlxdWVyeSA9IGxvY2FsU2Vzc2lvbi5jcmVhdGVTUUxRdWVyeShzcWwpOwotCQkJcXVlcnkuZXhlY3V0ZVVwZGF0ZSgpOwotCiAJCQkvLyBEZWxldGUgZnJvbSBmbl91c2VyX3BzZXVkb19yb2xlCiAJCQlzcWwgPSAiREVMRVRFIEZST00gZm5fdXNlcl9wc2V1ZG9fcm9sZSBXSEVSRSBwc2V1ZG9fcm9sZV9pZD0iICsgcm9sZUlkOwogCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkV4ZWN1dGluZyBxdWVyeTogIiArIHNxbCk7CiAJCQlxdWVyeSA9IGxvY2FsU2Vzc2lvbi5jcmVhdGVTUUxRdWVyeShzcWwpOwogCQkJcXVlcnkuZXhlY3V0ZVVwZGF0ZSgpOwotCQkJCi0JCQkvL0RlbGV0ZSBmb3JtIEVQX1dJREdFVF9DQVRBTE9HX1JPTEUKKworCQkJLy8gRGVsZXRlIGZvcm0gRVBfV0lER0VUX0NBVEFMT0dfUk9MRQogCQkJc3FsID0gIkRFTEVURSBGUk9NIEVQX1dJREdFVF9DQVRBTE9HX1JPTEUgV0hFUkUgcm9sZV9pZD0iICsgcm9sZUlkOwogCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIkV4ZWN1dGluZyBxdWVyeTogIiArIHNxbCk7CiAJCQlxdWVyeSA9IGxvY2FsU2Vzc2lvbi5jcmVhdGVTUUxRdWVyeShzcWwpOwogCQkJcXVlcnkuZXhlY3V0ZVVwZGF0ZSgpOwotCQkJCi0JCQkvL0RlbGV0ZSBmb3JtIEVQX1dJREdFVF9DQVRBTE9HX1JPTEUKKworCQkJLy8gRGVsZXRlIGZvcm0gRVBfV0lER0VUX0NBVEFMT0dfUk9MRQogCQkJc3FsID0gIkRFTEVURSBGUk9NIGVwX3VzZXJfcm9sZXNfcmVxdWVzdF9kZXQgV0hFUkUgcmVxdWVzdGVkX3JvbGVfaWQ9IiArIHJvbGVJZDsKIAkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJFeGVjdXRpbmcgcXVlcnk6ICIgKyBzcWwpOwogCQkJcXVlcnkgPSBsb2NhbFNlc3Npb24uY3JlYXRlU1FMUXVlcnkoc3FsKTsKIAkJCXF1ZXJ5LmV4ZWN1dGVVcGRhdGUoKTsKLQkJCQotCQkJLy9EZWxldGUgZm9ybSBmbl9tZW51X2Z1bmN0aW9uYWxfcm9sZXMKKworCQkJLy8gRGVsZXRlIGZvcm0gZm5fbWVudV9mdW5jdGlvbmFsX3JvbGVzCiAJCQlzcWwgPSAiREVMRVRFIEZST00gZm5fbWVudV9mdW5jdGlvbmFsX3JvbGVzIFdIRVJFIHJvbGVfaWQ9IiArIHJvbGVJZDsKIAkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJFeGVjdXRpbmcgcXVlcnk6ICIgKyBzcWwpOwogCQkJcXVlcnkgPSBsb2NhbFNlc3Npb24uY3JlYXRlU1FMUXVlcnkoc3FsKTsKIAkJCXF1ZXJ5LmV4ZWN1dGVVcGRhdGUoKTsKLQkJCQorCiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiZGVsZXRlUm9sZURlcGVuZGVjaWVzUmVjb3JkIGZhaWxlZCAiICwgZSk7Ci0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJkZWxldGUgRmFpbGVkIisgZS5nZXRNZXNzYWdlKCkpOworCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgImRlbGV0ZVJvbGVEZXBlbmRlY2llc1JlY29yZDogZmFpbGVkICIsIGUpOworCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiZGVsZXRlIEZhaWxlZCIgKyBlLmdldE1lc3NhZ2UoKSk7CiAJCX0KLQkJCisKIAl9CiAJCi0JCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJQE92ZXJyaWRlCiAJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRNZW51RnVuY3Rpb25zTGlzdChTdHJpbmcgdWVia2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJTGlzdDxTdHJpbmc+IGFwcE1lbnVGdW5jdGlvbnNMaXN0ID0gbnVsbDsKLQkJdHJ5ewotCQlFUEFwcCBhcHAgPSBnZXRBcHAodWVia2V5KS5nZXQoMCk7Ci0JCWZpbmFsIE1hcDxTdHJpbmcsIExvbmc+IGFwcFBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKLQkJYXBwUGFyYW1zLnB1dCgiYXBwSWQiLCBhcHAuZ2V0SWQoKSk7Ci0JCWFwcE1lbnVGdW5jdGlvbnNMaXN0ID0gZGF0YUFjY2Vzc1NlcnZpY2UuZXhlY3V0ZU5hbWVkUXVlcnkoImdldE1lbnVGdW5jdGlvbnMiLCBhcHBQYXJhbXMsIG51bGwpOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJGYWlsZWQgZ2V0TWVudUZ1bmN0aW9uc0xpc3QiLCBlKTsKKwkJdHJ5IHsKKwkJCUVQQXBwIGFwcCA9IGdldEFwcCh1ZWJrZXkpLmdldCgwKTsKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIExvbmc+IGFwcFBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCWFwcFBhcmFtcy5wdXQoQVBQX0lELCBhcHAuZ2V0SWQoKSk7CisJCQlhcHBNZW51RnVuY3Rpb25zTGlzdCA9IGRhdGFBY2Nlc3NTZXJ2aWNlLmV4ZWN1dGVOYW1lZFF1ZXJ5KCJnZXRNZW51RnVuY3Rpb25zIiwgYXBwUGFyYW1zLCBudWxsKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJnZXRNZW51RnVuY3Rpb25zTGlzdDogRmFpbGVkIiwgZSk7CiAJCQlyZXR1cm4gYXBwTWVudUZ1bmN0aW9uc0xpc3Q7CiAJCX0KIAkJcmV0dXJuIGFwcE1lbnVGdW5jdGlvbnNMaXN0OwpkaWZmIC0tZ2l0IGEvZWNvbXAtcG9ydGFsLUJFLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvcG9ydGFsYXBwL3BvcnRhbC9zZXJ2aWNlL1VzZXJSb2xlc0NvbW1vblNlcnZpY2VJbXBsLmphdmEgYi9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL3NlcnZpY2UvVXNlclJvbGVzQ29tbW9uU2VydmljZUltcGwuamF2YQppbmRleCA3ZTdhNTVhLi5kN2FhYzYzIDEwMDY0NAotLS0gYS9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL3NlcnZpY2UvVXNlclJvbGVzQ29tbW9uU2VydmljZUltcGwuamF2YQorKysgYi9lY29tcC1wb3J0YWwtQkUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9wb3J0YWxhcHAvcG9ydGFsL3NlcnZpY2UvVXNlclJvbGVzQ29tbW9uU2VydmljZUltcGwuamF2YQpAQCAtNDM1LDcgKzQzNSw2IEBACiAJcHJvdGVjdGVkIHZvaWQgc3luY0FwcFJvbGVzKFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5LCBMb25nIGFwcElkLCBFY29tcFJvbGVbXSBhcHBSb2xlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJlbnRlcmluZyBzeW5jQXBwUm9sZXMgZm9yIGFwcElkOiAiICsgYXBwSWQpOwogCQlIYXNoTWFwPExvbmcsIEVjb21wUm9sZT4gbmV3Um9sZXNNYXAgPSBoYXNoTWFwRnJvbUVjb21wUm9sZXMoYXBwUm9sZXMpOwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwogCQlTZXNzaW9uIGxvY2FsU2Vzc2lvbiA9IG51bGw7CiAJCVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uID0gbnVsbDsKIApAQCAtNDY3LDIxICs0NjYsMTAgQEAKIAkJCQl9CiAJCQl9CiAJCQlDb2xsZWN0aW9uPEVjb21wUm9sZT4gbmV3Um9sZXNUb0FkZCA9IG5ld1JvbGVzTWFwLnZhbHVlcygpOwotCQkJZm9yIChFY29tcFJvbGUgcm9sZSA6IG5ld1JvbGVzVG9BZGQpIHsKLQkJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiYWJvdXQgdG8gYWRkIG1pc3Npbmcgcm9sZTogIiArIHJvbGUudG9TdHJpbmcoKSk7Ci0JCQkJRVBSb2xlIG5ld1JvbGUgPSBuZXcgRVBSb2xlKCk7Ci0JCQkJLy8gQXR0ZW50aW9uISBBbGwgcm9sZXMgZnJvbSByZW1vdGUgYXBwbGljYXRpb24gc3VwcG9zZWQgdG8gYmUKLQkJCQkvLyBhY3RpdmUhCi0JCQkJbmV3Um9sZS5zZXRBY3RpdmUodHJ1ZSk7Ci0JCQkJbmV3Um9sZS5zZXROYW1lKHJvbGUuZ2V0TmFtZSgpKTsKLQkJCQluZXdSb2xlLnNldEFwcElkKGFwcElkKTsKLQkJCQluZXdSb2xlLnNldEFwcFJvbGVJZChyb2xlLmdldElkKCkpOwotCQkJCWxvY2FsU2Vzc2lvbi5zYXZlKG5ld1JvbGUpOwotCQkJfQogCQkJaWYgKG9ic29sZXRlUm9sZXMuc2l6ZSgpID4gMCkgewotCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJ3ZSBoYXZlIG9ic29sZXRlIHJvbGVzIHRvIGRlbGV0ZSIpOworCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJzeW5jQXBwUm9sZXM6IHdlIGhhdmUgb2Jzb2xldGUgcm9sZXMgdG8gZGVsZXRlIik7CiAJCQkJZm9yIChFUFJvbGUgcm9sZSA6IG9ic29sZXRlUm9sZXMpIHsKLQkJCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgIm9ic29sZXRlIHJvbGU6ICIgKyByb2xlLnRvU3RyaW5nKCkpOworCQkJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAic3luY0FwcFJvbGVzOiBvYnNvbGV0ZSByb2xlOiAiICsgcm9sZS50b1N0cmluZygpKTsKIAkJCQkJTG9uZyByb2xlSWQgPSByb2xlLmdldElkKCk7CiAJCQkJCS8vIGRlbGV0ZSBvYnNvbGV0ZSByb2xlcyBoZXJlCiAJCQkJCS8vIE11c3QgZGVsZXRlIGFsbCByZWNvcmRzIHdpdGggZm9yZWlnbiBrZXkgY29uc3RyYWludHMgb24KQEAgLTQ5NywxMyArNDg1LDEzIEBACiAJCQkJCQkJImZyb20gIiArIEVQVXNlckFwcC5jbGFzcy5nZXROYW1lKCkgKyAiIHdoZXJlIGFwcC5pZD0iICsgYXBwSWQgKyAiIGFuZCByb2xlX2lkPSIgKyByb2xlSWQpCiAJCQkJCQkJLmxpc3QoKTsKIAotCQkJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAibnVtYmVyIG9mIHVzZXJSb2xlcyB0byBkZWxldGU6ICIgKyB1c2VyUm9sZXMuc2l6ZSgpKTsKKwkJCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgInN5bmNBcHBSb2xlczogbnVtYmVyIG9mIHVzZXJSb2xlcyB0byBkZWxldGU6ICIgKyB1c2VyUm9sZXMuc2l6ZSgpKTsKIAkJCQkJZm9yIChFUFVzZXJBcHAgdXNlclJvbGUgOiB1c2VyUm9sZXMpIHsKIAkJCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsCi0JCQkJCQkJCSJhYm91dCB0byBkZWxldGUgdXNlclJvbGU6ICIgKyB1c2VyUm9sZS50b1N0cmluZygpKTsKKwkJCQkJCQkJInN5bmNBcHBSb2xlczogYWJvdXQgdG8gZGVsZXRlIHVzZXJSb2xlOiAiICsgdXNlclJvbGUudG9TdHJpbmcoKSk7CiAJCQkJCQlsb2NhbFNlc3Npb24uZGVsZXRlKHVzZXJSb2xlKTsKIAkJCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsCi0JCQkJCQkJCSJmaW5pc2hlZCBkZWxldGluZyB1c2VyUm9sZTogIiArIHVzZXJSb2xlLnRvU3RyaW5nKCkpOworCQkJCQkJCQkic3luY0FwcFJvbGVzOiBmaW5pc2hlZCBkZWxldGluZyB1c2VyUm9sZTogIiArIHVzZXJSb2xlLnRvU3RyaW5nKCkpOwogCQkJCQl9CiAKIAkJCQkJLy8gRGVsZXRlIGZyb20gZm5fbWVudV9mdW5jdGlvbmFsX3JvbGVzCkBAIC01MTMsNyArNTAxLDcgQEAKIAkJCQkJCQkubGlzdCgpOwogCQkJCQlpbnQgbnVtTWVudVJvbGVzID0gZnVuY01lbnVSb2xlcy5zaXplKCk7CiAJCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsCi0JCQkJCQkJIm51bWJlciBvZiBmdW5jTWVudVJvbGVzIGZvciByb2xlSWQ6ICIgKyByb2xlSWQgKyAiOiAiICsgbnVtTWVudVJvbGVzKTsKKwkJCQkJCQkic3luY0FwcFJvbGVzOiBudW1iZXIgb2YgZnVuY01lbnVSb2xlcyBmb3Igcm9sZUlkOiAiICsgcm9sZUlkICsgIjogIiArIG51bU1lbnVSb2xlcyk7CiAJCQkJCWZvciAoRnVuY3Rpb25hbE1lbnVSb2xlIGZ1bmNNZW51Um9sZSA6IGZ1bmNNZW51Um9sZXMpIHsKIAkJCQkJCUxvbmcgbWVudUlkID0gZnVuY01lbnVSb2xlLm1lbnVJZDsKIAkJCQkJCS8vIElmIHRoaXMgaXMgdGhlIG9ubHkgcm9sZSBmb3IgdGhpcyBtZW51IGl0ZW0sIHRoZW4gdGhlCkBAIC01MjUsMTQgKzUxMywxNCBAQAogCQkJCQkJCQkubGlzdCgpOwogCQkJCQkJaW50IG51bU1lbnVSb2xlczIgPSBmdW5jTWVudVJvbGVzMi5zaXplKCk7CiAJCQkJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLAotCQkJCQkJCQkibnVtYmVyIG9mIGZ1bmNNZW51Um9sZXMgZm9yIG1lbnVJZDogIiArIG1lbnVJZCArICI6ICIgKyBudW1NZW51Um9sZXMyKTsKKwkJCQkJCQkJInN5bmNBcHBSb2xlczogbnVtYmVyIG9mIGZ1bmNNZW51Um9sZXMgZm9yIG1lbnVJZDogIiArIG1lbnVJZCArICI6ICIgKyBudW1NZW51Um9sZXMyKTsKIAkJCQkJCWxvY2FsU2Vzc2lvbi5kZWxldGUoZnVuY01lbnVSb2xlKTsKIAkJCQkJCWlmIChudW1NZW51Um9sZXMyID09IDEpIHsKIAkJCQkJCQkvLyBJZiB0aGlzIGlzIHRoZSBvbmx5IHJvbGUgZm9yIHRoaXMgbWVudSBpdGVtLCB0aGVuCiAJCQkJCQkJLy8gdGhlIGFwcCBhbmQgcm9sZXMgd2lsbCBiZSBnb25lLAogCQkJCQkJCS8vIHNvIG11c3QgbnVsbCBvdXQgdGhlIHVybCB0b28sIHRvIGJlIGNvbnNpc3RlbnQKIAkJCQkJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLAotCQkJCQkJCQkJIlRoZXJlIGlzIGV4YWN0bHkgMSBtZW51IGl0ZW0gZm9yIHRoaXMgcm9sZSwgc28gZW1wdHlpbmcgdGhlIHVybCIpOworCQkJCQkJCQkJInN5bmNBcHBSb2xlczogVGhlcmUgaXMgZXhhY3RseSAxIG1lbnUgaXRlbSBmb3IgdGhpcyByb2xlLCBzbyBlbXB0eWluZyB0aGUgdXJsIik7CiAJCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJCQkJCQkJTGlzdDxGdW5jdGlvbmFsTWVudUl0ZW0+IGZ1bmNNZW51SXRlbXMgPSBsb2NhbFNlc3Npb24KIAkJCQkJCQkJCS5jcmVhdGVRdWVyeSgKQEAgLTU0NiwyNiArNTM0LDMzIEBACiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCWV4dGVybmFsQWNjZXNzUm9sZXNTZXJ2aWNlLmRlbGV0ZVJvbGVEZXBlbmRlY2llc1JlY29yZChsb2NhbFNlc3Npb24sIHJvbGVJZCk7Ci0JCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJhYm91dCB0byBkZWxldGUgdGhlIHJvbGU6ICIgKyByb2xlLnRvU3RyaW5nKCkpOworCQkJCQlleHRlcm5hbEFjY2Vzc1JvbGVzU2VydmljZS5kZWxldGVSb2xlRGVwZW5kZW5jeVJlY29yZHMobG9jYWxTZXNzaW9uLCByb2xlSWQsIGFwcElkKTsKKwkJCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgInN5bmNBcHBSb2xlczogYWJvdXQgdG8gZGVsZXRlIHRoZSByb2xlOiAiICsgcm9sZS50b1N0cmluZygpKTsKIAkJCQkJbG9jYWxTZXNzaW9uLmRlbGV0ZShyb2xlKTsKLQkJCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgImRlbGV0ZWQgdGhlIHJvbGUiKTsKKwkJCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgInN5bmNBcHBSb2xlczogZGVsZXRlZCB0aGUgcm9sZSIpOwogCQkJCX0KIAkJCX0KLQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJhYm91dCB0byBjb21taXQgdGhlIHRyYW5zYWN0aW9uIik7CisJCQlmb3IgKEVjb21wUm9sZSByb2xlIDogbmV3Um9sZXNUb0FkZCkgeworCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJzeW5jQXBwUm9sZXM6IGFib3V0IHRvIGFkZCBtaXNzaW5nIHJvbGU6ICIgKyByb2xlLnRvU3RyaW5nKCkpOworCQkJCUVQUm9sZSBuZXdSb2xlID0gbmV3IEVQUm9sZSgpOworCQkJCS8vIEF0dGVudGlvbiEgQWxsIHJvbGVzIGZyb20gcmVtb3RlIGFwcGxpY2F0aW9uIHN1cHBvc2VkIHRvIGJlCisJCQkJLy8gYWN0aXZlIQorCQkJCW5ld1JvbGUuc2V0QWN0aXZlKHRydWUpOworCQkJCW5ld1JvbGUuc2V0TmFtZShyb2xlLmdldE5hbWUoKSk7CisJCQkJbmV3Um9sZS5zZXRBcHBJZChhcHBJZCk7CisJCQkJbmV3Um9sZS5zZXRBcHBSb2xlSWQocm9sZS5nZXRJZCgpKTsKKwkJCQlsb2NhbFNlc3Npb24uc2F2ZShuZXdSb2xlKTsKKwkJCX0KKwkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJzeW5jQXBwUm9sZXM6IGFib3V0IHRvIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24iKTsKIAkJCXRyYW5zYWN0aW9uLmNvbW1pdCgpOwotCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgImNvbW1pdHRlZCB0aGUgdHJhbnNhY3Rpb24iKTsKLQkJCXJlc3VsdCA9IHRydWU7CisJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAic3luY0FwcFJvbGVzOiBjb21taXR0ZWQgdGhlIHRyYW5zYWN0aW9uIik7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAJCQlFUExvZ1V0aWwubG9nRWNvbXBFcnJvcihsb2dnZXIsIEVQQXBwTWVzc2FnZXNFbnVtLkJlRGFvU3lzdGVtRXJyb3IsIGUpOwogCQkJRWNvbXBQb3J0YWxVdGlscy5yb2xsYmFja1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLAotCQkJCQkiRXhjZXB0aW9uIG9jY3VycmVkIGluIHN5bmNBcHBSb2xlcywgRGV0YWlsczogIiArIEVjb21wUG9ydGFsVXRpbHMuZ2V0U3RhY2tUcmFjZShlKSk7CisJCQkJCSJzeW5jQXBwUm9sZXM6IEV4Y2VwdGlvbiBvY2N1cnJlZCBpbiBzeW5jQXBwUm9sZXMsIERldGFpbHM6ICIgKyBFY29tcFBvcnRhbFV0aWxzLmdldFN0YWNrVHJhY2UoZSkpOworCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihlKTsKIAkJfSBmaW5hbGx5IHsKIAkJCWxvY2FsU2Vzc2lvbi5jbG9zZSgpOwotCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotCQkJCQkJIkV4Y2VwdGlvbiBvY2N1cnJlZCBpbiBzeW5jQXBwUm9sZXMgd2hpbGUgY2xvc2luZyBkYXRhYmFzZSBzZXNzaW9uIGZvciBhcHA6ICciICsgYXBwSWQgKyAiJy4iKTsKLQkJCX0KIAkJfQogCX0KIAkKQEAgLTg2Nyw3ICs4NjIsNyBAQAogCQkJCQkJCXVzZXJSb2xlc0luTG9jYWxBcHApOwogCQkJCQlMaXN0PFJvbGVJbkFwcEZvclVzZXI+IHJvbGVBcHBVc2VyTGlzdCA9IHJvbGVzSW5BcHBGb3JVc2VyLnJvbGVzOwogCQkJCQkvLyBBcHBseSBjaGFuZ2VzIGluIGV4dGVybmFsIEFjY2VzcyBzeXN0ZW0KLQkJCQkJdXBkYXRlVXNlclJvbGVzSW5FeHRlcm5hbFN5c3RlbShhcHAsIHJvbGVzSW5BcHBGb3JVc2VyLm9yZ1VzZXJJZCwgcm9sZUFwcFVzZXJMaXN0KTsKKwkJCQkJdXBkYXRlVXNlclJvbGVzSW5FeHRlcm5hbFN5c3RlbShhcHAsIHJvbGVzSW5BcHBGb3JVc2VyLm9yZ1VzZXJJZCwgcm9sZUFwcFVzZXJMaXN0LCBlcFJlcXVlc3RWYWx1ZSk7CiAJCQkJCXJlc3VsdCA9IGFwcGx5Q2hhbmdlc0luVXNlclJvbGVzRm9yQXBwVG9FY29tcERCKHJvbGVzSW5BcHBGb3JVc2VyLCBlcFJlcXVlc3RWYWx1ZSwgIlBvcnRhbCIpOwogCQkJCX0gCiAJCQkJLy8gSW4gY2FzZSBpZiBwb3J0YWwgaXMgbm90IGNlbnRyYWxpemVkIHRoZW4gZm9sbG93IGV4aXN0aW5nIGFwcHJvYWNoCkBAIC05MTUsMTQzICs5MTAsMTUxIEBACiAJCX0KIAkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0KKwkvKioKKwkgKiBJdCBhZGRzIHVzZXIgcm9sZXMgaW4gRXh0ZXJuYWwgc3lzdGVtIGFuZCBhbHNvIG1ha2UgZGF0YSBjb25zaXN0ZW50IGluIGJvdGggbG9jYWwgYW5kIGluIEV4dGVybmFsIFN5c3RlbSAKKwkgKiAKKwkgKiBAcGFyYW0gYXBwIGRldGFpbHMKKwkgKiBAcGFyYW0gb3JnVXNlcklkCisJICogQHBhcmFtIHJvbGVJbkFwcFVzZXIgQ29udGFpbnMgbGlzdCBvZiBhY3RpdmUgcm9sZXMgCisJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVVzZXJSb2xlc0luRXh0ZXJuYWxTeXN0ZW0oRVBBcHAgYXBwLCBTdHJpbmcgb3JnVXNlcklkLCBMaXN0PFJvbGVJbkFwcEZvclVzZXI+IHJvbGVJbkFwcFVzZXIpCi0JCXsKLQkJdHJ5ewotCQkvL2NoZWNrIGlmIHVzZXIgZXhpc3RzIAotCQlmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJQYXJhbXMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCXVzZXJQYXJhbXMucHV0KCJvcmdVc2VySWRWYWx1ZSIsIG9yZ1VzZXJJZCk7Ci0JCUxpc3Q8RVBVc2VyPiB1c2VySW5mbyA9IGNoZWNrSWZVc2VyRXhpc3RzKHVzZXJQYXJhbXMpOwotCQlpZiAodXNlckluZm8uc2l6ZSgpID09IDAgfHwgdXNlckluZm8uaXNFbXB0eSgpKSB7Ci0JCSAgY3JlYXRlTG9jYWxVc2VySWZOZWNlc3Nhcnkob3JnVXNlcklkKTsKLQkJfQotCQlmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvZ2luSWRQYXJhbXMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCWxvZ2luSWRQYXJhbXMucHV0KCJvcmdVc2VySWRWYWx1ZSIsIG9yZ1VzZXJJZCk7CQotCQlFUFVzZXIgdXNlciA9IChFUFVzZXIpIGRhdGFBY2Nlc3NTZXJ2aWNlLmV4ZWN1dGVOYW1lZFF1ZXJ5KCJlcFVzZXJBcHBJZCIsIGxvZ2luSWRQYXJhbXMsIG51bGwpLmdldCgwKTsKLQkJU3RyaW5nIG5hbWUgPSAiIjsKLQkJaWYgKEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5jb250YWluc1Byb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VU0VSX0RPTUFJTikpIHsKLQkJCW5hbWUgPSBvcmdVc2VySWQKLQkJCQkJKyBTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VU0VSX0RPTUFJTik7Ci0JCX0KLQkJT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKLQkJSHR0cEhlYWRlcnMgaGVhZGVycyA9IEVjb21wUG9ydGFsVXRpbHMuYmFzZTY0ZW5jb2RlS2V5Rm9yQUFGQmFzaWNBdXRoKCkJCQkJCQk7Ci0JCUh0dHBFbnRpdHk8U3RyaW5nPiBnZXRVc2VyUm9sZXNFbnRpdHkgPSBuZXcgSHR0cEVudGl0eTw+KGhlYWRlcnMpOwotCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiQ29ubmVjdGluZyB0byBleHRlcm5hbCBzeXN0ZW0gdG8gZ2V0IGN1cnJlbnQgdXNlciByb2xlcyIpOwotCQlSZXNwb25zZUVudGl0eTxTdHJpbmc+IGdldFJlc3BvbnNlID0gdGVtcGxhdGUKLQkJCQkuZXhjaGFuZ2UoU3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVJMKQotCQkJCQkJKyAicm9sZXMvdXNlci8iICsgbmFtZSwgSHR0cE1ldGhvZC5HRVQsIGdldFVzZXJSb2xlc0VudGl0eSwgU3RyaW5nLmNsYXNzKTsKLQkJaWYoZ2V0UmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLnZhbHVlKCkgPT0gMjAwKXsKLQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJDb25uZWN0ZWQgdG8gZXh0ZXJuYWwgc3lzdGVtIGFuZCByZWNlaXZlZCB1c2VyIHJvbGVzOiAiLCBnZXRSZXNwb25zZS5nZXRCb2R5KCkpOwotCi0JCX0KLQkJTGlzdDxFeHRlcm5hbEFjY2Vzc1VzZXJSb2xlRGV0YWlsPiB1c2VyUm9sZURldGFpbExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJU3RyaW5nIHJlcyA9IGdldFJlc3BvbnNlLmdldEJvZHkoKTsKLQkJSlNPTk9iamVjdCBqc29uT2JqID0gbnVsbDsKLQkJSlNPTkFycmF5IGV4dFJvbGVzID0gbnVsbDsKLQkJaWYgKCFyZXMuZXF1YWxzKCJ7fSIpKSB7Ci0JCQlqc29uT2JqID0gbmV3IEpTT05PYmplY3QocmVzKTsKLQkJCWV4dFJvbGVzID0ganNvbk9iai5nZXRKU09OQXJyYXkoInJvbGUiKTsKLQkJfQotCQlFeHRlcm5hbEFjY2Vzc1VzZXJSb2xlRGV0YWlsIHVzZXJSb2xlRGV0YWlsID0gbnVsbDsKLQkJaWYgKGV4dFJvbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0Um9sZXMubGVuZ3RoKCk7IGkrKykgewotCQkJCWlmIChleHRSb2xlcy5nZXRKU09OT2JqZWN0KGkpLmdldFN0cmluZygibmFtZSIpLnN0YXJ0c1dpdGgoYXBwLmdldE5hbWVTcGFjZSgpICsgIi4iKSAmJiAhZXh0Um9sZXMuZ2V0SlNPTk9iamVjdChpKS5nZXRTdHJpbmcoIm5hbWUiKS5lcXVhbHMoYXBwLmdldE5hbWVTcGFjZSgpKyIuYWRtaW4iKQotCQkJCQkmJgkhZXh0Um9sZXMuZ2V0SlNPTk9iamVjdChpKS5nZXRTdHJpbmcoIm5hbWUiKS5lcXVhbHMoYXBwLmdldE5hbWVTcGFjZSgpKyIub3duZXIiKSkgewotCQkJCQlPYmplY3RNYXBwZXIgZGVzY01hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKLQkJCQkJaWYoZXh0Um9sZXMuZ2V0SlNPTk9iamVjdChpKS5oYXMoImRlc2NyaXB0aW9uIikpewotCQkJCQkJRXh0ZXJuYWxSb2xlRGVzY3JpcHRpb24gZGVzYyA9IGRlc2NNYXBwZXIucmVhZFZhbHVlKAotCQkJCQkJCQlleHRSb2xlcy5nZXRKU09OT2JqZWN0KGkpLmdldFN0cmluZygiZGVzY3JpcHRpb24iKSwgRXh0ZXJuYWxSb2xlRGVzY3JpcHRpb24uY2xhc3MpOwotCQkJCQkJdXNlclJvbGVEZXRhaWwgPSBuZXcgRXh0ZXJuYWxBY2Nlc3NVc2VyUm9sZURldGFpbChleHRSb2xlcy5nZXRKU09OT2JqZWN0KGkpLmdldFN0cmluZygibmFtZSIpLAotCQkJCQkJCQlkZXNjKTsKLQkJCQkJCXVzZXJSb2xlRGV0YWlsTGlzdC5hZGQodXNlclJvbGVEZXRhaWwpOwkKLQkJCQkJfWVsc2V7Ci0JCQkJCXVzZXJSb2xlRGV0YWlsID0gbmV3IEV4dGVybmFsQWNjZXNzVXNlclJvbGVEZXRhaWwoZXh0Um9sZXMuZ2V0SlNPTk9iamVjdChpKS5nZXRTdHJpbmcoIm5hbWUiKSwKLQkJCQkJCQludWxsKTsKLQkJCQkJdXNlclJvbGVEZXRhaWxMaXN0LmFkZCh1c2VyUm9sZURldGFpbCk7Ci0JCQkJCX0KLQotCQkJCX0KKwlwcml2YXRlIHZvaWQgdXBkYXRlVXNlclJvbGVzSW5FeHRlcm5hbFN5c3RlbShFUEFwcCBhcHAsIFN0cmluZyBvcmdVc2VySWQsIExpc3Q8Um9sZUluQXBwRm9yVXNlcj4gcm9sZUluQXBwVXNlciwgYm9vbGVhbiBpc1BvcnRhbFJlcXVlc3QpCisJeworCQl0cnkgeworCQkJLy8gY2hlY2sgaWYgdXNlciBleGlzdHMKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gdXNlclBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCXVzZXJQYXJhbXMucHV0KCJvcmdVc2VySWRWYWx1ZSIsIG9yZ1VzZXJJZCk7CisJCQlMaXN0PEVQVXNlcj4gdXNlckluZm8gPSBjaGVja0lmVXNlckV4aXN0cyh1c2VyUGFyYW1zKTsKKwkJCWlmICh1c2VySW5mby5pc0VtcHR5KCkpIHsKKwkJCQljcmVhdGVMb2NhbFVzZXJJZk5lY2Vzc2FyeShvcmdVc2VySWQpOwogCQkJfQotCQl9Ci0JCWZvciAoRXh0ZXJuYWxBY2Nlc3NVc2VyUm9sZURldGFpbCB1c2VyUm9sZSA6IHVzZXJSb2xlRGV0YWlsTGlzdCkgewotCQkJSHR0cEVudGl0eTxTdHJpbmc+IGVudGl0eSA9IG5ldyBIdHRwRW50aXR5PD4oaGVhZGVycyk7Ci0JCQl0ZW1wbGF0ZS5leGNoYW5nZShTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VUkwpCi0JCQkJCSsgInVzZXJSb2xlLyIgKyBuYW1lICsgIi8iICsgdXNlclJvbGUuZ2V0TmFtZSgpLCBIdHRwTWV0aG9kLkRFTEVURSwgZW50aXR5LCBTdHJpbmcuY2xhc3MpOwotCQl9Ci0JCWZpbmFsIE1hcDxTdHJpbmcsIFJvbGVJbkFwcEZvclVzZXI+IHJvbGVJbkFwcFVzZXJNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCWZvcihSb2xlSW5BcHBGb3JVc2VyIHJvbGVJbkFwcFVzZXJOZXc6IHJvbGVJbkFwcFVzZXIpewotCQkJcm9sZUluQXBwVXNlck1hcC5wdXQocm9sZUluQXBwVXNlck5ldy5nZXRSb2xlTmFtZSgpLCByb2xlSW5BcHBVc2VyTmV3KTsKLQkJfQotCQlmaW5hbCBNYXA8U3RyaW5nLCBMb25nPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCXBhcmFtcy5wdXQoImFwcElkIiwgYXBwLmdldElkKCkpOwotCQlwYXJhbXMucHV0KCJ1c2VySWQiLCB1c2VyLmdldElkKCkpOwotCQlMaXN0PEVjb21wVXNlckFwcFJvbGVzPiB1c2VyQXBwTGlzdCA9IGRhdGFBY2Nlc3NTZXJ2aWNlLmV4ZWN1dGVOYW1lZFF1ZXJ5KCJnZXRVc2VyQXBwRXhpc3RpbmdSb2xlcyIsIHBhcmFtcywgbnVsbCk7Ci0JCS8vIENoZWNrIGlmIGluY29taW5nIHJlcXVlc3QgaGFzIHN5cyBhZG1pbiBvciBhY2NvdW50IGFkbWluLCBpZiBleGlzdHMgYWRkIGluIGV4dGVybmFsIHN5c3RlbQotCQkJaWYgKCFyb2xlSW5BcHBVc2VyLmlzRW1wdHkoKSkgewotCQkJCWZvciAoRWNvbXBVc2VyQXBwUm9sZXMgdXNlckFwcCA6IHVzZXJBcHBMaXN0KSB7Ci0JCQkJCWlmICgodXNlckFwcC5nZXRSb2xlSWQoKS5lcXVhbHMoUG9ydGFsQ29uc3RhbnRzLlNZU19BRE1JTl9ST0xFX0lEKQotCQkJCQkJCXx8IHVzZXJBcHAuZ2V0Um9sZUlkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5BQ0NPVU5UX0FETUlOX1JPTEVfSUQpKSAmJiAhcm9sZUluQXBwVXNlck1hcC5jb250YWluc0tleSh1c2VyQXBwLmdldFJvbGVOYW1lKCkpKSB7Ci0JCQkJCQlSb2xlSW5BcHBGb3JVc2VyIGFkZFNwZWNpYWxSb2xlID0gbmV3IFJvbGVJbkFwcEZvclVzZXIoKTsKLQkJCQkJCWFkZFNwZWNpYWxSb2xlLnNldElzQXBwbGllZCh0cnVlKTsKLQkJCQkJCWFkZFNwZWNpYWxSb2xlLnNldFJvbGVJZCh1c2VyQXBwLmdldFJvbGVJZCgpKTsKLQkJCQkJCWFkZFNwZWNpYWxSb2xlLnNldFJvbGVOYW1lKHVzZXJBcHAuZ2V0Um9sZU5hbWUoKSk7Ci0JCQkJCQlyb2xlSW5BcHBVc2VyLmFkZChhZGRTcGVjaWFsUm9sZSk7CisJCQlTdHJpbmcgbmFtZSA9ICIiOworCQkJaWYgKEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcworCQkJCQkuY29udGFpbnNQcm9wZXJ0eShFUENvbW1vblN5c3RlbVByb3BlcnRpZXMuRVhURVJOQUxfQ0VOVFJBTF9BQ0NFU1NfVVNFUl9ET01BSU4pKSB7CisJCQkJbmFtZSA9IG9yZ1VzZXJJZAorCQkJCQkJKyBTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VU0VSX0RPTUFJTik7CisJCQl9CisJCQlPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworCQkJSHR0cEhlYWRlcnMgaGVhZGVycyA9IEVjb21wUG9ydGFsVXRpbHMuYmFzZTY0ZW5jb2RlS2V5Rm9yQUFGQmFzaWNBdXRoKCk7CisJCQlIdHRwRW50aXR5PFN0cmluZz4gZ2V0VXNlclJvbGVzRW50aXR5ID0gbmV3IEh0dHBFbnRpdHk8PihoZWFkZXJzKTsKKwkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJDb25uZWN0aW5nIHRvIGV4dGVybmFsIHN5c3RlbSB0byBnZXQgY3VycmVudCB1c2VyIHJvbGVzIik7CisJCQlSZXNwb25zZUVudGl0eTxTdHJpbmc+IGdldFJlc3BvbnNlID0gdGVtcGxhdGUKKwkJCQkJLmV4Y2hhbmdlKFN5c3RlbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkVYVEVSTkFMX0NFTlRSQUxfQUNDRVNTX1VSTCkKKwkJCQkJCQkrICJyb2xlcy91c2VyLyIgKyBuYW1lLCBIdHRwTWV0aG9kLkdFVCwgZ2V0VXNlclJvbGVzRW50aXR5LCBTdHJpbmcuY2xhc3MpOworCQkJaWYgKGdldFJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKS52YWx1ZSgpID09IDIwMCkgeworCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJ1cGRhdGVVc2VyUm9sZXNJbkV4dGVybmFsU3lzdGVtOiBGaW5pc2hlZCBHRVQgdXNlciByb2xlcyBmcm9tIGV4dGVybmFsIHN5c3RlbSBhbmQgcmVjZWl2ZWQgdXNlciByb2xlcyB7fSIsCisJCQkJCQlnZXRSZXNwb25zZS5nZXRCb2R5KCkpOworCisJCQl9CisJCQlMaXN0PEV4dGVybmFsQWNjZXNzVXNlclJvbGVEZXRhaWw+IHVzZXJSb2xlRGV0YWlsTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJU3RyaW5nIHJlcyA9IGdldFJlc3BvbnNlLmdldEJvZHkoKTsKKwkJCUpTT05PYmplY3QganNvbk9iaiA9IG51bGw7CisJCQlKU09OQXJyYXkgZXh0Um9sZXMgPSBudWxsOworCQkJaWYgKCFyZXMuZXF1YWxzKCJ7fSIpKSB7CisJCQkJanNvbk9iaiA9IG5ldyBKU09OT2JqZWN0KHJlcyk7CisJCQkJZXh0Um9sZXMgPSBqc29uT2JqLmdldEpTT05BcnJheSgicm9sZSIpOworCQkJfQorCQkJRXh0ZXJuYWxBY2Nlc3NVc2VyUm9sZURldGFpbCB1c2VyUm9sZURldGFpbCA9IG51bGw7CisJCQlpZiAoZXh0Um9sZXMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0Um9sZXMubGVuZ3RoKCk7IGkrKykgeworCQkJCQlpZiAoZXh0Um9sZXMuZ2V0SlNPTk9iamVjdChpKS5nZXRTdHJpbmcoIm5hbWUiKS5zdGFydHNXaXRoKGFwcC5nZXROYW1lU3BhY2UoKSArICIuIikKKwkJCQkJCQkmJiAhZXh0Um9sZXMuZ2V0SlNPTk9iamVjdChpKS5nZXRTdHJpbmcoIm5hbWUiKS5lcXVhbHMoYXBwLmdldE5hbWVTcGFjZSgpICsgIi5hZG1pbiIpCisJCQkJCQkJJiYgIWV4dFJvbGVzLmdldEpTT05PYmplY3QoaSkuZ2V0U3RyaW5nKCJuYW1lIikuZXF1YWxzKGFwcC5nZXROYW1lU3BhY2UoKSArICIub3duZXIiKSkgeworCQkJCQkJT2JqZWN0TWFwcGVyIGRlc2NNYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisJCQkJCQlpZiAoZXh0Um9sZXMuZ2V0SlNPTk9iamVjdChpKS5oYXMoImRlc2NyaXB0aW9uIikpIHsKKwkJCQkJCQlFeHRlcm5hbFJvbGVEZXNjcmlwdGlvbiBkZXNjID0gZGVzY01hcHBlci5yZWFkVmFsdWUoCisJCQkJCQkJCQlleHRSb2xlcy5nZXRKU09OT2JqZWN0KGkpLmdldFN0cmluZygiZGVzY3JpcHRpb24iKSwgRXh0ZXJuYWxSb2xlRGVzY3JpcHRpb24uY2xhc3MpOworCQkJCQkJCXVzZXJSb2xlRGV0YWlsID0gbmV3IEV4dGVybmFsQWNjZXNzVXNlclJvbGVEZXRhaWwoCisJCQkJCQkJCQlleHRSb2xlcy5nZXRKU09OT2JqZWN0KGkpLmdldFN0cmluZygibmFtZSIpLCBkZXNjKTsKKwkJCQkJCQl1c2VyUm9sZURldGFpbExpc3QuYWRkKHVzZXJSb2xlRGV0YWlsKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdXNlclJvbGVEZXRhaWwgPSBuZXcgRXh0ZXJuYWxBY2Nlc3NVc2VyUm9sZURldGFpbCgKKwkJCQkJCQkJCWV4dFJvbGVzLmdldEpTT05PYmplY3QoaSkuZ2V0U3RyaW5nKCJuYW1lIiksIG51bGwpOworCQkJCQkJCXVzZXJSb2xlRGV0YWlsTGlzdC5hZGQodXNlclJvbGVEZXRhaWwpOworCQkJCQkJfQorCiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCUxpc3Q8Um9sZUluQXBwRm9yVXNlcj4gcm9sZUluQXBwVXNlck5vbkR1cGxzID0gcm9sZUluQXBwVXNlci5zdHJlYW0oKS5kaXN0aW5jdCgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7Ci0JCWZvciAoUm9sZUluQXBwRm9yVXNlciBhZGRSb2xlIDogcm9sZUluQXBwVXNlck5vbkR1cGxzKSB7Ci0JCQlFeHRlcm5hbEFjY2Vzc1VzZXIgZXh0VXNlciA9IG51bGw7Ci0JCQlpZiAoKGFkZFJvbGUuZ2V0Um9sZUlkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5BQ0NPVU5UX0FETUlOX1JPTEVfSUQpKQotCQkJCQkmJiAhYXBwLmdldElkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5QT1JUQUxfQVBQX0lEKSkgewotCQkJCXRyeXsKLQkJCQlTdHJpbmcgZXh0Um9sZSA9IGFwcC5nZXROYW1lU3BhY2UoKSsiLiIrUG9ydGFsQ29uc3RhbnRzLkFETUlOX1JPTEUucmVwbGFjZUFsbCgiICIsIl8iKTsKLQkJCQlIdHRwRW50aXR5PFN0cmluZz4gZW50aXR5ID0gbmV3IEh0dHBFbnRpdHk8PihoZWFkZXJzKTsKLQkJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiQ29ubmVjdGluZyB0byBFeHRlcm5hbCBBY2Nlc3Mgc3lzdGVtIik7Ci0JCQkJUmVzcG9uc2VFbnRpdHk8U3RyaW5nPiBnZXRSb2xlUmVzcG9uc2UgPSB0ZW1wbGF0ZS5leGNoYW5nZSgKLQkJCQkJCVN5c3RlbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoRVBDb21tb25TeXN0ZW1Qcm9wZXJ0aWVzLkVYVEVSTkFMX0NFTlRSQUxfQUNDRVNTX1VSTCkgKyAicm9sZXMvIitleHRSb2xlLAotCQkJCQkJSHR0cE1ldGhvZC5HRVQsIGVudGl0eSwgU3RyaW5nLmNsYXNzKTsKLQkJCQlTdHJpbmcgZXh0QWRtaW5Sb2xlID0gYXBwLmdldE5hbWVTcGFjZSgpKyIuIitQb3J0YWxDb25zdGFudHMuQURNSU5fUk9MRS5yZXBsYWNlQWxsKCIgIiwgIl8iKTsKLQkJCQlpZihnZXRSb2xlUmVzcG9uc2UuZ2V0Qm9keSgpLmVxdWFscygie30iKSl7Ci0JCQkJCQlTdHJpbmcgYWRkRGVzYyA9ICJ7XCJuYW1lXCI6XCIiICtleHRBZG1pblJvbGUrICJcIn0iOwotCQkJCQkJSHR0cEVudGl0eTxTdHJpbmc+IHJvbGVFbnRpdHkgPSBuZXcgSHR0cEVudGl0eTw+KGFkZERlc2MsaGVhZGVycyk7Ci0JCQkJCQl0ZW1wbGF0ZS5leGNoYW5nZSgKLQkJCQkJCQlTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VUkwpICArICJyb2xlIiwKLQkJCQkJCQlIdHRwTWV0aG9kLlBPU1QsIHJvbGVFbnRpdHksIFN0cmluZy5jbGFzcyk7CQorCQkJLy8gSWYgcmVxdWVzdCBjb21pbmcgZnJvbSBwb3J0YWwgbm90IGZyb20gZXh0ZXJuYWwgcm9sZSBhcHByb3ZhbCBzeXN0ZW0gdGhlbiB3ZSBoYXZlIHRvIGNoZWNrIGlmIHVzZXIgYWxyZWFkeSAKKwkJCS8vIGhhdmUgYWNjb3VudCBhZG1pbiBvciBzeXN0ZW0gYWRtaW4gYXMgR1VJIHdpbGwgbm90IHNlbmQgdGhlc2Ugcm9sZXMgCisJCQlpZiAoIWlzUG9ydGFsUmVxdWVzdCkgeworCQkJCWZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9naW5JZFBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQlsb2dpbklkUGFyYW1zLnB1dCgib3JnVXNlcklkVmFsdWUiLCBvcmdVc2VySWQpOworCQkJCUVQVXNlciB1c2VyID0gKEVQVXNlcikgZGF0YUFjY2Vzc1NlcnZpY2UuZXhlY3V0ZU5hbWVkUXVlcnkoImVwVXNlckFwcElkIiwgbG9naW5JZFBhcmFtcywgbnVsbCkuZ2V0KDApOworCQkJCWZpbmFsIE1hcDxTdHJpbmcsIExvbmc+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQlwYXJhbXMucHV0KCJhcHBJZCIsIGFwcC5nZXRJZCgpKTsKKwkJCQlwYXJhbXMucHV0KCJ1c2VySWQiLCB1c2VyLmdldElkKCkpOworCQkJCUxpc3Q8RWNvbXBVc2VyQXBwUm9sZXM+IHVzZXJBcHBMaXN0ID0gZGF0YUFjY2Vzc1NlcnZpY2UuZXhlY3V0ZU5hbWVkUXVlcnkoImdldFVzZXJBcHBFeGlzdGluZ1JvbGVzIiwKKwkJCQkJCXBhcmFtcywgbnVsbCk7CisJCQkJaWYgKCFyb2xlSW5BcHBVc2VyLmlzRW1wdHkoKSkgeworCQkJCQlmb3IgKEVjb21wVXNlckFwcFJvbGVzIHVzZXJBcHAgOiB1c2VyQXBwTGlzdCkgeworCQkJCQkJaWYgKHVzZXJBcHAuZ2V0Um9sZUlkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5TWVNfQURNSU5fUk9MRV9JRCkKKwkJCQkJCQkJfHwgdXNlckFwcC5nZXRSb2xlSWQoKS5lcXVhbHMoUG9ydGFsQ29uc3RhbnRzLkFDQ09VTlRfQURNSU5fUk9MRV9JRCkpIHsKKwkJCQkJCQlSb2xlSW5BcHBGb3JVc2VyIGFkZFNwZWNpYWxSb2xlID0gbmV3IFJvbGVJbkFwcEZvclVzZXIoKTsKKwkJCQkJCQlhZGRTcGVjaWFsUm9sZS5zZXRJc0FwcGxpZWQodHJ1ZSk7CisJCQkJCQkJYWRkU3BlY2lhbFJvbGUuc2V0Um9sZUlkKHVzZXJBcHAuZ2V0Um9sZUlkKCkpOworCQkJCQkJCWFkZFNwZWNpYWxSb2xlLnNldFJvbGVOYW1lKHVzZXJBcHAuZ2V0Um9sZU5hbWUoKSk7CisJCQkJCQkJcm9sZUluQXBwVXNlci5hZGQoYWRkU3BlY2lhbFJvbGUpOworCQkJCQkJfQorCQkJCQl9CiAJCQkJfQotCQkJCWV4dFVzZXIgPSBuZXcgRXh0ZXJuYWxBY2Nlc3NVc2VyKG5hbWUsCi0JCQkJCQlhcHAuZ2V0TmFtZVNwYWNlKCkgKyAiLiIgKyBQb3J0YWxDb25zdGFudHMuQURNSU5fUk9MRS5yZXBsYWNlQWxsKCIgIiwgIl8iKSk7Ci0JCQkJfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0JCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJGYWlsZWQgdG8gYWRkIGFkbWluIHJvbGUgZm9yIGFwcGxpY2F0aW9uIHt9ICIsYXBwLmdldElkKCksZSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZXh0VXNlciA9IG5ldyBFeHRlcm5hbEFjY2Vzc1VzZXIobmFtZSwKLQkJCQkJCWFwcC5nZXROYW1lU3BhY2UoKSArICIuIiArIGFkZFJvbGUuZ2V0Um9sZU5hbWUoKS5yZXBsYWNlQWxsKCIgIiwgIl8iKSk7CiAJCQl9Ci0JCQkvLyBBc3NpZ24gdXNlciByb2xlIGZvciBhbiBhcHBsaWNhdGlvbiBpbiBleHRlcm5hbCBhY2Nlc3Mgc3lzdGVtCi0JCQlTdHJpbmcgdXNlclJvbGUgPSBtYXBwZXIud3JpdGVWYWx1ZUFzU3RyaW5nKGV4dFVzZXIpOwotCQkJSHR0cEVudGl0eTxTdHJpbmc+IGVudGl0eSA9IG5ldyBIdHRwRW50aXR5PD4odXNlclJvbGUsIGhlYWRlcnMpOwotCQkJaWYgKGFkZFJvbGUuZ2V0SXNBcHBsaWVkKCkpIHsKLQkJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAiQ29ubmVjdGluZyB0byBleHRlcm5hbCBzeXN0ZW0gYW5kIGFkZGluZyB1c2VyIHJvbGUiLAotCQkJCQkJYWRkUm9sZS5nZXRSb2xlTmFtZSgpKTsKLQkJCQlSZXNwb25zZUVudGl0eTxTdHJpbmc+IGFkZFJlc3BvbnNlID0gdGVtcGxhdGUuZXhjaGFuZ2UoCi0JCQkJCQlTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VUkwpICsgInVzZXJSb2xlIiwKLQkJCQkJCUh0dHBNZXRob2QuUE9TVCwgZW50aXR5LCBTdHJpbmcuY2xhc3MpOwotCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJDb25uZWN0ZWQgdG8gZXh0ZXJuYWwgc3lzdGVtIGFuZCBhZGRlZCB1c2VyIHJvbGUiLAotCQkJCQkJZ2V0UmVzcG9uc2UuZ2V0Qm9keSgpLCBhZGRSb2xlLmdldFJvbGVOYW1lKCkpOwotCQkJCWlmIChhZGRSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkudmFsdWUoKSAhPSAyMDEpIHsKKwkJCUxpc3Q8Um9sZUluQXBwRm9yVXNlcj4gcm9sZUluQXBwVXNlck5vbkR1cGxzID0gcm9sZUluQXBwVXNlci5zdHJlYW0oKS5kaXN0aW5jdCgpCisJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJZmluYWwgTWFwPFN0cmluZywgUm9sZUluQXBwRm9yVXNlcj4gY3VycmVudFVzZXJSb2xlc1RvVXBkYXRlID0gbmV3IEhhc2hNYXA8PigpOworCQkJZm9yIChSb2xlSW5BcHBGb3JVc2VyIHJvbGVJbkFwcFVzZXJOZXcgOiByb2xlSW5BcHBVc2VyKSB7CisJCQkJY3VycmVudFVzZXJSb2xlc1RvVXBkYXRlLnB1dChyb2xlSW5BcHBVc2VyTmV3LmdldFJvbGVOYW1lKCksIHJvbGVJbkFwcFVzZXJOZXcpOworCQkJfQorCQkJZmluYWwgTWFwPFN0cmluZywgRXh0ZXJuYWxBY2Nlc3NVc2VyUm9sZURldGFpbD4gY3VycmVudFVzZXJSb2xlc0luRXh0ZXJuYWxTeXN0ZW0gPSBuZXcgSGFzaE1hcDw+KCk7CisJCQlmb3IgKEV4dGVybmFsQWNjZXNzVXNlclJvbGVEZXRhaWwgZXh0QWNjZXNzVXNlclJvbGUgOiB1c2VyUm9sZURldGFpbExpc3QpIHsKKwkJCQljdXJyZW50VXNlclJvbGVzSW5FeHRlcm5hbFN5c3RlbS5wdXQoZXh0QWNjZXNzVXNlclJvbGUuZ2V0TmFtZSgpLCBleHRBY2Nlc3NVc2VyUm9sZSk7CisJCQl9CisJCQkvLyBDaGVjayBpZiByb2xlcyBkb2VzIG5vdCBleGlzdHMgaW4gbG9jYWwgYnV0IHN0aWxsIHRoZXJlIGluIEV4dGVybmFsIENlbnRyYWwgQXV0aCBTeXN0ZW0gZGVsZXRlIHRoZW0gYWxsCisJCQlmb3IgKEV4dGVybmFsQWNjZXNzVXNlclJvbGVEZXRhaWwgdXNlclJvbGUgOiB1c2VyUm9sZURldGFpbExpc3QpIHsKKwkJCQlpZiAoIShjdXJyZW50VXNlclJvbGVzVG9VcGRhdGUKKwkJCQkJCS5jb250YWluc0tleSh1c2VyUm9sZS5nZXROYW1lKCkuc3Vic3RyaW5nKGFwcC5nZXROYW1lU3BhY2UoKS5sZW5ndGgoKSArIDEpLnJlcGxhY2VBbGwoIl8iLCAiICIpKQorCQkJCQkJfHwgY3VycmVudFVzZXJSb2xlc1RvVXBkYXRlCisJCQkJCQkJCS5jb250YWluc0tleSh1c2VyUm9sZS5nZXROYW1lKCkuc3Vic3RyaW5nKGFwcC5nZXROYW1lU3BhY2UoKS5sZW5ndGgoKSArIDEpKSkpIHsKKwkJCQkJSHR0cEVudGl0eTxTdHJpbmc+IGVudGl0eSA9IG5ldyBIdHRwRW50aXR5PD4oaGVhZGVycyk7CiAJCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsCi0JCQkJCQkJIkNvbm5lY3RlZCB0byBleHRlcm5hbCBzeXN0ZW0gdW5hYmxlIHRvIHNhdmUgdXNlciByb2xlIiwgZ2V0UmVzcG9uc2UuZ2V0Qm9keSgpLAotCQkJCQkJCWFkZFJvbGUuZ2V0Um9sZU5hbWUoKSk7Ci0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkZhaWxlZCB0byBhZGQgdXNlciByb2xlIGZvciBhcHBsaWNhdGlvbiIpOworCQkJCQkJCSJ1cGRhdGVVc2VyUm9sZXNJbkV4dGVybmFsU3lzdGVtOiBDb25uZWN0aW5nIHRvIGV4dGVybmFsIHN5c3RlbSB0byBERUxFVEUgdXNlciByb2xlIHt9IiwKKwkJCQkJCQl1c2VyUm9sZSk7CisJCQkJCVJlc3BvbnNlRW50aXR5PFN0cmluZz4gZGVsZXRlUmVzcG9uc2UgPSB0ZW1wbGF0ZS5leGNoYW5nZSgKKwkJCQkJCQlTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VUkwpCisJCQkJCQkJCQkrICJ1c2VyUm9sZS8iICsgbmFtZSArICIvIiArIHVzZXJSb2xlLmdldE5hbWUoKSwKKwkJCQkJCQlIdHRwTWV0aG9kLkRFTEVURSwgZW50aXR5LCBTdHJpbmcuY2xhc3MpOworCQkJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLAorCQkJCQkJCSJ1cGRhdGVVc2VyUm9sZXNJbkV4dGVybmFsU3lzdGVtOiBGaW5pc2hlZCBERUxFVEUgb3BlcmF0aW9uIGluIGV4dGVybmFsIHN5c3RlbSBmb3IgdXNlciByb2xlIHt9IGFuZCB0aGUgcmVzcG9uc2UgaXMge30iLAorCQkJCQkJCXVzZXJSb2xlLCBkZWxldGVSZXNwb25zZS5nZXRCb2R5KCkpOwogCQkJCX0KIAkJCX0KLQkJfQotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJbG9nZ2VyLmVycm9yKEVFTEZMb2dnZXJEZWxlZ2F0ZS5lcnJvckxvZ2dlciwgIkZhaWxlZCB0byBhZGQgdXNlciByb2xlIGZvciBhcHBsaWNhdGlvbiB7fSIsIGFwcC5nZXRJZCgpLGUpOworCQkJLy8gQ2hlY2sgaWYgdXNlciByb2xlcyBkb2VzIG5vdCBleGlzdHMgaW4gRXh0ZXJuYWwgQ2VudHJhbCBBdXRoIFN5c3RlbSBhZGQgdGhlbSBhbGwKKwkJCWZvciAoUm9sZUluQXBwRm9yVXNlciBhZGRVc2VyUm9sZSA6IHJvbGVJbkFwcFVzZXJOb25EdXBscykgeworCQkJCWlmICghKGN1cnJlbnRVc2VyUm9sZXNJbkV4dGVybmFsU3lzdGVtCisJCQkJCQkuY29udGFpbnNLZXkoYXBwLmdldE5hbWVTcGFjZSgpICsgIi4iICsgYWRkVXNlclJvbGUuZ2V0Um9sZU5hbWUoKS5yZXBsYWNlQWxsKCIgIiwgIl8iKSkpKSB7CisJCQkJCUV4dGVybmFsQWNjZXNzVXNlciBleHRVc2VyID0gbmV3IEV4dGVybmFsQWNjZXNzVXNlcihuYW1lLAorCQkJCQkJCWFwcC5nZXROYW1lU3BhY2UoKSArICIuIiArIGFkZFVzZXJSb2xlLmdldFJvbGVOYW1lKCkucmVwbGFjZUFsbCgiICIsICJfIikpOworCQkJCQlTdHJpbmcgZm9ybWF0dGVkVXNlclJvbGUgPSBtYXBwZXIud3JpdGVWYWx1ZUFzU3RyaW5nKGV4dFVzZXIpOworCQkJCQlIdHRwRW50aXR5PFN0cmluZz4gZW50aXR5ID0gbmV3IEh0dHBFbnRpdHk8Pihmb3JtYXR0ZWRVc2VyUm9sZSwgaGVhZGVycyk7CisJCQkJCWxvZ2dlci5kZWJ1ZyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJ1cGRhdGVVc2VyUm9sZXNJbkV4dGVybmFsU3lzdGVtOiBDb25uZWN0aW5nIHRvIGV4dGVybmFsIHN5c3RlbSBhbmQgYWRkaW5nIHVzZXIgcm9sZSIsCisJCQkJCQkJYWRkVXNlclJvbGUuZ2V0Um9sZU5hbWUoKSk7CisJCQkJCVJlc3BvbnNlRW50aXR5PFN0cmluZz4gYWRkUmVzcG9uc2UgPSB0ZW1wbGF0ZQorCQkJCQkJCS5leGNoYW5nZShTeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KEVQQ29tbW9uU3lzdGVtUHJvcGVydGllcy5FWFRFUk5BTF9DRU5UUkFMX0FDQ0VTU19VUkwpCisJCQkJCQkJCQkrICJ1c2VyUm9sZSIsIEh0dHBNZXRob2QuUE9TVCwgZW50aXR5LCBTdHJpbmcuY2xhc3MpOworCQkJCQlsb2dnZXIuZGVidWcoRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLAorCQkJCQkJCSJ1cGRhdGVVc2VyUm9sZXNJbkV4dGVybmFsU3lzdGVtOiBGaW5pc2hlZCBhZGRpbmcgdXNlciByb2xlIGluIGV4dGVybmFsIHN5c3RlbSB7fSBhbmQgYWRkZWQgdXNlciByb2xlIHt9IiwKKwkJCQkJCQlnZXRSZXNwb25zZS5nZXRCb2R5KCksIGFkZFVzZXJSb2xlLmdldFJvbGVOYW1lKCkpOworCQkJCQlpZiAoYWRkUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLnZhbHVlKCkgIT0gMjAxICYmIGFkZFJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKS52YWx1ZSgpICE9IDQwNCkgeworCQkJCQkJbG9nZ2VyLmRlYnVnKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwKKwkJCQkJCQkJIkZpbmlzaGVkIFBPU1Qgb3BlcmF0aW9uIGluIGV4dGVybmFsIHN5c3RlbSBidXQgdW5hYmxlIHRvIHNhdmUgdXNlciByb2xlIiwgZ2V0UmVzcG9uc2UuZ2V0Qm9keSgpLAorCQkJCQkJCQlhZGRVc2VyUm9sZS5nZXRSb2xlTmFtZSgpKTsKKwkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oYWRkUmVzcG9uc2UuZ2V0Qm9keSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJ1cGRhdGVVc2VyUm9sZXNJbkV4dGVybmFsU3lzdGVtOiBGYWlsZWQgdG8gYWRkIHVzZXIgcm9sZSBmb3IgYXBwbGljYXRpb24ge30gZHVlIHRvIHt9IiwgYXBwLmdldElkKCksIGUpOwogCQl9CiAKIAl9CkBAIC0xMjcyLDIwICsxMjc1LDIyIEBACiAJCQkJCQkJLmV4ZWN1dGVOYW1lZFF1ZXJ5KCJ1c2VyQXBwUm9sZXNSZXF1ZXN0TGlzdCIsIHBhcmFtcywgbnVsbCk7CiAJCQkJCWVwUmVxdWVzdElkU2l6ZSA9IGVwUmVxdWVzdElkLnNpemUoKTsKIAkJCQl9CisJCQkJCisJCQkJLy9JZiBOb24tQ2VudHJhbGl6ZWQgYXBwIG1ha2Ugc3VyZSB5b3Ugc3luYyBhcHAgcm9sZXMgYmVmb3JlIGFzc2lnbmluZyB0byB1c2VyCiAJCQkJaWYoIWFwcC5nZXRJZCgpLmVxdWFscyhQb3J0YWxDb25zdGFudHMuUE9SVEFMX0FQUF9JRCkgJiYgIWFwcC5nZXRDZW50cmFsQXV0aCgpKXsJCiAJCQkJRWNvbXBSb2xlW10gYXBwUm9sZXMgPSBhcHBsaWNhdGlvbnNSZXN0Q2xpZW50U2VydmljZS5nZXQoRWNvbXBSb2xlW10uY2xhc3MsIGFwcC5nZXRJZCgpLCAiL3JvbGVzIik7CiAJCQkJc3luY0FwcFJvbGVzKHNlc3Npb25GYWN0b3J5LCBhcHAuZ2V0SWQoKSwgYXBwUm9sZXMpOwogCQkJCX0KLQkJCQkKIAkJCQlMaXN0PFJvbGVJbkFwcEZvclVzZXI+IHJvbGVJbkFwcEZvclVzZXJMaXN0ID0gcm9sZUluQXBwRm9yVXNlckxpc3QobmV3QXBwUm9sZXNGb3JVc2VyLmdldFJvbGVzKCksCiAJCQkJCQlhcHAuZ2V0SWQoKSwgYXBwLmdldE1sQXBwTmFtZSgpKTsKIAkJCQlMaXN0PEVjb21wVXNlckFwcFJvbGVzPiB1c2VyUm9sZUxpc3QgPSBudWxsOwotCQkJCWlmKHVzZXJJZCAhPSBudWxsKXsKKwkJCQlpZighdXNlckluZm8uaXNFbXB0eSgpKXsKIAkJCQlmaW5hbCBNYXA8U3RyaW5nLCBMb25nPiBhcHBQYXJhbXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAJCQkJYXBwUGFyYW1zLnB1dCgidXNlcklkIiwgdXNlcklkLmdldElkKCkpOwogCQkJCWFwcFBhcmFtcy5wdXQoImFwcElkIiwgYXBwLmdldElkKCkpOwogCQkJCXVzZXJSb2xlTGlzdCA9IGRhdGFBY2Nlc3NTZXJ2aWNlLmV4ZWN1dGVOYW1lZFF1ZXJ5KCJnZXRVc2VyQXBwRXhpc3RpbmdSb2xlcyIsIGFwcFBhcmFtcywgbnVsbCk7CiAJCQkJfQorCQkJCS8vIENoZWNrIGlmIGxpc3QgY29udGFpbnMganVzdCBhY2NvdW50IGFkbWluIHJvbGUKIAkJCQlib29sZWFuIGNoZWNrSWZBZG1pblJvbGVFeGlzdHMgPSBmYWxzZTsKIAkJCQlpZiAocmVxVHlwZS5lcXVhbHMoIkRFTEVURSIpKSB7CiAJCQkJCWNoZWNrSWZBZG1pblJvbGVFeGlzdHMgPSB1c2VyUm9sZUxpc3Quc3RyZWFtKCkKQEAgLTEyOTgsOCArMTMwMyw5IEBACiAJCQkJaWYgKGFwcC5nZXRDZW50cmFsQXV0aCgpKSB7CiAJCQkJCS8vIFdlIHNob3VsZCBhZGQgSWYgdXNlciBkb2VzIG5vdCBleGlzdCBpbiByZW1vdGUgYXBwbGljYXRpb24KIAkJCQkJdHJ5IHsKLQkJCQkJCWlmICghKCFhcHAuZ2V0SWQoKS5lcXVhbHMoUG9ydGFsQ29uc3RhbnRzLlBPUlRBTF9BUFBfSUQpICYmIGNoZWNrSWZBZG1pblJvbGVFeGlzdHMKLQkJCQkJCQkJJiYgKHJvbGVJbkFwcEZvclVzZXJMaXN0LnNpemUoKSA9PSAxIHx8IHJlcVR5cGUuZXF1YWxzKCJERUxFVEUiKSkpKSB7CisJCQkJCQkvLyBJZiBhZGRpbmcganVzdCBhY2NvdW50IGFkbWluIHJvbGUgZG9udCBtYWtlIHJlbW90ZSBhcHBsaWNhdGlvbiB1c2VyIGNhbGwKKwkJCQkJCWlmICghYXBwLmdldElkKCkuZXF1YWxzKFBvcnRhbENvbnN0YW50cy5QT1JUQUxfQVBQX0lEKSAmJiAhKGNoZWNrSWZBZG1pblJvbGVFeGlzdHMKKwkJCQkJCQkJJiYgcmVxVHlwZS5lcXVhbHMoIkRFTEVURSIpKSAmJiByb2xlSW5BcHBGb3JVc2VyTGlzdC5zaXplKCkgPiAxKSB7CiAJCQkJCQkJRVBVc2VyIHJlbW90ZUFwcFVzZXIgPSBudWxsOwogCQkJCQkJCXJlbW90ZUFwcFVzZXIgPSBjaGVja0lmUmVtb3RlVXNlckV4aXRzKHVzZXJJZC5nZXRPcmdVc2VySWQoKSwgYXBwLAogCQkJCQkJCQkJYXBwbGljYXRpb25zUmVzdENsaWVudFNlcnZpY2UpOwpAQCAtMTMxMSw3ICsxMzE3LDcgQEAKIAkJCQkJCX0KIAkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJCQkJCXJlcU1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJGYWlsZWQgdG8gYWRkZWQgcmVtb3RlIHVzZXIiLCBlKTsKKwkJCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsICJzZXRFeHRlcm5hbFJlcXVlc3RVc2VyQXBwUm9sZTogRmFpbGVkIHRvIGFkZGVkIHJlbW90ZSB1c2VyIiwgZSk7CiAJCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHJlcU1lc3NhZ2UpOwogCQkJCQl9CiAJCQkJCVNldDxFY29tcFJvbGU+IHVzZXJSb2xlc0luTG9jYWxBcHAgPSBwb3N0VXNlcnNSb2xlc1RvTG9jYWxBcHAocm9sZUluQXBwRm9yVXNlckxpc3QsIG1hcHBlciwKQEAgLTEzMjAsOCArMTMyNiw4IEBACiAJCQkJCQkJdXNlclJvbGVzSW5Mb2NhbEFwcCk7CiAJCQkJCUxpc3Q8Um9sZUluQXBwRm9yVXNlcj4gcm9sZUFwcFVzZXJMaXN0ID0gcm9sZXNJbkFwcEZvclVzZXIucm9sZXM7CiAJCQkJCS8vIEFwcGx5IGNoYW5nZXMgaW4gZXh0ZXJuYWwgQWNjZXNzIHN5c3RlbQotCQkJCQl1cGRhdGVVc2VyUm9sZXNJbkV4dGVybmFsU3lzdGVtKGFwcCwgcm9sZXNJbkFwcEZvclVzZXIub3JnVXNlcklkLCByb2xlQXBwVXNlckxpc3QpOwotCQkJCQlsb2dnZXIuaW5mbyhFRUxGTG9nZ2VyRGVsZWdhdGUuZGVidWdMb2dnZXIsICJ7fSB1c2VyIGFwcCByb2xlczogZm9yIGFwcCB7fSwgdXNlciB7fSIsIGxvZ01lc3NhZ2UsCisJCQkJCXVwZGF0ZVVzZXJSb2xlc0luRXh0ZXJuYWxTeXN0ZW0oYXBwLCByb2xlc0luQXBwRm9yVXNlci5vcmdVc2VySWQsIHJvbGVBcHBVc2VyTGlzdCwgZXh0ZXJuYWxTeXN0ZW1SZXF1ZXN0KTsKKwkJCQkJbG9nZ2VyLmluZm8oRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAic2V0RXh0ZXJuYWxSZXF1ZXN0VXNlckFwcFJvbGU6IHt9IHVzZXIgYXBwIHJvbGVzOiBmb3IgYXBwIHt9LCB1c2VyIHt9IiwgbG9nTWVzc2FnZSwKIAkJCQkJCQluZXdBcHBSb2xlc0ZvclVzZXIuZ2V0QXBwbGljYXRpb25OYW1lKCksIG5ld0FwcFJvbGVzRm9yVXNlci5nZXRMb2dpbklkKCkpOwogCQkJCQlyZXN1bHQgPSBhcHBseUNoYW5nZXNJblVzZXJSb2xlc0ZvckFwcFRvRWNvbXBEQihyb2xlc0luQXBwRm9yVXNlciwgZXh0ZXJuYWxTeXN0ZW1SZXF1ZXN0LCByZXFUeXBlKTsKIAkJCQl9IApAQCAtMTMzMyw3ICsxMzM5LDcgQEAKIAkJCQkJCQl1c2VyUm9sZXNJbkxvY2FsQXBwKTsKIAkJCQkJcmVzdWx0ID0gYXBwbHlDaGFuZ2VzSW5Vc2VyUm9sZXNGb3JBcHBUb0Vjb21wREIocm9sZXNJbkFwcEZvclVzZXIsIGV4dGVybmFsU3lzdGVtUmVxdWVzdCwgcmVxVHlwZSk7CiAJCQkJfSBlbHNlIHsvLyByZW1vdGUgYXBwCi0JCQkJCQorCQkJCQkvLyBJZiBhZGRpbmcganVzdCBhY2NvdW50IGFkbWluIHJvbGUgZG9uJ3QgZG8gcmVtb3RlIGFwcGxpY2F0aW9uIHVzZXIgY2FsbAogCQkJCQlpZighKChyb2xlSW5BcHBGb3JVc2VyTGlzdC5zaXplKCkgPT0gMSB8fCByZXFUeXBlLmVxdWFscygiREVMRVRFIikpICYmIGNoZWNrSWZBZG1pblJvbGVFeGlzdHMpKXsKIAkJCQkJRVBVc2VyIHJlbW90ZUFwcFVzZXIgPSBudWxsOwogCQkJCQkJcmVtb3RlQXBwVXNlciA9IGNoZWNrSWZSZW1vdGVVc2VyRXhpdHModXNlcklkLmdldE9yZ1VzZXJJZCgpLCBhcHAsIGFwcGxpY2F0aW9uc1Jlc3RDbGllbnRTZXJ2aWNlKTsKQEAgLTEzNDcsNyArMTM1Myw3IEBACiAKIAkJCQkJCQlSb2xlc0luQXBwRm9yVXNlciByb2xlc0luQXBwRm9yVXNlciA9IGNvbnN0cnVjdFJvbGVzSW5BcHBGb3JVc2VyVXBkYXRlKG9yZ1VzZXJJZCwKIAkJCQkJCQkJCWFwcC5nZXRJZCgpLCB1c2VyUm9sZXNJblJlbW90ZUFwcCk7Ci0JCQkJCQkJbG9nZ2VyLmluZm8oRUVMRkxvZ2dlckRlbGVnYXRlLmRlYnVnTG9nZ2VyLCAie30gdXNlciBhcHAgcm9sZXM6IGZvciBhcHAge30sIHVzZXIge30iLAorCQkJCQkJCWxvZ2dlci5pbmZvKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgInNldEV4dGVybmFsUmVxdWVzdFVzZXJBcHBSb2xlOiB7fSB1c2VyIGFwcCByb2xlczogZm9yIGFwcCB7fSwgdXNlciB7fSIsCiAJCQkJCQkJCQlsb2dNZXNzYWdlLCBuZXdBcHBSb2xlc0ZvclVzZXIuZ2V0QXBwbGljYXRpb25OYW1lKCksCiAJCQkJCQkJCQluZXdBcHBSb2xlc0ZvclVzZXIuZ2V0TG9naW5JZCgpKTsKIAkJCQkJCQlyZXN1bHQgPSBhcHBseUNoYW5nZXNJblVzZXJSb2xlc0ZvckFwcFRvRWNvbXBEQihyb2xlc0luQXBwRm9yVXNlciwgZXh0ZXJuYWxTeXN0ZW1SZXF1ZXN0LApAQCAtMTM2MywxNCArMTM2OSwxNSBAQAogCQkJCQkJCX0qLwogCQkJCQkJfQogCQkJCQl9IGVsc2UgewotCQkJCQkJaWYoIShyZXFUeXBlLmVxdWFscygiREVMRVRFIikgJiYgdXNlcklkID09IG51bGwpKXsKKwkJCQkJCS8vIEhlcmUgd2UgYXJlIGFkZGluZyBvbmx5IHdlIGhhdmUgc2luZ2xlIGFjY291bnQgYWRtaW4gaW4gcm9sZUluQXBwRm9yVXNlckxpc3QgYW5kIHRoaXMgc2hvdWxkIG5vdCBhZGQgaW4gcmVtb3RlIAorCQkJCQkJaWYoIShyZXFUeXBlLmVxdWFscygiREVMRVRFIikpICYmIHVzZXJJbmZvLmlzRW1wdHkoKSl7CiAJCQkJCQkJcmVxTWVzc2FnZSA9ICJTYXZlZCBTdWNjZXNzZnVsbHkiOwogCQkJCQkJfQogCQkJCQkJU2V0PEVjb21wUm9sZT4gdXNlclJvbGVzSW5SZW1vdGVBcHAgPSBjb25zdHJ1Y3RVc2Vyc0Vjb21wUm9sZXMocm9sZUluQXBwRm9yVXNlckxpc3QpOwogCiAJCQkJCQlSb2xlc0luQXBwRm9yVXNlciByb2xlc0luQXBwRm9yVXNlciA9IGNvbnN0cnVjdFJvbGVzSW5BcHBGb3JVc2VyVXBkYXRlKG9yZ1VzZXJJZCwgYXBwLmdldElkKCksCiAJCQkJCQkJCXVzZXJSb2xlc0luUmVtb3RlQXBwKTsKLQkJCQkJCWxvZ2dlci5pbmZvKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgInt9IHVzZXIgYXBwIHJvbGVzOiBmb3IgYXBwIHt9LCB1c2VyIHt9IiwKKwkJCQkJCWxvZ2dlci5pbmZvKEVFTEZMb2dnZXJEZWxlZ2F0ZS5kZWJ1Z0xvZ2dlciwgInNldEV4dGVybmFsUmVxdWVzdFVzZXJBcHBSb2xlOiB7fSB1c2VyIGFwcCByb2xlczogZm9yIGFwcCB7fSwgdXNlciB7fSIsCiAJCQkJCQkJCWxvZ01lc3NhZ2UsIG5ld0FwcFJvbGVzRm9yVXNlci5nZXRBcHBsaWNhdGlvbk5hbWUoKSwgbmV3QXBwUm9sZXNGb3JVc2VyLmdldExvZ2luSWQoKSk7CiAJCQkJCQlyZXN1bHQgPSBhcHBseUNoYW5nZXNJblVzZXJSb2xlc0ZvckFwcFRvRWNvbXBEQihyb2xlc0luQXBwRm9yVXNlciwgZXh0ZXJuYWxTeXN0ZW1SZXF1ZXN0LAogCQkJCQkJCQlyZXFUeXBlKTsKQEAgLTEzODQsNyArMTM5MSw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIG9yIHVwZGF0ZSB1c2VyIHJvbGVzIGZvciBVc2VyICVzLCBBcHBJZCAlcyIsCisJCQkJU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KCJzZXRFeHRlcm5hbFJlcXVlc3RVc2VyQXBwUm9sZTogRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIG9yIHVwZGF0ZSB1c2VyIHJvbGVzIGZvciBVc2VyICVzLCBBcHBJZCAlcyIsCiAJCQkJCQlvcmdVc2VySWQsIGFwcE5hbWUpOwogCQkJCWxvZ2dlci5lcnJvcihFRUxGTG9nZ2VyRGVsZWdhdGUuZXJyb3JMb2dnZXIsIG1lc3NhZ2UsIGUpOwogCQkJCXJlc3VsdCA9IGZhbHNlOwpAQCAtMTU0Nyw2ICsxNTU0LDggQEAKIAkJCUVjb21wUm9sZVtdIGFwcFJvbGVzID0gbnVsbDsKIAkJCUxpc3Q8RWNvbXBSb2xlPiByb2xlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQkJaWYoYXBwLmdldENlbnRyYWxBdXRoKCkpeworCQkJCS8vU3luYyBhcHBsaWNhdGlvbiByb2xlcyBmcm9tIEV4dGVybmFsIEFjY2VzcyBTeXN0ZW0KKwkJCQlleHRlcm5hbEFjY2Vzc1JvbGVzU2VydmljZS5zeW5jQXBwbGljYXRpb25Sb2xlc1dpdGhFY29tcERCKGFwcCk7CiAJCQkJTGlzdDxFUFJvbGU+IGFwcGxpY2F0aW9uUm9sZXMgPSBkYXRhQWNjZXNzU2VydmljZS5nZXRMaXN0KEVQUm9sZS5jbGFzcywgIiB3aGVyZSBhcHBfaWQgPSAiK2FwcC5nZXRJZCgpKyAiIGFuZCBhY3RpdmVfeW4gPSAnWSciLCBudWxsLCBudWxsKTs7CiAJCQkJZm9yKEVQUm9sZSByb2xlIDogYXBwbGljYXRpb25Sb2xlcyl7CiAJCQkJCUVjb21wUm9sZSBlY29tcFJvbGUgPSBuZXcgRWNvbXBSb2xlKCk7CmRpZmYgLS1naXQgYS9lY29tcC1wb3J0YWwtRkUtY29tbW9uL2NsaWVudC9hcHAvdmlld3Mvd2lkZ2V0LW9uYm9hcmRpbmcvd2lkZ2V0LW9uYm9hcmRpbmcubGVzcyBiL2Vjb21wLXBvcnRhbC1GRS1jb21tb24vY2xpZW50L2FwcC92aWV3cy93aWRnZXQtb25ib2FyZGluZy93aWRnZXQtb25ib2FyZGluZy5sZXNzCmluZGV4IDYwODVhOTAuLjdiZTBkNDcgMTAwNjQ0Ci0tLSBhL2Vjb21wLXBvcnRhbC1GRS1jb21tb24vY2xpZW50L2FwcC92aWV3cy93aWRnZXQtb25ib2FyZGluZy93aWRnZXQtb25ib2FyZGluZy5sZXNzCisrKyBiL2Vjb21wLXBvcnRhbC1GRS1jb21tb24vY2xpZW50L2FwcC92aWV3cy93aWRnZXQtb25ib2FyZGluZy93aWRnZXQtb25ib2FyZGluZy5sZXNzCkBAIC0zNCw1ICszNCw4IEBACiB7CiBtYXJnaW4tYm90dG9tOiA4cHg7CiB9CitpbnB1dC50YWJsZS1zZWFyY2h7CisJZm9udC1zdHlsZTogbm9ybWFsOworfQogCiB9CmRpZmYgLS1naXQgYS9lY29tcC1wb3J0YWwtRkUtY29tbW9uL2NsaWVudC9hcHAvdmlld3Mvd2lkZ2V0LW9uYm9hcmRpbmcvd2lkZ2V0LW9uYm9hcmRpbmcudHBsLmh0bWwgYi9lY29tcC1wb3J0YWwtRkUtY29tbW9uL2NsaWVudC9hcHAvdmlld3Mvd2lkZ2V0LW9uYm9hcmRpbmcvd2lkZ2V0LW9uYm9hcmRpbmcudHBsLmh0bWwKaW5kZXggYWFlMGZkNy4uYWViNDQ2OCAxMDA2NDQKLS0tIGEvZWNvbXAtcG9ydGFsLUZFLWNvbW1vbi9jbGllbnQvYXBwL3ZpZXdzL3dpZGdldC1vbmJvYXJkaW5nL3dpZGdldC1vbmJvYXJkaW5nLnRwbC5odG1sCisrKyBiL2Vjb21wLXBvcnRhbC1GRS1jb21tb24vY2xpZW50L2FwcC92aWV3cy93aWRnZXQtb25ib2FyZGluZy93aWRnZXQtb25ib2FyZGluZy50cGwuaHRtbApAQCAtMzYsMTAgKzM2LDEwIEBACiAJCQkJCQkJPC9zZWxlY3Q+CiAJCQkJCQk8L2Rpdj4KIAkJCQkJPC9kaXY+Ci0JCQkJCTxpbnB1dCBjbGFzcz0idGFibGUtc2VhcmNoIiB0eXBlPSJ0ZXh0IgorIAkJCQkJPGlucHV0IGNsYXNzPSJ0YWJsZS1zZWFyY2giIHR5cGU9InRleHQiCiAJCQkJCQlpZD0id2lkZ2V0LW9uYm9hcmRpbmctdGFibGUtc2VhcmNoIgogCQkJCQkJcGxhY2Vob2xkZXI9IlNlYXJjaCBpbiBlbnRpcmUgdGFibGUiCi0JCQkJCQluZy1tb2RlbD0id2lkZ2V0T25ib2FyZGluZy5zZWFyY2hTdHJpbmciIC8+CisJCQkJCQlkYXRhLW5nLW1vZGVsPSJ3aWRnZXRPbmJvYXJkaW5nLnNlYXJjaFN0cmluZyIgLz4gCiAKIAkJCQkJPGJ1dHRvbiBpZD0id2lkZ2V0LW9uYm9hcmRpbmctYnV0dG9uLWFkZCIKIAkJCQkJCWNsYXNzPSJidG4gYnRuLWFsdCBidG4tc21hbGwiCkBAIC01NSw3ICs1NSw3IEBACiAJCQkJCTxkaXYgbmctaGlkZT0id2lkZ2V0T25ib2FyZGluZy5pc0NvbW1FcnJvciI+CiAJCQkJCQk8ZGl2IGIyYi10YWJsZSB0YWJsZS1kYXRhPSJwb3J0YWxBZG1pbi5wb3J0YWxBZG1pbnNUYWJsZURhdGEiCiAJCQkJCQkJbmctaGlkZT0id2lkZ2V0T25ib2FyZGluZy5pc0xvYWRpbmdUYWJsZSIKLQkJCQkJCQlzZWFyY2gtc3RyaW5nPSJwb3J0YWxBZG1pbi5zZWFyY2hTdHJpbmciIGNsYXNzPSJiMmItdGFibGUtZGl2Ij4KKwkJCQkJCQlzZWFyY2gtc3RyaW5nPSJ3aWRnZXRPbmJvYXJkaW5nLnNlYXJjaFN0cmluZyIgY2xhc3M9ImIyYi10YWJsZS1kaXYiPgogCQkJCQkJCTx0YWJsZT4KIAkJCQkJCQkJPHRoZWFkIGIyYi10YWJsZS1yb3cgdHlwZT0iaGVhZGVyIj4KIAkJCQkJCQkJCTx0cj4K