ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDE3ZTRhYjMuLjIzMzM2OWIgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMTUsMTQgKzE1LDE4IEBACiB0ZXN0cy9kZXBlbmRlbmNpZXMvamFyUHJvamVjdC9idWlsZAogdGVzdHMvZmxhdm9ybGliLyovYnVpbGQKIHRlc3RzL2ZsYXZvcmxpYldpdGhGYWlsZWRUZXN0cy8qL2J1aWxkCit0ZXN0cy9saWJQcm9ndWFyZEphckRlcC8qL2J1aWxkCit0ZXN0cy9saWJQcm9ndWFyZExpYkRlcC8qL2J1aWxkCiB0ZXN0cy9saWJzVGVzdC8qL2J1aWxkCiB0ZXN0cy9tdWx0aXByb2plY3QvKi9idWlsZAogdGVzdHMvbG9jYWxKYXJzLyovYnVpbGQKK3Rlc3RzL25ka0puaUxpYi8qL2J1aWxkCiB0ZXN0cy9wcm9ndWFyZExpYi8qL2J1aWxkCiB0ZXN0cy9yZW5kZXJzY3JpcHRJbkxpYi8qL2J1aWxkCiB0ZXN0cy9yZXBvLyovYnVpbGQKIHRlc3RzL3NhbWVOYW1lZExpYnMvKi9idWlsZAogdGVzdHMvc2FtZU5hbWVkTGlicy8qLyovYnVpbGQKIHRlc3RzL3RpY3RhY3RvZS8qL2J1aWxkCitsaW50LXJlc3VsdHMKIC9yZXBvCiAvb3V0CmRpZmYgLS1naXQgYS9idWlsZC5ncmFkbGUgYi9idWlsZC5ncmFkbGUKaW5kZXggMTQ1ZGI3Yi4uYjQ0MGM3ZiAxMDA2NDQKLS0tIGEvYnVpbGQuZ3JhZGxlCisrKyBiL2J1aWxkLmdyYWRsZQpAQCAtMjIsNiArMjIsOCBAQAogLy8gcm9vdFByb2plY3QuYnVpbGREaXIgaXMgc3BlY2lmaWMgdG8gdGhpcyBncmFkbGUgYnVpbGQuCiBidWlsZERpciA9IG5ldyBGaWxlKGZpbGUoZXh0LmFuZHJvaWRIb3N0T3V0KSwgInRvb2xzL2J1aWxkL2J1aWxkIikKIAorZXh0LmxvY2FsUmVwbyA9IHByb2plY3QuaGFzUHJvcGVydHkoJ2xvY2FsUmVwbycpID8gbG9jYWxSZXBvIDogIiRleHQuYW5kcm9pZEhvc3RPdXQvcmVwbyIKKwogc3VicHJvamVjdHMgewogICAgIC8vIENoYW5nZSBidWlsZERpciBmaXJzdCBzbyB0aGF0IGFsbCBwbHVnaW5zIHBpY2sgdXAgdGhlIG5ldyB2YWx1ZS4KICAgICBwcm9qZWN0LmJ1aWxkRGlyID0gcHJvamVjdC5maWxlKCIkcHJvamVjdC5wYXJlbnQuYnVpbGREaXIvLi4vJHByb2plY3QubmFtZSIpCkBAIC00NCw3ICs0Niw3IEBACiAgICAgfQogCiAgICAgcHJvamVjdC5leHQgewotICAgICAgICBiYXNlVmVyc2lvbiA9ICcwLjUuMCcKKyAgICAgICAgYmFzZVZlcnNpb24gPSAnMC43LjAnCiAgICAgfQogCiAgICAgdGFzayBkaXNhYmxlVGVzdEZhaWx1cmVzIDw8IHsKZGlmZiAtLWdpdCBhL2J1aWxkZXItbW9kZWwvYnVpbGQuZ3JhZGxlIGIvYnVpbGRlci1tb2RlbC9idWlsZC5ncmFkbGUKaW5kZXggMTAwMzJkNi4uM2U3ODBkZiAxMDA2NDQKLS0tIGEvYnVpbGRlci1tb2RlbC9idWlsZC5ncmFkbGUKKysrIGIvYnVpbGRlci1tb2RlbC9idWlsZC5ncmFkbGUKQEAgLTEsMTEwICsxLDE2IEBACiBhcHBseSBwbHVnaW46ICdqYXZhJwogYXBwbHkgcGx1Z2luOiAnbWF2ZW4nCi1hcHBseSBwbHVnaW46ICdzaWduaW5nJwogYXBwbHkgcGx1Z2luOiAnY2xvbmUtYXJ0aWZhY3RzJwogCiBkZXBlbmRlbmNpZXMgewogICAgIGNvbXBpbGUgImNvbS5hbmRyb2lkLnRvb2xzOmNvbW1vbjokcHJvamVjdC5leHQuYmFzZUFuZHJvaWRWZXJzaW9uIgogfQogCi1kZWYgZ2V0VmVyc2lvbigpIHsKLSAgICBpZiAocHJvamVjdC5oYXMoInJlbGVhc2UiKSkgewotICAgICAgICByZXR1cm4gcHJvamVjdC5leHQuYmFzZVZlcnNpb24KLSAgICB9Ci0KLSAgICByZXR1cm4gcHJvamVjdC5leHQuYmFzZVZlcnNpb24gKyAnLVNOQVBTSE9UJwotfQotCi12ZXJzaW9uID0gZ2V0VmVyc2lvbigpCiBhcmNoaXZlc0Jhc2VOYW1lID0gJ2J1aWxkZXItbW9kZWwnCitwcm9qZWN0LmV4dC5wb21OYW1lID0gJ0FuZHJvaWQgQnVpbGRlciBNb2RlbCBsaWJyYXJ5JworcHJvamVjdC5leHQucG9tRGVzYyA9ICdNb2RlbCBmb3IgdGhlIEJ1aWxkZXIgbGlicmFyeS4nCisKK2FwcGx5IGZyb206ICcuLi9wdWJsaXNoLmdyYWRsZScKK2FwcGx5IGZyb206ICcuLi9qYXZhZG9jLmdyYWRsZScKIAogamFyLm1hbmlmZXN0LmF0dHJpYnV0ZXMoIk1vZGVsLVZlcnNpb24iOiAiJHZlcnNpb24iKQotCi10YXNrIHB1Ymxpc2hMb2NhbCh0eXBlOiBVcGxvYWQpIHsKLSAgICBjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbnMuYXJjaGl2ZXMKLSAgICByZXBvc2l0b3JpZXMgewotICAgICAgICBtYXZlbkRlcGxveWVyIHsKLSAgICAgICAgICAgIHJlcG9zaXRvcnkodXJsOiB1cmkoIiRyb290UHJvamVjdC5leHQuYW5kcm9pZEhvc3RPdXQvcmVwbyIpKQotICAgICAgICB9Ci0gICAgfQotfQotCi1wcm9qZWN0LmV4dC5zb25hdHlwZVVzZXJuYW1lID0gaGFzUHJvcGVydHkoJ3NvbmF0eXBlVXNlcm5hbWUnKSA/IHNvbmF0eXBlVXNlcm5hbWUgOiAiIgotcHJvamVjdC5leHQuc29uYXR5cGVQYXNzd29yZCA9IGhhc1Byb3BlcnR5KCdzb25hdHlwZVBhc3N3b3JkJykgPyBzb25hdHlwZVBhc3N3b3JkIDogIiIKLQotdXBsb2FkQXJjaGl2ZXMgewotICAgIHJlcG9zaXRvcmllcyB7Ci0gICAgICAgIG1hdmVuRGVwbG95ZXIgewotICAgICAgICAgICAgYmVmb3JlRGVwbG95bWVudCB7IE1hdmVuRGVwbG95bWVudCBkZXBsb3ltZW50IC0+Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9qZWN0LmhhcygicmVsZWFzZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdG9wRXhlY3V0aW9uRXhjZXB0aW9uKCJ1cGxvYWRBcmNoaXZlcyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSByZWxlYXNlLmdyYWRsZSBpbml0IHNjcmlwdCIpCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByb2plY3QuZXh0LnNvbmF0eXBlVXNlcm5hbWUubGVuZ3RoKCkgPT0gMCB8fCBwcm9qZWN0LmV4dC5zb25hdHlwZVBhc3N3b3JkLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3BFeGVjdXRpb25FeGNlcHRpb24oInVwbG9hZEFyY2hpdmVzIGNhbm5vdCBiZSBjYWxsZWQgd2l0aG91dCBzb25hdHlwZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQiKQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNpZ25pbmcuc2lnblBvbShkZXBsb3ltZW50KQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXBvc2l0b3J5KHVybDogImh0dHBzOi8vb3NzLnNvbmF0eXBlLm9yZy9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMi8iKSB7Ci0gICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24odXNlck5hbWU6IHByb2plY3QuZXh0LnNvbmF0eXBlVXNlcm5hbWUsIHBhc3N3b3JkOiBwcm9qZWN0LmV4dC5zb25hdHlwZVBhc3N3b3JkKQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb20ucHJvamVjdCB7Ci0gICAgICAgICAgICAgICAgbmFtZSAnQW5kcm9pZCBCdWlsZGVyIE1vZGVsIGxpYnJhcnknCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gJ01vZGVsIGZvciB0aGUgQnVpbGRlciBsaWJyYXJ5LicKLSAgICAgICAgICAgICAgICB1cmwgJ2h0dHA6Ly90b29scy5hbmRyb2lkLmNvbScKLSAgICAgICAgICAgICAgICBpbmNlcHRpb25ZZWFyICcyMDA3JwotCi0gICAgICAgICAgICAgICAgbGljZW5zZXMgewotICAgICAgICAgICAgICAgICAgICBsaWNlbnNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgJ1RoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAnCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmwgJ2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQnCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24gJ3JlcG8nCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzY20gewotICAgICAgICAgICAgICAgICAgICB1cmwgImh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3Rvb2xzL2J1aWxkIgotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uICJnaXQ6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vdG9vbHMvYnVpbGQuZ2l0IgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXZlbG9wZXJzIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2ZWxvcGVyIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgJ1RoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QnCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGN1c3RvbSB0YXNrcyBmb3IgY3JlYXRpbmcgc291cmNlL2phdmFkb2MgamFycwotdGFzayBzb3VyY2VzSmFyKHR5cGU6IEphciwgZGVwZW5kc09uOmNsYXNzZXMpIHsKLSAgICBjbGFzc2lmaWVyID0gJ3NvdXJjZXMnCi0gICAgZnJvbSBzb3VyY2VTZXRzLm1haW4uYWxsU291cmNlCi19Ci0KLWphdmFkb2MgewotICAgIGV4Y2x1ZGUgICAgICAgICAgICAgICAiKiovaW50ZXJuYWwvKioiCi0gICAgb3B0aW9ucy5tZW1iZXJMZXZlbCA9IG9yZy5ncmFkbGUuZXh0ZXJuYWwuamF2YWRvYy5KYXZhZG9jTWVtYmVyTGV2ZWwuUFJPVEVDVEVECi0KLSAgICB0aXRsZSAgICAgICAgICAgICAgICAgIkFuZHJvaWQgTW9kZWwiCi19Ci0KLXRhc2sgamF2YWRvY0phcih0eXBlOiBKYXIsIGRlcGVuZHNPbjpqYXZhZG9jKSB7Ci0gICAgY2xhc3NpZmllciAgICAgICAgICdqYXZhZG9jJwotICAgIGZyb20gICAgICAgICAgICAgICBqYXZhZG9jLmRlc3RpbmF0aW9uRGlyCi19Ci0gCi0vLyBhZGQgamF2YWRvYy9zb3VyY2UgamFyIHRhc2tzIGFzIGFydGlmYWN0cwotYXJ0aWZhY3RzIHsKLSAgICBhcmNoaXZlcyBqYXIKLSAgICBhcmNoaXZlcyBzb3VyY2VzSmFyCi0gICAgYXJjaGl2ZXMgamF2YWRvY0phcgotfQotCi1zaWduaW5nIHsKLSAgICByZXF1aXJlZCB7IHByb2plY3QuaGFzKCJyZWxlYXNlIikgJiYgZ3JhZGxlLnRhc2tHcmFwaC5oYXNUYXNrKCJ1cGxvYWRBcmNoaXZlcyIpIH0KLSAgICBzaWduIGNvbmZpZ3VyYXRpb25zLmFyY2hpdmVzCi19CmRpZmYgLS1naXQgYS9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9BYXB0T3B0aW9ucy5qYXZhIGIvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQWFwdE9wdGlvbnMuamF2YQppbmRleCA4NjE5MmUwLi40Y2I5YjM2IDEwMDY0NAotLS0gYS9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9BYXB0T3B0aW9ucy5qYXZhCisrKyBiL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL0FhcHRPcHRpb25zLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsOwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKIC8qKgogICogT3B0aW9ucyBmb3IgYWFwdC4KQEAgLTMwLDUgKzMwLDUgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHZhbHVlcyBmb3IgdGhlIC0wIChkaXNhYmxlZCBjb21wcmVzc2lvbikgb3B0aW9uLCBvciBudWxsCiAgICAgICovCi0gICAgTGlzdDxTdHJpbmc+IGdldE5vQ29tcHJlc3MoKTsKKyAgICBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0Tm9Db21wcmVzcygpOwogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQXJ0aWZhY3RJbmZvLmphdmEgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9BbmRyb2lkQXJ0aWZhY3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDc1JQpyZW5hbWUgZnJvbSBidWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9BcnRpZmFjdEluZm8uamF2YQpyZW5hbWUgdG8gYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQW5kcm9pZEFydGlmYWN0LmphdmEKaW5kZXggNGE2ODc1NS4uM2NmZDJmMiAxMDA2NDQKLS0tIGEvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQXJ0aWZhY3RJbmZvLmphdmEKKysrIGIvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQW5kcm9pZEFydGlmYWN0LmphdmEKQEAgLTIwLDEyICsyMCwxMiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCiAvKioKLSAqIFRoZSBpbmZvcm1hdGlvbiBmb3IgYSBnZW5lcmF0ZWQgYXJ0aWZhY3QuCisgKiBUaGUgaW5mb3JtYXRpb24gZm9yIGEgZ2VuZXJhdGVkIEFuZHJvaWQgYXJ0aWZhY3QuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJ0aWZhY3RJbmZvIHsKK3B1YmxpYyBpbnRlcmZhY2UgQW5kcm9pZEFydGlmYWN0IGV4dGVuZHMgQmFzZUFydGlmYWN0IHsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG91dHB1dCBmaWxlIGZvciB0aGlzIGFydGlmYWN0LiBEZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcHJvamVjdCBpcyBhbiBhcHAKQEAgLTczLDEyICs3MywxMCBAQAogICAgIFN0cmluZyBnZXRTb3VyY2VHZW5UYXNrTmFtZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdGFzayB1c2VkIHRvIGdlbmVyYXRlIHRoZSBhcnRpZmFjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRhc2suCisgICAgICogVGhlIGdlbmVyYXRlZCBtYW5pZmVzdCBmb3IgdGhpcyB2YXJpYW50J3MgYXJ0aWZhY3QuCiAgICAgICovCiAgICAgQE5vbk51bGwKLSAgICBTdHJpbmcgZ2V0QXNzZW1ibGVUYXNrTmFtZSgpOworICAgIEZpbGUgZ2V0R2VuZXJhdGVkTWFuaWZlc3QoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYWxsIHRoZSBzb3VyY2UgZm9sZGVycyB0aGF0IGFyZSBnZW5lcmF0ZWQuIFRoaXMgaXMgdHlwaWNhbGx5IGZvbGRlcnMgZm9yIHRoZSBSLApAQCAtODcsNyArODUsNyBAQAogICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGZvbGRlcnMuCiAgICAgICovCiAgICAgQE5vbk51bGwKLSAgICBMaXN0PEZpbGU+IGdldEdlbmVyYXRlZFNvdXJjZUZvbGRlcnMoKTsKKyAgICBDb2xsZWN0aW9uPEZpbGU+IGdldEdlbmVyYXRlZFNvdXJjZUZvbGRlcnMoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYWxsIHRoZSByZXNvdXJjZSBmb2xkZXJzIHRoYXQgYXJlIGdlbmVyYXRlZC4gVGhpcyBpcyB0eXBpY2FsbHkgdGhlIHJlbmRlcnNjcmlwdApAQCAtOTYsMjIgKzk0LDUgQEAKICAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBmb2xkZXIuCiAgICAgICovCiAgICAgQE5vbk51bGwKLSAgICBMaXN0PEZpbGU+IGdldEdlbmVyYXRlZFJlc291cmNlRm9sZGVycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGZpbGVzLiBUaGlzIGlzIHRoZSBvdXRwdXQgb2YgdGhlIGphdmEgY29tcGlsYXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgZm9sZGVyLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgRmlsZSBnZXRDbGFzc2VzRm9sZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBkZXBlbmRlbmNpZXMgZm9yIHRoaXMgYXJ0aWZhY3QuIFRoaXMgaXMgYSBjb21wb3NpdGUgb2YgYWxsIHRoZQotICAgICAqIGRlcGVuZGVuY2llcyBmb3IgdGhhdCBhcnRpZmFjdDogZGVmYXVsdCBjb25maWcgKyBidWlsZCB0eXBlICsgZmxhdm9yKHMpLnMKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGRlcGVuZGVuY2llcy4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIERlcGVuZGVuY2llcyBnZXREZXBlbmRlbmNpZXMoKTsKKyAgICBDb2xsZWN0aW9uPEZpbGU+IGdldEdlbmVyYXRlZFJlc291cmNlRm9sZGVycygpOwogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQW5kcm9pZExpYnJhcnkuamF2YSBiL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL0FuZHJvaWRMaWJyYXJ5LmphdmEKaW5kZXggNjRhYzAxMS4uYTQ2Y2I3ZSAxMDA2NDQKLS0tIGEvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQW5kcm9pZExpYnJhcnkuamF2YQorKysgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9BbmRyb2lkTGlicmFyeS5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgpAQCAtNDksMTIgKzUwLDE4IEBACiAgICAgRmlsZSBnZXRGb2xkZXIoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRpcmVjdCBkZXBlbmRlbmN5IG9mIHRoaXMgZGVwZW5kZW5jeS4KKyAgICAgKiBSZXR1cm5zIHRoZSBkaXJlY3QgZGVwZW5kZW5jeSBvZiB0aGlzIGRlcGVuZGVuY3kuIFRoZSBvcmRlciBpcyBpbXBvcnRhbnQuCiAgICAgICovCiAgICAgQE5vbk51bGwKICAgICBMaXN0PD8gZXh0ZW5kcyBBbmRyb2lkTGlicmFyeT4gZ2V0TGlicmFyeURlcGVuZGVuY2llcygpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIG1hbmlmZXN0LgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgRmlsZSBnZXRNYW5pZmVzdCgpOworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGphciBmaWxlIHRvIHVzZSBmb3IgcGFja2FnaW5nLgogICAgICAqCiAgICAgICogQHJldHVybiBhIEZpbGUgZm9yIHRoZSBqYXIgZmlsZS4gVGhlIGZpbGUgbWF5IG5vdCBwb2ludCB0byBhbiBleGlzdGluZyBmaWxlLgpAQCAtNjgsNyArNzUsNyBAQAogICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIEZpbGUuIE1heSBiZSBlbXB0eSBidXQgbm90IG51bGwuCiAgICAgICovCiAgICAgQE5vbk51bGwKLSAgICBMaXN0PEZpbGU+IGdldExvY2FsSmFycygpOworICAgIENvbGxlY3Rpb248RmlsZT4gZ2V0TG9jYWxKYXJzKCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzIGZvbGRlci4KZGlmZiAtLWdpdCBhL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL0FuZHJvaWRQcm9qZWN0LmphdmEgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9BbmRyb2lkUHJvamVjdC5qYXZhCmluZGV4IGYzOTI5ZTEuLmYxMTE4ZjQgMTAwNjQ0Ci0tLSBhL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL0FuZHJvaWRQcm9qZWN0LmphdmEKKysrIGIvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQW5kcm9pZFByb2plY3QuamF2YQpAQCAtMTgsMTQgKzE4LDE4IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKIC8qKgogICogRW50cnkgcG9pbnQgZm9yIHRoZSBtb2RlbCBvZiB0aGUgQW5kcm9pZCBQcm9qZWN0cy4gVGhpcyBtb2RlbHMgYSBzaW5nbGUgbW9kdWxlLCB3aGV0aGVyCiAgKiB0aGUgbW9kdWxlIGlzIGFuIGFwcCBwcm9qZWN0IG9yIGEgbGlicmFyeSBwcm9qZWN0LgogICovCiBwdWJsaWMgaW50ZXJmYWNlIEFuZHJvaWRQcm9qZWN0IHsKKyAgICBTdHJpbmcgQlVJTERfTU9ERUxfT05MWV9TWVNURU1fUFJPUEVSVFkgPSAgImFuZHJvaWQuYnVpbGQubW9kZWwub25seSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9NQUlOID0gIl9tYWluXyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfSU5TVFJVTUVOVF9URVNUID0gIl9pbnN0cnVtZW50X3Rlc3RfIjsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG1vZGVsIHZlcnNpb24uIFRoaXMgaXMgYSBzdHJpbmcgaW4gdGhlIGZvcm1hdCBYLlkuWgpAQCAtNTgsMzQgKzYyLDM5IEBACiAgICAgUHJvZHVjdEZsYXZvckNvbnRhaW5lciBnZXREZWZhdWx0Q29uZmlnKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUge0BsaW5rIEJ1aWxkVHlwZX0gaW4gdGhlaXIgY29udGFpbmVyLiBUaGUga2V5IGlzIHRoZSBidWlsZCB0eXBlCi0gICAgICogbmFtZSBhcyByZXR1cm5lZCBieSB7QGxpbmsgQnVpbGRUeXBlI2dldE5hbWUoKX0KKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHtAbGluayBCdWlsZFR5cGV9IGluIHRoZWlyIGNvbnRhaW5lci4KICAgICAgKgotICAgICAqIEByZXR1cm4gYSBtYXAgb2YgYnVpbGQgdHlwZSBjb250YWluZXJzLgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGJ1aWxkIHR5cGUgY29udGFpbmVycy4KICAgICAgKi8KICAgICBATm9uTnVsbAotICAgIE1hcDxTdHJpbmcsIEJ1aWxkVHlwZUNvbnRhaW5lcj4gZ2V0QnVpbGRUeXBlcygpOworICAgIENvbGxlY3Rpb248QnVpbGRUeXBlQ29udGFpbmVyPiBnZXRCdWlsZFR5cGVzKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUge0BsaW5rIFByb2R1Y3RGbGF2b3J9IGluIHRoZWlyIGNvbnRhaW5lci4gVGhlIGtleSBpcyB0aGUgcHJvZHVjdAotICAgICAqIGZsYXZvciBuYW1lIGFzIHJldHVybmVkIGJ5IHtAbGluayBQcm9kdWN0Rmxhdm9yI2dldE5hbWUoKX0KKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHtAbGluayBQcm9kdWN0Rmxhdm9yfSBpbiB0aGVpciBjb250YWluZXIuCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbWFwIG9mIHByb2R1Y3QgZmxhdm9yIGNvbnRhaW5lcnMuCisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgcHJvZHVjdCBmbGF2b3IgY29udGFpbmVycy4KICAgICAgKi8KICAgICBATm9uTnVsbAotICAgIE1hcDxTdHJpbmcsIFByb2R1Y3RGbGF2b3JDb250YWluZXI+IGdldFByb2R1Y3RGbGF2b3JzKCk7CisgICAgQ29sbGVjdGlvbjxQcm9kdWN0Rmxhdm9yQ29udGFpbmVyPiBnZXRQcm9kdWN0Rmxhdm9ycygpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG1hcCBvZiBhbGwgdGhlIHZhcmlhbnRzLiBUaGUga2V5IGlzIHRoZSB2YXJpYW50IG5hbWUgYXMgcmV0dXJuZWQgYnkKLSAgICAgKiB7QGxpbmsgVmFyaWFudCNnZXROYW1lKCl9LgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgdmFyaWFudHMuCiAgICAgICoKLSAgICAgKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgdGVzdCB2YXJpYW50LiBJbnN0ZWFkIHRoZSB2YXJpYW50IGFuZCBpdHMgY29tcG9uZW50IGVhY2ggY29udHJpYnV0ZQotICAgICAqIHRoZWlyIHRlc3QgcGFydC4KKyAgICAgKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgdGVzdCB2YXJpYW50LiBUZXN0IHZhcmlhbnRzIGFyZSBhZGRpdGlvbmFsIGFydGlmYWN0cyBpbiB0aGVpcgorICAgICAqIHJlc3BlY3RpdmUgdmFyaWFudCBpbmZvLgogICAgICAqCi0gICAgICogQHJldHVybiBhIG1hcCBvZiB0aGUgdmFyaWFudHMuCisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgdGhlIHZhcmlhbnRzLgogICAgICAqLwogICAgIEBOb25OdWxsCi0gICAgTWFwPFN0cmluZywgVmFyaWFudD4gZ2V0VmFyaWFudHMoKTsKKyAgICBDb2xsZWN0aW9uPFZhcmlhbnQ+IGdldFZhcmlhbnRzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBleHRyYSBhcnRpZmFjdHMgbWV0YSBkYXRhLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIG1haW4gYXJ0aWZhY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBleHRyYSBhcnRpZmFjdHMKKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIENvbGxlY3Rpb248QXJ0aWZhY3RNZXRhRGF0YT4gZ2V0RXh0cmFBcnRpZmFjdHMoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNvbXBpbGF0aW9uIHRhcmdldCBhcyBhIHN0cmluZy4gVGhpcyBpcyB0aGUgZnVsbCBleHRlbmRlZCB0YXJnZXQgaGFzaCBzdHJpbmcuCkBAIC0xMDMsMTYgKzExMiwyMiBAQAogICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGphciBmaWxlcy4KICAgICAgKi8KICAgICBATm9uTnVsbAotICAgIExpc3Q8U3RyaW5nPiBnZXRCb290Q2xhc3NwYXRoKCk7CisgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEJvb3RDbGFzc3BhdGgoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBtYXAgb2Yge0BsaW5rIFNpZ25pbmdDb25maWd9LiBUaGUga2V5IGlzIHRoZSBzaWduaW5nIGNvbmZpZyBuYW1lIGFzIHJldHVybmVkIGJ5Ci0gICAgICoge0BsaW5rIFNpZ25pbmdDb25maWcjZ2V0TmFtZSgpfQorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGZvbGRlcnMgb3IgamFyIGZpbGVzIHRoYXQgY29udGFpbnMgdGhlIGZyYW1ld29yayBzb3VyY2UgY29kZS4KKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBmb2xkZXJzIG9yIGphciBmaWxlcyB0aGF0IGNvbnRhaW5zIHRoZSBmcmFtZXdvcmsgc291cmNlIGNvZGUuCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBDb2xsZWN0aW9uPEZpbGU+IGdldEZyYW1ld29ya1NvdXJjZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHtAbGluayBTaWduaW5nQ29uZmlnfS4KICAgICAgKgogICAgICAqIEByZXR1cm4gYSBtYXAgb2Ygc2lnbmluZyBjb25maWcKICAgICAgKi8KICAgICBATm9uTnVsbAotICAgIE1hcDxTdHJpbmcsIFNpZ25pbmdDb25maWc+IGdldFNpZ25pbmdDb25maWdzKCk7CisgICAgQ29sbGVjdGlvbjxTaWduaW5nQ29uZmlnPiBnZXRTaWduaW5nQ29uZmlncygpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgYWFwdCBvcHRpb25zLgpAQCAtMTIxLDQgKzEzNiwyMyBAQAogICAgICAqLwogICAgIEBOb25OdWxsCiAgICAgQWFwdE9wdGlvbnMgZ2V0QWFwdE9wdGlvbnMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlcGVuZGVuY2llcyB0aGF0IHdlcmUgbm90IHN1Y2Nlc3NmdWxseSByZXNvbHZlZC4gVGhlIHJldHVybmVkIGxpc3QgZ2V0cworICAgICAqIHBvcHVsYXRlZCBvbmx5IGlmIHRoZSBzeXN0ZW0gcHJvcGVydHkge0BsaW5rICNCVUlMRF9NT0RFTF9PTkxZX1NZU1RFTV9QUk9QRVJUWX0gaGFzIGJlZW4KKyAgICAgKiBzZXQgdG8ge0Bjb2RlIHRydWV9LgorICAgICAqIDxwPgorICAgICAqIEVhY2ggdmFsdWUgb2YgdGhlIGNvbGxlY3Rpb24gaGFzIHRoZSBmb3JtYXQgZ3JvdXA6bmFtZTp2ZXJzaW9uLCBmb3IgZXhhbXBsZToKKyAgICAgKiBjb20uZ29vZ2xlLmd1YXZhOmd1YXZhOjE1LjAuMgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZGVwZW5kZW5jaWVzIHRoYXQgd2VyZSBub3Qgc3VjY2Vzc2Z1bGx5IHJlc29sdmVkLgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFVucmVzb2x2ZWREZXBlbmRlbmNpZXMoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNvbXBpbGUgb3B0aW9ucyBmb3IgSmF2YSBjb2RlLgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgSmF2YUNvbXBpbGVPcHRpb25zIGdldEphdmFDb21waWxlT3B0aW9ucygpOwogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQXJ0aWZhY3RNZXRhRGF0YS5qYXZhIGIvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQXJ0aWZhY3RNZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYWYwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9BcnRpZmFjdE1ldGFEYXRhLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CisKKy8qKgorICogTWV0YSBEYXRhIGZvciBhbiBBcnRpZmFjdC4KKyAqLworcHVibGljIGludGVyZmFjZSBBcnRpZmFjdE1ldGFEYXRhIHsKKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRZUEVfQU5EUk9JRCA9IDE7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVFlQRV9KQVZBID0gMjsKKworICAgIEBOb25OdWxsCisgICAgU3RyaW5nIGdldE5hbWUoKTsKKworICAgIGJvb2xlYW4gaXNUZXN0KCk7CisKKyAgICBpbnQgZ2V0VHlwZSgpOworfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQmFzZUFydGlmYWN0LmphdmEgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9CYXNlQXJ0aWZhY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDFhN2I3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQmFzZUFydGlmYWN0LmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CitpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogVGhlIGJhc2UgaW5mb3JtYXRpb24gZm9yIGFsbCBnZW5lcmF0ZWQgYXJ0aWZhY3RzCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQmFzZUFydGlmYWN0IHsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIGFydGlmYWN0LiBUaGlzIHNob3VsZCBtYXRjaCB7QGxpbmsgQXJ0aWZhY3RNZXRhRGF0YSNnZXROYW1lKCl9LgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgU3RyaW5nIGdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRhc2sgdXNlZCB0byBjb21waWxlIEphdmEgY29kZS4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIFN0cmluZyBnZXRKYXZhQ29tcGlsZVRhc2tOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0YXNrIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGFydGlmYWN0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdGFzay4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIFN0cmluZyBnZXRBc3NlbWJsZVRhc2tOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmb2xkZXIgY29udGFpbmluZyB0aGUgY2xhc3MgZmlsZXMuIFRoaXMgaXMgdGhlIG91dHB1dCBvZiB0aGUgamF2YSBjb21waWxhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBmb2xkZXIuCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBGaWxlIGdldENsYXNzZXNGb2xkZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlc29sdmVkIGRlcGVuZGVuY2llcyBmb3IgdGhpcyBhcnRpZmFjdC4gVGhpcyBpcyBhIGNvbXBvc2l0ZSBvZiBhbGwgdGhlCisgICAgICogZGVwZW5kZW5jaWVzIGZvciB0aGF0IGFydGlmYWN0OiBkZWZhdWx0IGNvbmZpZyArIGJ1aWxkIHR5cGUgKyBmbGF2b3IocykucworICAgICAqCisgICAgICogQHJldHVybiBUaGUgZGVwZW5kZW5jaWVzLgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgRGVwZW5kZW5jaWVzIGdldERlcGVuZGVuY2llcygpOworCisgICAgLyoqCisgICAgICogQSBTb3VyY2VQcm92aWRlciBzcGVjaWZpYyB0byB0aGUgdmFyaWFudC4gVGhpcyBjYW4gYmUgbnVsbCBpZiB0aGVyZSBpcyBubyBmbGF2b3JzIGFzCisgICAgICogdGhlICJ2YXJpYW50IiBpcyBlcXVhbCB0byB0aGUgYnVpbGQgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZhcmlhbnQgc3BlY2lmaWMgc291cmNlIHByb3ZpZGVyCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgU291cmNlUHJvdmlkZXIgZ2V0VmFyaWFudFNvdXJjZVByb3ZpZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBBIFNvdXJjZVByb3ZpZGVyIHNwZWNpZmljIHRvIHRoZSBmbGF2b3IgY29tYmluYXRpb24uCisgICAgICoKKyAgICAgKiBGb3IgaW5zdGFuY2UgaWYgdGhlcmUgYXJlIDIgZGltZW5zaW9ucywgdGhlbiB0aGlzIHdvdWxkIGJlIEZsYXZvcjFGbGF2b3IyLCBhbmQgd291bGQgYmUKKyAgICAgKiBjb21tb24gdG8gYWxsIHZhcmlhbnQgdXNpbmcgdGhlc2UgdHdvIGZsYXZvcnMgYW5kIGFueSBvZiB0aGUgYnVpbGQgdHlwZS4KKyAgICAgKgorICAgICAqIFRoaXMgY2FuIGJlIG51bGwgaWYgdGhlcmUgaXMgbGVzcyB0aGFuIDIgZmxhdm9ycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG11bHRpIGZsYXZvciBzcGVjaWZpYyBzb3VyY2UgcHJvdmlkZXIKKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBTb3VyY2VQcm92aWRlciBnZXRNdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyKCk7Cit9CmRpZmYgLS1naXQgYS9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9CYXNlQ29uZmlnLmphdmEgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9CYXNlQ29uZmlnLmphdmEKaW5kZXggZmYzZWZjYy4uZDRlMjJjMSAxMDA2NDQKLS0tIGEvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQmFzZUNvbmZpZy5qYXZhCisrKyBiL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL0Jhc2VDb25maWcuamF2YQpAQCAtMTksNyArMTksNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKIC8qKgogICogQmFzZSBjb25maWcgb2JqZWN0IGZvciBCdWlsZCBUeXBlIGFuZCBQcm9kdWN0IGZsYXZvci4KQEAgLTI3LDExICsyNywxMSBAQAogcHVibGljIGludGVyZmFjZSBCYXNlQ29uZmlnIHsKIAogICAgIC8qKgotICAgICAqIExpc3Qgb2YgQnVpbGQgQ29uZmlnIGxpbmVzLgotICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBsaXN0IG9mIGxpbmVzIChwb3NzaWJseSBlbXB0eSkKKyAgICAgKiBMaXN0IG9mIEJ1aWxkIENvbmZpZyBGaWVsZHMKKyAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgbGlzdCBvZiBjbGFzcyBmaWVsZHMgKHBvc3NpYmx5IGVtcHR5KQogICAgICAqLwogICAgIEBOb25OdWxsCi0gICAgTGlzdDxTdHJpbmc+IGdldEJ1aWxkQ29uZmlnKCk7CisgICAgQ29sbGVjdGlvbjxDbGFzc0ZpZWxkPiBnZXRCdWlsZENvbmZpZ0ZpZWxkcygpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBwcm9ndWFyZCBydWxlIGZpbGVzLgpAQCAtMzksNSArMzksMTMgQEAKICAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgbGlzdCBvZiBmaWxlcy4KICAgICAgKi8KICAgICBATm9uTnVsbAotICAgIExpc3Q8RmlsZT4gZ2V0UHJvZ3VhcmRGaWxlcygpOworICAgIENvbGxlY3Rpb248RmlsZT4gZ2V0UHJvZ3VhcmRGaWxlcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBwcm9ndWFyZCBydWxlIGZpbGVzIGZvciBjb25zdW1lcnMgb2YgdGhlIGxpYnJhcnkgdG8gdXNlLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5vbi1udWxsIGxpc3Qgb2YgZmlsZXMuCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBDb2xsZWN0aW9uPEZpbGU+IGdldENvbnN1bWVyUHJvZ3VhcmRGaWxlcygpOwogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQnVpbGRUeXBlLmphdmEgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9CdWlsZFR5cGUuamF2YQppbmRleCAzM2Q5YWRhLi5jOGNmNjFlIDEwMDY0NAotLS0gYS9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9CdWlsZFR5cGUuamF2YQorKysgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9CdWlsZFR5cGUuamF2YQpAQCAtMjYsNyArMjYsNyBAQAogICogb3IgaW4gdGhlIGFydGlmYWN0IGluZm8uCiAgKgogICogQHNlZSBCdWlsZFR5cGVDb250YWluZXIKLSAqIEBzZWUgQXJ0aWZhY3RJbmZvI2dldERlcGVuZGVuY2llcygpCisgKiBAc2VlIEFuZHJvaWRBcnRpZmFjdCNnZXREZXBlbmRlbmNpZXMoKQogICovCiBwdWJsaWMgaW50ZXJmYWNlIEJ1aWxkVHlwZSBleHRlbmRzIEJhc2VDb25maWcgewogCkBAIC02OSw3ICs2OSw3IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWUgc3VmZml4IGFwcGxpZWQgdG8gdGhpcyBidWlsZCB0eXBlLgotICAgICAqIFRvIGdldCB0aGUgZmluYWwgcGFja2FnZSBuYW1lLCB1c2Uge0BsaW5rIEFydGlmYWN0SW5mbyNnZXRQYWNrYWdlTmFtZSgpfS4KKyAgICAgKiBUbyBnZXQgdGhlIGZpbmFsIHBhY2thZ2UgbmFtZSwgdXNlIHtAbGluayBBbmRyb2lkQXJ0aWZhY3QjZ2V0UGFja2FnZU5hbWUoKX0uCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUgc3VmZml4LgogICAgICAqLwpAQCAtOTcsNCArOTcsMTEgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgemlwYWxpZ24gaXMgZW5hYmxlZC4KICAgICAgKi8KICAgICBib29sZWFuIGlzWmlwQWxpZ24oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIE5ESyBjb25maWd1cmF0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIG5kayBjb25maWcuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgTmRrQ29uZmlnIGdldE5ka0NvbmZpZygpOwogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQnVpbGRUeXBlQ29udGFpbmVyLmphdmEgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9CdWlsZFR5cGVDb250YWluZXIuamF2YQppbmRleCA0YTAxNzBkLi44Nzc2NWYxIDEwMDY0NAotLS0gYS9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9CdWlsZFR5cGVDb250YWluZXIuamF2YQorKysgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9CdWlsZFR5cGVDb250YWluZXIuamF2YQpAQCAtMTgsNiArMTgsOCBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCiAvKioKICAqIEEgQ29udGFpbmVyIG9mIGFsbCB0aGUgZGF0YSByZWxhdGVkIHRvIHtAbGluayBCdWlsZFR5cGV9LgogICovCkBAIC0zOCw0ICs0MCwxMiBAQAogICAgICAqLwogICAgIEBOb25OdWxsCiAgICAgU291cmNlUHJvdmlkZXIgZ2V0U291cmNlUHJvdmlkZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIEFydGlmYWN0TWV0YURhdGEvU291cmNlUHJvdmlkZXIgYXNzb2NpYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBBcnRpZmFjdE1ldGFEYXRhL1NvdXJjZVByb3ZpZGVyIGFzc29jaWF0aW9uLgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgQ29sbGVjdGlvbjxTb3VyY2VQcm92aWRlckNvbnRhaW5lcj4gZ2V0RXh0cmFTb3VyY2VQcm92aWRlcnMoKTsKIH0KZGlmZiAtLWdpdCBhL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL0NsYXNzRmllbGQuamF2YSBiL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL0NsYXNzRmllbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmI2YTI2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvQ2xhc3NGaWVsZC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWw7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOworCisvKioKKyAqIEEgU2ltcGxlIGNsYXNzIGZpZWxkIHdpdGggbmFtZSwgdHlwZSBhbmQgdmFsdWUsIGFsbCBhcyBzdHJpbmdzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIENsYXNzRmllbGQgeworICAgIEBOb25OdWxsCisgICAgU3RyaW5nIGdldFR5cGUoKTsKKworICAgIEBOb25OdWxsCisgICAgU3RyaW5nIGdldE5hbWUoKTsKKworICAgIEBOb25OdWxsCisgICAgU3RyaW5nIGdldFZhbHVlKCk7Cit9CmRpZmYgLS1naXQgYS9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9EZXBlbmRlbmNpZXMuamF2YSBiL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL0RlcGVuZGVuY2llcy5qYXZhCmluZGV4IGI1YTI3ZDEuLmYyOGI2NDggMTAwNjQ0Ci0tLSBhL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL0RlcGVuZGVuY2llcy5qYXZhCisrKyBiL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL0RlcGVuZGVuY2llcy5qYXZhCkBAIC0xOSwxMCArMTksMTEgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKLSAqIEEgc2V0IG9mIGRlcGVuZGVuY2llcyBmb3IgYW4ge0BsaW5rIEFydGlmYWN0SW5mb30uCisgKiBBIHNldCBvZiBkZXBlbmRlbmNpZXMgZm9yIGFuIHtAbGluayBBbmRyb2lkQXJ0aWZhY3R9LgogICovCiBwdWJsaWMgaW50ZXJmYWNlIERlcGVuZGVuY2llcyB7CiAKQEAgLTQxLDcgKzQyLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGphciBmaWxlcy4KICAgICAgKi8KICAgICBATm9uTnVsbAotICAgIExpc3Q8RmlsZT4gZ2V0SmFycygpOworICAgIENvbGxlY3Rpb248RmlsZT4gZ2V0SmFycygpOwogCiAgICAgLyoqCiAgICAgICogVGhlIGxpc3Qgb2YgcHJvamVjdCBkZXBlbmRlbmNpZXMuIFRoaXMgaXMgb25seSBmb3Igbm9uIEFuZHJvaWQgbW9kdWxlIGRlcGVuZGVuY2llcyAod2hpY2gKQEAgLTUwLDUgKzUxLDUgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHByb2plY3RzLgogICAgICAqLwogICAgIEBOb25OdWxsCi0gICAgTGlzdDxTdHJpbmc+IGdldFByb2plY3RzKCk7CisgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFByb2plY3RzKCk7CiB9CmRpZmYgLS1naXQgYS9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9KYXZhQXJ0aWZhY3QuamF2YSBiL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL0phdmFBcnRpZmFjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyY2JhNTUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9KYXZhQXJ0aWZhY3QuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsOworCisvKioKKyAqIFRoZSBpbmZvcm1hdGlvbiBmb3IgYSBnZW5lcmF0ZWQgSmF2YSBhcnRpZmFjdC4KKyAqLworcHVibGljIGludGVyZmFjZSBKYXZhQXJ0aWZhY3QgZXh0ZW5kcyBCYXNlQXJ0aWZhY3QgeworCit9CmRpZmYgLS1naXQgYS9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9KYXZhQ29tcGlsZU9wdGlvbnMuamF2YSBiL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL0phdmFDb21waWxlT3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZmU4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9KYXZhQ29tcGlsZU9wdGlvbnMuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CisKKy8qKgorICogSmF2YSBjb21waWxlIG9wdGlvbnMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YUNvbXBpbGVPcHRpb25zIHsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBsZXZlbCBvZiBjb21wbGlhbmNlIEphdmEgc291cmNlIGNvZGUgaGFzLgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgU3RyaW5nIGdldFNvdXJjZUNvbXBhdGliaWxpdHkoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIEphdmEgdmVyc2lvbiB0byBiZSBhYmxlIHRvIHJ1biBjbGFzc2VzIG9uLgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgU3RyaW5nIGdldFRhcmdldENvbXBhdGliaWxpdHkoKTsKK30KZGlmZiAtLWdpdCBhL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL05ka0NvbmZpZy5qYXZhIGIvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvTmRrQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwNTZjNwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL05ka0NvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWw7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIE5ESyBjb25maWcgZmlsZS4KKyAqLworcHVibGljIGludGVyZmFjZSBOZGtDb25maWcgeworCisgICAgLyoqCisgICAgICogVGhlIG1vZHVsZSBuYW1lCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFN0cmluZyBnZXRNb2R1bGVOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQyBGbGFncworICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Y0ZsYWdzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgTEQgTGlicworICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0TGRMaWJzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQUJJIEZpbHRlcnMKKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEFiaUZpbHRlcnMoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBBUFBfU1RMIHZhbHVlCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFN0cmluZyBnZXRTdGwoKTsKK30KZGlmZiAtLWdpdCBhL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL1Byb2R1Y3RGbGF2b3IuamF2YSBiL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL1Byb2R1Y3RGbGF2b3IuamF2YQppbmRleCBmMWE2ZDE2Li4yZTVlYjgxIDEwMDY0NAotLS0gYS9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9Qcm9kdWN0Rmxhdm9yLmphdmEKKysrIGIvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvUHJvZHVjdEZsYXZvci5qYXZhCkBAIC0xOSw2ICsxOSw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKIAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCiAvKioKICAqIGEgUHJvZHVjdCBGbGF2b3IuIFRoaXMgaXMgb25seSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgZmxhdm9yLgogICoKQEAgLTI2LDcgKzI4LDcgQEAKICAqIG9yIGluIHRoZSBhcnRpZmFjdCBpbmZvLgogICoKICAqIEBzZWUgUHJvZHVjdEZsYXZvckNvbnRhaW5lcgotICogQHNlZSBBcnRpZmFjdEluZm8jZ2V0RGVwZW5kZW5jaWVzKCkKKyAqIEBzZWUgQmFzZUFydGlmYWN0I2dldERlcGVuZGVuY2llcygpCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUHJvZHVjdEZsYXZvciBleHRlbmRzIEJhc2VDb25maWcgewogCkBAIC00MCw3ICs0Miw3IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9kdWN0IGZsYXZvci4gVGhpcyBpcyBvbmx5IHRoZSB2YWx1ZSBzZXQgb24gdGhpcyBwcm9kdWN0IGZsYXZvci4KLSAgICAgKiBUbyBnZXQgdGhlIGZpbmFsIHBhY2thZ2UgbmFtZSwgdXNlIHtAbGluayBBcnRpZmFjdEluZm8jZ2V0UGFja2FnZU5hbWUoKX0uCisgICAgICogVG8gZ2V0IHRoZSBmaW5hbCBwYWNrYWdlIG5hbWUsIHVzZSB7QGxpbmsgQW5kcm9pZEFydGlmYWN0I2dldFBhY2thZ2VOYW1lKCl9LgogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgcGFja2FnZSBuYW1lLgogICAgICAqLwpAQCAtOTAsOSArOTIsMjMgQEAKICAgICBpbnQgZ2V0UmVuZGVyc2NyaXB0VGFyZ2V0QXBpKCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlbmRlcnNjcmlwdCBjb2RlIHNob3VsZCBiZSBjb21waWxlZCBpbiBzdXBwb3J0IG1vZGUgdG8KKyAgICAgKiBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBBbmRyb2lkLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHN1cHBvcnQgbW9kZSBpcyBlbmFibGVkLgorICAgICAqLworICAgIGJvb2xlYW4gZ2V0UmVuZGVyc2NyaXB0U3VwcG9ydE1vZGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcmVuZGVyc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGNvbXBpbGVkIHRvIGdlbmVyYXRlIEMvQysrIGJpbmRpbmdzLgorICAgICAqIEByZXR1cm4gdHJ1ZSBmb3IgQy9DKysgZ2VuZXJhdGlvbiwgZmFsc2UgZm9yIEphdmEKKyAgICAgKi8KKyAgICBib29sZWFuIGdldFJlbmRlcnNjcmlwdE5ka01vZGUoKTsKKworICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHRlc3QgcGFja2FnZSBuYW1lLiBUaGlzIGlzIG9ubHkgdGhlIHZhbHVlIHNldCBvbiB0aGlzIHByb2R1Y3QgZmxhdm9yLgogICAgICAqIFRvIGdldCB0aGUgZmluYWwgdmFsdWUsIHVzZSB7QGxpbmsgVmFyaWFudCNnZXRUZXN0QXJ0aWZhY3RJbmZvKCl9IGFuZAotICAgICAqIHtAbGluayBBcnRpZmFjdEluZm8jZ2V0UGFja2FnZU5hbWUoKX0KKyAgICAgKiB7QGxpbmsgQW5kcm9pZEFydGlmYWN0I2dldFBhY2thZ2VOYW1lKCl9CiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSB0ZXN0IHBhY2thZ2UgbmFtZS4KICAgICAgKi8KQEAgLTEwNyw0ICsxMjMsMzggQEAKICAgICAgKi8KICAgICBATnVsbGFibGUKICAgICBTdHJpbmcgZ2V0VGVzdEluc3RydW1lbnRhdGlvblJ1bm5lcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaGFuZGxpbmdQcm9maWxlIHZhbHVlLiBUaGlzIGlzIG9ubHkgdGhlIHZhbHVlIHNldCBvbiB0aGlzIHByb2R1Y3QgZmxhdm9yLgorICAgICAqCisgICAgICogIEByZXR1cm4gdGhlIGhhbmRsaW5nUHJvZmlsZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBCb29sZWFuIGdldFRlc3RIYW5kbGVQcm9maWxpbmcoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZ1bmN0aW9uYWxUZXN0IHZhbHVlLiBUaGlzIGlzIG9ubHkgdGhlIHZhbHVlIHNldCBvbiB0aGlzIHByb2R1Y3QgZmxhdm9yLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZnVuY3Rpb25hbFRlc3QgdmFsdWUuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgQm9vbGVhbiBnZXRUZXN0RnVuY3Rpb25hbFRlc3QoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIE5ESyBjb25maWd1cmF0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIG5kayBjb25maWcuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgTmRrQ29uZmlnIGdldE5ka0NvbmZpZygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgdGhpcyB2YXJpYW50LgorICAgICAqIFRPRE8gaW1wbGVtZW50IHRoaXMuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRoZSBsaXN0IG9mIC1jIHBhcmFtZXRlcnMgZm9yIGFhcHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UmVzb3VyY2VDb25maWd1cmF0aW9ucygpOwogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvUHJvZHVjdEZsYXZvckNvbnRhaW5lci5qYXZhIGIvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvUHJvZHVjdEZsYXZvckNvbnRhaW5lci5qYXZhCmluZGV4IGY4Y2M3ZWQuLjg2NDNmOWQgMTAwNjQ0Ci0tLSBhL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL1Byb2R1Y3RGbGF2b3JDb250YWluZXIuamF2YQorKysgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9Qcm9kdWN0Rmxhdm9yQ29udGFpbmVyLmphdmEKQEAgLTE4LDYgKzE4LDggQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKwogLyoqCiAgKiBBIENvbnRhaW5lciBvZiBhbGwgdGhlIGRhdGEgcmVsYXRlZCB0byB7QGxpbmsgUHJvZHVjdEZsYXZvcn0uCiAgKi8KQEAgLTQwLDEwICs0MiwxMCBAQAogICAgIFNvdXJjZVByb3ZpZGVyIGdldFNvdXJjZVByb3ZpZGVyKCk7CiAKICAgICAvKioKLSAgICAgKiBUaGUgYXNzb2NpYXRlZCB0ZXN0IHNvdXJjZXMgb2YgdGhlIHByb2R1Y3QgZmxhdm9yCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgQXJ0aWZhY3RNZXRhRGF0YS9Tb3VyY2VQcm92aWRlciBhc3NvY2lhdGlvbi4KICAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHRlc3Qgc291cmNlIHByb3ZpZGVyLgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIEFydGlmYWN0TWV0YURhdGEvU291cmNlUHJvdmlkZXIgYXNzb2NpYXRpb24uCiAgICAgICovCiAgICAgQE5vbk51bGwKLSAgICBTb3VyY2VQcm92aWRlciBnZXRUZXN0U291cmNlUHJvdmlkZXIoKTsKKyAgICBDb2xsZWN0aW9uPFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyPiBnZXRFeHRyYVNvdXJjZVByb3ZpZGVycygpOwogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvU291cmNlUHJvdmlkZXIuamF2YSBiL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL1NvdXJjZVByb3ZpZGVyLmphdmEKaW5kZXggN2VkMDZlZi4uNmQ1OGU2NCAxMDA2NDQKLS0tIGEvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvU291cmNlUHJvdmlkZXIuamF2YQorKysgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9Tb3VyY2VQcm92aWRlci5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCiAvKioKICAqIFJlcHJlc2VudCBhIFNvdXJjZVByb3ZpZGVyIGZvciBhIGdpdmVuIGNvbmZpZ3VyYXRpb24uCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICogQHJldHVybiBhIGxpc3Qgb2YgZm9sZGVycy4gVGhleSBtYXkgbm90IGFsbCBleGlzdC4KICAgICAgKi8KICAgICBATm9uTnVsbAotICAgIFNldDxGaWxlPiBnZXRKYXZhRGlyZWN0b3JpZXMoKTsKKyAgICBDb2xsZWN0aW9uPEZpbGU+IGdldEphdmFEaXJlY3RvcmllcygpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgamF2YSByZXNvdXJjZXMgZm9sZGVycy4KQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBmb2xkZXJzLiBUaGV5IG1heSBub3QgYWxsIGV4aXN0LgogICAgICAqLwogICAgIEBOb25OdWxsCi0gICAgU2V0PEZpbGU+IGdldFJlc291cmNlc0RpcmVjdG9yaWVzKCk7CisgICAgQ29sbGVjdGlvbjxGaWxlPiBnZXRSZXNvdXJjZXNEaXJlY3RvcmllcygpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgYWlkbCBzb3VyY2UgZm9sZGVycy4KQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBmb2xkZXJzLiBUaGV5IG1heSBub3QgYWxsIGV4aXN0LgogICAgICAqLwogICAgIEBOb25OdWxsCi0gICAgU2V0PEZpbGU+IGdldEFpZGxEaXJlY3RvcmllcygpOworICAgIENvbGxlY3Rpb248RmlsZT4gZ2V0QWlkbERpcmVjdG9yaWVzKCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSByZW5kZXJzY3JpcHQgc291cmNlIGZvbGRlcnMuCkBAIC02NSw3ICs2NSw3IEBACiAgICAgICogQHJldHVybiBhIGxpc3Qgb2YgZm9sZGVycy4gVGhleSBtYXkgbm90IGFsbCBleGlzdC4KICAgICAgKi8KICAgICBATm9uTnVsbAotICAgIFNldDxGaWxlPiBnZXRSZW5kZXJzY3JpcHREaXJlY3RvcmllcygpOworICAgIENvbGxlY3Rpb248RmlsZT4gZ2V0UmVuZGVyc2NyaXB0RGlyZWN0b3JpZXMoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGpuaSBzb3VyY2UgZm9sZGVycy4KQEAgLTczLDcgKzczLDcgQEAKICAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBmb2xkZXJzLiBUaGV5IG1heSBub3QgYWxsIGV4aXN0LgogICAgICAqLwogICAgIEBOb25OdWxsCi0gICAgU2V0PEZpbGU+IGdldEpuaURpcmVjdG9yaWVzKCk7CisgICAgQ29sbGVjdGlvbjxGaWxlPiBnZXRKbmlEaXJlY3RvcmllcygpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgYW5kcm9pZCByZXNvdXJjZXMgZm9sZGVycy4KQEAgLTgxLDcgKzgxLDcgQEAKICAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBmb2xkZXJzLiBUaGV5IG1heSBub3QgYWxsIGV4aXN0LgogICAgICAqLwogICAgIEBOb25OdWxsCi0gICAgU2V0PEZpbGU+IGdldFJlc0RpcmVjdG9yaWVzKCk7CisgICAgQ29sbGVjdGlvbjxGaWxlPiBnZXRSZXNEaXJlY3RvcmllcygpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgYW5kcm9pZCBhc3NldHMgZm9sZGVycy4KQEAgLTg5LDUgKzg5LDUgQEAKICAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBmb2xkZXJzLiBUaGV5IG1heSBub3QgYWxsIGV4aXN0LgogICAgICAqLwogICAgIEBOb25OdWxsCi0gICAgU2V0PEZpbGU+IGdldEFzc2V0c0RpcmVjdG9yaWVzKCk7CisgICAgQ29sbGVjdGlvbjxGaWxlPiBnZXRBc3NldHNEaXJlY3RvcmllcygpOwogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvU291cmNlUHJvdmlkZXJDb250YWluZXIuamF2YSBiL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL1NvdXJjZVByb3ZpZGVyQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjODM4NwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL1NvdXJjZVByb3ZpZGVyQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CisKKy8qKgorICogQW4gYXNzb2NpYXRpb24gb2YgYW4ge0BsaW5rIEFydGlmYWN0TWV0YURhdGF9J3MgbmFtZSBhbmQgYSB7QGxpbmsgU291cmNlUHJvdmlkZXJ9LgorICovCitwdWJsaWMgaW50ZXJmYWNlIFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyIHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgbWF0Y2hpbmcge0BsaW5rIEFydGlmYWN0TWV0YURhdGEjZ2V0TmFtZSgpfQorICAgICAqLworICAgIEBOb25OdWxsCisgICAgU3RyaW5nIGdldEFydGlmYWN0TmFtZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc291cmNlIHByb3ZpZGVyCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBTb3VyY2VQcm92aWRlciBnZXRTb3VyY2VQcm92aWRlcigpOworfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvVmFyaWFudC5qYXZhIGIvYnVpbGRlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvbW9kZWwvVmFyaWFudC5qYXZhCmluZGV4IDIxZWYzM2UuLjY3ODEzYWUgMTAwNjQ0Ci0tLSBhL2J1aWxkZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL21vZGVsL1ZhcmlhbnQuamF2YQorKysgYi9idWlsZGVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9tb2RlbC9WYXJpYW50LmphdmEKQEAgLTE3LDggKzE3LDggQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCkBAIC00OSwxNiArNDksMTMgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBhcnRpZmFjdC4KICAgICAgKi8KICAgICBATm9uTnVsbAotICAgIEFydGlmYWN0SW5mbyBnZXRNYWluQXJ0aWZhY3RJbmZvKCk7CisgICAgQW5kcm9pZEFydGlmYWN0IGdldE1haW5BcnRpZmFjdCgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGVzdCBhcnRpZmFjdCBmb3IgdGhpcyB2YXJpYW50LiBUaGlzIG1heSBiZSBudWxsIGlmIHRoaXMgcGFydGljdWxhciB2YXJpYW50Ci0gICAgICogaXMgbm90IGNvbmZpZ3VyZWQgdG8gYmUgdGVzdGVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdGVzdCBhcnRpZmFjdC4KLSAgICAgKi8KLSAgICBATnVsbGFibGUKLSAgICBBcnRpZmFjdEluZm8gZ2V0VGVzdEFydGlmYWN0SW5mbygpOworICAgIEBOb25OdWxsCisgICAgQ29sbGVjdGlvbjxBbmRyb2lkQXJ0aWZhY3Q+IGdldEV4dHJhQW5kcm9pZEFydGlmYWN0cygpOworCisgICAgQE5vbk51bGwKKyAgICBDb2xsZWN0aW9uPEphdmFBcnRpZmFjdD4gZ2V0RXh0cmFKYXZhQXJ0aWZhY3RzKCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBidWlsZCB0eXBlLiBBbGwgdmFyaWFudHMgaGF2ZSBhIGJ1aWxkIHR5cGUsIHNvIHRoaXMgaXMgbmV2ZXIgbnVsbC4KQEAgLTg5LDE1ICs4Niw0IEBACiAgICAgICovCiAgICAgQE5vbk51bGwKICAgICBQcm9kdWN0Rmxhdm9yIGdldE1lcmdlZEZsYXZvcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgdGhpcyB2YXJpYW50LgotICAgICAqIFRPRE8gaW1wbGVtZW50IHRoaXMuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIHRoZSBsaXN0IG9mIC1jIHBhcmFtZXRlcnMgZm9yIGFhcHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBMaXN0PFN0cmluZz4gZ2V0UmVzb3VyY2VDb25maWd1cmF0aW9ucygpOwogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci10ZXN0LWFwaS9idWlsZC5ncmFkbGUgYi9idWlsZGVyLXRlc3QtYXBpL2J1aWxkLmdyYWRsZQppbmRleCA1NzlmNGY3Li40YmE1MzEyIDEwMDY0NAotLS0gYS9idWlsZGVyLXRlc3QtYXBpL2J1aWxkLmdyYWRsZQorKysgYi9idWlsZGVyLXRlc3QtYXBpL2J1aWxkLmdyYWRsZQpAQCAtNywxMDIgKzcsOSBAQAogICAgIGNvbXBpbGUgImNvbS5hbmRyb2lkLnRvb2xzLmRkbXM6ZGRtbGliOiRwcm9qZWN0LmV4dC5iYXNlQW5kcm9pZFZlcnNpb24iCiB9CiAKLWRlZiBnZXRWZXJzaW9uKCkgewotICAgIGlmIChwcm9qZWN0LmhhcygicmVsZWFzZSIpKSB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0LmV4dC5iYXNlVmVyc2lvbgotICAgIH0KLQotICAgIHJldHVybiBwcm9qZWN0LmV4dC5iYXNlVmVyc2lvbiArICctU05BUFNIT1QnCi19Ci0KLXZlcnNpb24gPSBnZXRWZXJzaW9uKCkKIGFyY2hpdmVzQmFzZU5hbWUgPSAnYnVpbGRlci10ZXN0LWFwaScKK3Byb2plY3QuZXh0LnBvbU5hbWUgPSAnQW5kcm9pZCBCdWlsZGVyIFRlc3QgQVBJIGxpYnJhcnknCitwcm9qZWN0LmV4dC5wb21EZXNjID0gJ0FQSSBmb3IgdGhlIFRlc3QgZXh0ZW5zaW9uIHBvaW50IGluIHRoZSBCdWlsZGVyIGxpYnJhcnkuJwogCi10YXNrIHB1Ymxpc2hMb2NhbCh0eXBlOiBVcGxvYWQpIHsKLSAgICBjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbnMuYXJjaGl2ZXMKLSAgICByZXBvc2l0b3JpZXMgewotICAgICAgICBtYXZlbkRlcGxveWVyIHsKLSAgICAgICAgICAgIHJlcG9zaXRvcnkodXJsOiB1cmkoIiRyb290UHJvamVjdC5leHQuYW5kcm9pZEhvc3RPdXQvcmVwbyIpKQotICAgICAgICB9Ci0gICAgfQotfQotCi1wcm9qZWN0LmV4dC5zb25hdHlwZVVzZXJuYW1lID0gaGFzUHJvcGVydHkoJ3NvbmF0eXBlVXNlcm5hbWUnKSA/IHNvbmF0eXBlVXNlcm5hbWUgOiAiIgotcHJvamVjdC5leHQuc29uYXR5cGVQYXNzd29yZCA9IGhhc1Byb3BlcnR5KCdzb25hdHlwZVBhc3N3b3JkJykgPyBzb25hdHlwZVBhc3N3b3JkIDogIiIKLQotdXBsb2FkQXJjaGl2ZXMgewotICAgIHJlcG9zaXRvcmllcyB7Ci0gICAgICAgIG1hdmVuRGVwbG95ZXIgewotICAgICAgICAgICAgYmVmb3JlRGVwbG95bWVudCB7IE1hdmVuRGVwbG95bWVudCBkZXBsb3ltZW50IC0+Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9qZWN0LmhhcygicmVsZWFzZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdG9wRXhlY3V0aW9uRXhjZXB0aW9uKCJ1cGxvYWRBcmNoaXZlcyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSByZWxlYXNlLmdyYWRsZSBpbml0IHNjcmlwdCIpCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByb2plY3QuZXh0LnNvbmF0eXBlVXNlcm5hbWUubGVuZ3RoKCkgPT0gMCB8fCBwcm9qZWN0LmV4dC5zb25hdHlwZVBhc3N3b3JkLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3BFeGVjdXRpb25FeGNlcHRpb24oInVwbG9hZEFyY2hpdmVzIGNhbm5vdCBiZSBjYWxsZWQgd2l0aG91dCBzb25hdHlwZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQiKQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNpZ25pbmcuc2lnblBvbShkZXBsb3ltZW50KQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXBvc2l0b3J5KHVybDogImh0dHBzOi8vb3NzLnNvbmF0eXBlLm9yZy9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMi8iKSB7Ci0gICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24odXNlck5hbWU6IHByb2plY3QuZXh0LnNvbmF0eXBlVXNlcm5hbWUsIHBhc3N3b3JkOiBwcm9qZWN0LmV4dC5zb25hdHlwZVBhc3N3b3JkKQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb20ucHJvamVjdCB7Ci0gICAgICAgICAgICAgICAgbmFtZSAnQW5kcm9pZCBCdWlsZGVyIFRlc3QgQVBJIGxpYnJhcnknCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gJ0FQSSBmb3IgdGhlIFRlc3QgZXh0ZW5zaW9uIHBvaW50IGluIHRoZSBCdWlsZGVyIGxpYnJhcnkuJwotICAgICAgICAgICAgICAgIHVybCAnaHR0cDovL3Rvb2xzLmFuZHJvaWQuY29tJwotICAgICAgICAgICAgICAgIGluY2VwdGlvblllYXIgJzIwMDcnCi0KLSAgICAgICAgICAgICAgICBsaWNlbnNlcyB7Ci0gICAgICAgICAgICAgICAgICAgIGxpY2Vuc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSAnVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcKLSAgICAgICAgICAgICAgICAgICAgICAgIHVybCAnaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dCcKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbiAncmVwbycKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNjbSB7Ci0gICAgICAgICAgICAgICAgICAgIHVybCAiaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vdG9vbHMvYnVpbGQiCi0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gImdpdDovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS90b29scy9idWlsZC5naXQiCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRldmVsb3BlcnMgewotICAgICAgICAgICAgICAgICAgICBkZXZlbG9wZXIgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSAnVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCcKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gY3VzdG9tIHRhc2tzIGZvciBjcmVhdGluZyBzb3VyY2UvamF2YWRvYyBqYXJzCi10YXNrIHNvdXJjZXNKYXIodHlwZTogSmFyLCBkZXBlbmRzT246Y2xhc3NlcykgewotICAgIGNsYXNzaWZpZXIgPSAnc291cmNlcycKLSAgICBmcm9tIHNvdXJjZVNldHMubWFpbi5hbGxTb3VyY2UKLX0KLQotamF2YWRvYyB7Ci0gICAgZXhjbHVkZSAgICAgICAgICAgICAgICIqKi9pbnRlcm5hbC8qKiIKLSAgICBvcHRpb25zLm1lbWJlckxldmVsID0gb3JnLmdyYWRsZS5leHRlcm5hbC5qYXZhZG9jLkphdmFkb2NNZW1iZXJMZXZlbC5QUk9URUNURUQKLQotICAgIHRpdGxlICAgICAgICAgICAgICAgICAiQW5kcm9pZCBNb2RlbCIKLX0KLQotdGFzayBqYXZhZG9jSmFyKHR5cGU6IEphciwgZGVwZW5kc09uOmphdmFkb2MpIHsKLSAgICBjbGFzc2lmaWVyICAgICAgICAgJ2phdmFkb2MnCi0gICAgZnJvbSAgICAgICAgICAgICAgIGphdmFkb2MuZGVzdGluYXRpb25EaXIKLX0KLSAKLS8vIGFkZCBqYXZhZG9jL3NvdXJjZSBqYXIgdGFza3MgYXMgYXJ0aWZhY3RzCi1hcnRpZmFjdHMgewotICAgIGFyY2hpdmVzIGphcgotICAgIGFyY2hpdmVzIHNvdXJjZXNKYXIKLSAgICBhcmNoaXZlcyBqYXZhZG9jSmFyCi19Ci0KLXNpZ25pbmcgewotICAgIHJlcXVpcmVkIHsgcHJvamVjdC5oYXMoInJlbGVhc2UiKSAmJiBncmFkbGUudGFza0dyYXBoLmhhc1Rhc2soInVwbG9hZEFyY2hpdmVzIikgfQotICAgIHNpZ24gY29uZmlndXJhdGlvbnMuYXJjaGl2ZXMKLX0KK2FwcGx5IGZyb206ICcuLi9wdWJsaXNoLmdyYWRsZScKK2FwcGx5IGZyb206ICcuLi9qYXZhZG9jLmdyYWRsZScKZGlmZiAtLWdpdCBhL2J1aWxkZXItdGVzdC1hcGkvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL3Rlc3RpbmcvYXBpL0RldmljZUNvbm5lY3Rvci5qYXZhIGIvYnVpbGRlci10ZXN0LWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvdGVzdGluZy9hcGkvRGV2aWNlQ29ubmVjdG9yLmphdmEKaW5kZXggMjQzYmRjMi4uNDgyMDhlOCAxMDA2NDQKLS0tIGEvYnVpbGRlci10ZXN0LWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvdGVzdGluZy9hcGkvRGV2aWNlQ29ubmVjdG9yLmphdmEKKysrIGIvYnVpbGRlci10ZXN0LWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvdGVzdGluZy9hcGkvRGV2aWNlQ29ubmVjdG9yLmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKICAqIEEgY29ubmVjdG9yIHRvIGEgZGV2aWNlIHRvIGluc3RhbGwvdW5pbnN0YWxsIEFQS3MsIGFuZCBydW4gc2hlbGwgY29tbWFuZC4KQEAgLTYwLDEwICs2MSwxOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHVuaW5zdGFsbFBhY2thZ2UoQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgdGltZW91dCwgSUxvZ2dlciBsb2dnZXIpIHRocm93cyBEZXZpY2VFeGNlcHRpb247CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBBUEkgbGV2ZWwgb2YgdGhlIGRldmljZSwgb3IgMCBpZiBpdCBjb3VsZCBub3QgYmUgcXVlcmllZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcGkgbGV2ZWwKKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEFwaUxldmVsKCk7CiAKKyAgICAvKioKKyAgICAgKiBUaGUgZGV2aWNlIHN1cHBvcnRlZCBBQklzLiBUaGlzIGlzIGluIHByZWZlcnJlZCBvcmRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBBQklzCisgICAgICovCiAgICAgQE5vbk51bGwKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEFiaSgpOworICAgIHB1YmxpYyBhYnN0cmFjdCBMaXN0PFN0cmluZz4gZ2V0QWJpcygpOwogCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXREZW5zaXR5KCk7CiAKZGlmZiAtLWdpdCBhL2J1aWxkZXIvYnVpbGQuZ3JhZGxlIGIvYnVpbGRlci9idWlsZC5ncmFkbGUKaW5kZXggZjczYTk5MS4uNmI1ZmI5YiAxMDA2NDQKLS0tIGEvYnVpbGRlci9idWlsZC5ncmFkbGUKKysrIGIvYnVpbGRlci9idWlsZC5ncmFkbGUKQEAgLTExLDExNCArMTEsMjQgQEAKICAgICBjb21waWxlIHByb2plY3QoJzpidWlsZGVyLXRlc3QtYXBpJykKICAgICBjb21waWxlICJjb20uYW5kcm9pZC50b29sczpzZGtsaWI6JHByb2plY3QuZXh0LmJhc2VBbmRyb2lkVmVyc2lvbiIKICAgICBjb21waWxlICJjb20uYW5kcm9pZC50b29sczpzZGstY29tbW9uOiRwcm9qZWN0LmV4dC5iYXNlQW5kcm9pZFZlcnNpb24iCisgICAgY29tcGlsZSAiY29tLmFuZHJvaWQudG9vbHM6Y29tbW9uOiRwcm9qZWN0LmV4dC5iYXNlQW5kcm9pZFZlcnNpb24iCiAgICAgY29tcGlsZSAiY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6bWFuaWZlc3QtbWVyZ2VyOiRwcm9qZWN0LmV4dC5iYXNlQW5kcm9pZFZlcnNpb24iCiAgICAgY29tcGlsZSAiY29tLmFuZHJvaWQudG9vbHMuZGRtczpkZG1saWI6JHByb2plY3QuZXh0LmJhc2VBbmRyb2lkVmVyc2lvbiIKIAorICAgIGNvbXBpbGUgJ2NvbS5zcXVhcmV1cDpqYXZhd3JpdGVyOjIuMi4xJwogICAgIGNvbXBpbGUgJ29yZy5ib3VuY3ljYXN0bGU6YmNwa2l4LWpkazE1b246MS40OCcKIAogICAgIHRlc3RDb21waWxlICdqdW5pdDpqdW5pdDozLjguMScKICAgICB0ZXN0Q29tcGlsZSAiY29tLmFuZHJvaWQudG9vbHM6dGVzdHV0aWxzOiRwcm9qZWN0LmV4dC5iYXNlQW5kcm9pZFZlcnNpb24iCiB9CiAKLWRlZiBnZXRWZXJzaW9uKCkgewotICAgIGlmIChwcm9qZWN0LmhhcygicmVsZWFzZSIpKSB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0LmV4dC5iYXNlVmVyc2lvbgotICAgIH0KLQotICAgIHJldHVybiBwcm9qZWN0LmV4dC5iYXNlVmVyc2lvbiArICctU05BUFNIT1QnCi19Ci0KLXZlcnNpb24gPSBnZXRWZXJzaW9uKCkKIGFyY2hpdmVzQmFzZU5hbWUgPSAnYnVpbGRlcicKLWphci5tYW5pZmVzdC5hdHRyaWJ1dGVzKCJCdWlsZGVyLVZlcnNpb24iOiB2ZXJzaW9uKQorcHJvamVjdC5leHQucG9tTmFtZSA9ICdBbmRyb2lkIEJ1aWxkZXIgbGlicmFyeScKK3Byb2plY3QuZXh0LnBvbURlc2MgPSAnTGlicmFyeSB0byBidWlsZCBBbmRyb2lkIGFwcGxpY2F0aW9ucy4nCiAKLXRhc2sgcHVibGlzaExvY2FsKHR5cGU6IFVwbG9hZCkgewotICAgIGNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9ucy5hcmNoaXZlcwotICAgIHJlcG9zaXRvcmllcyB7Ci0gICAgICAgIG1hdmVuRGVwbG95ZXIgewotICAgICAgICAgICAgcmVwb3NpdG9yeSh1cmw6IHVyaSgiJHJvb3RQcm9qZWN0LmV4dC5hbmRyb2lkSG9zdE91dC9yZXBvIikpCi0gICAgICAgIH0KLSAgICB9Ci19CithcHBseSBmcm9tOiAnLi4vcHVibGlzaC5ncmFkbGUnCithcHBseSBmcm9tOiAnLi4vamF2YWRvYy5ncmFkbGUnCisKK2phci5tYW5pZmVzdC5hdHRyaWJ1dGVzKCJCdWlsZGVyLVZlcnNpb24iOiB2ZXJzaW9uKQogcHVibGlzaExvY2FsLmRlcGVuZHNPbiAnOmJ1aWxkZXItbW9kZWw6cHVibGlzaExvY2FsJywgJzpidWlsZGVyLXRlc3QtYXBpOnB1Ymxpc2hMb2NhbCcKIAotcHJvamVjdC5leHQuc29uYXR5cGVVc2VybmFtZSA9IGhhc1Byb3BlcnR5KCdzb25hdHlwZVVzZXJuYW1lJykgPyBzb25hdHlwZVVzZXJuYW1lIDogIiIKLXByb2plY3QuZXh0LnNvbmF0eXBlUGFzc3dvcmQgPSBoYXNQcm9wZXJ0eSgnc29uYXR5cGVQYXNzd29yZCcpID8gc29uYXR5cGVQYXNzd29yZCA6ICIiCi0KLXVwbG9hZEFyY2hpdmVzIHsKLSAgICByZXBvc2l0b3JpZXMgewotICAgICAgICBtYXZlbkRlcGxveWVyIHsKLSAgICAgICAgICAgIGJlZm9yZURlcGxveW1lbnQgeyBNYXZlbkRlcGxveW1lbnQgZGVwbG95bWVudCAtPgotICAgICAgICAgICAgICAgIGlmICghcHJvamVjdC5oYXMoInJlbGVhc2UiKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcEV4ZWN1dGlvbkV4Y2VwdGlvbigidXBsb2FkQXJjaGl2ZXMgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgcmVsZWFzZS5ncmFkbGUgaW5pdCBzY3JpcHQiKQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0LmV4dC5zb25hdHlwZVVzZXJuYW1lLmxlbmd0aCgpID09IDAgfHwgcHJvamVjdC5leHQuc29uYXR5cGVQYXNzd29yZC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdG9wRXhlY3V0aW9uRXhjZXB0aW9uKCJ1cGxvYWRBcmNoaXZlcyBjYW5ub3QgYmUgY2FsbGVkIHdpdGhvdXQgc29uYXR5cGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIikKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzaWduaW5nLnNpZ25Qb20oZGVwbG95bWVudCkKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVwb3NpdG9yeSh1cmw6ICJodHRwczovL29zcy5zb25hdHlwZS5vcmcvc2VydmljZS9sb2NhbC9zdGFnaW5nL2RlcGxveS9tYXZlbjIvIikgewotICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uKHVzZXJOYW1lOiBwcm9qZWN0LmV4dC5zb25hdHlwZVVzZXJuYW1lLCBwYXNzd29yZDogcHJvamVjdC5leHQuc29uYXR5cGVQYXNzd29yZCkKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcG9tLnByb2plY3QgewotICAgICAgICAgICAgICAgIG5hbWUgJ0FuZHJvaWQgQnVpbGRlciBsaWJyYXJ5JwotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICdsaWJyYXJ5IHRvIGJ1aWxkIEFuZHJvaWQgYXBwbGljYXRpb25zLicKLSAgICAgICAgICAgICAgICB1cmwgJ2h0dHA6Ly90b29scy5hbmRyb2lkLmNvbScKLSAgICAgICAgICAgICAgICBpbmNlcHRpb25ZZWFyICcyMDA3JwotCi0gICAgICAgICAgICAgICAgbGljZW5zZXMgewotICAgICAgICAgICAgICAgICAgICBsaWNlbnNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgJ1RoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAnCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmwgJ2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQnCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24gJ3JlcG8nCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzY20gewotICAgICAgICAgICAgICAgICAgICB1cmwgImh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3Rvb2xzL2J1aWxkIgotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uICJnaXQ6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vdG9vbHMvYnVpbGQuZ2l0IgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXZlbG9wZXJzIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2ZWxvcGVyIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgJ1RoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QnCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotLy8gY3VzdG9tIHRhc2tzIGZvciBjcmVhdGluZyBzb3VyY2UvamF2YWRvYyBqYXJzCi10YXNrIHNvdXJjZXNKYXIodHlwZTogSmFyLCBkZXBlbmRzT246Y2xhc3NlcykgewotICAgIGNsYXNzaWZpZXIgPSAnc291cmNlcycKLSAgICBmcm9tIHNvdXJjZVNldHMubWFpbi5hbGxTb3VyY2UKLX0KLQotamF2YWRvYyB7Ci0gICAgZXhjbHVkZSAgICAgICAgICAgICAgICIqKi9pbnRlcm5hbC8qKiIKLSAgICBvcHRpb25zLm1lbWJlckxldmVsID0gb3JnLmdyYWRsZS5leHRlcm5hbC5qYXZhZG9jLkphdmFkb2NNZW1iZXJMZXZlbC5QUk9URUNURUQKLQotICAgIHRpdGxlICAgICAgICAgICAgICAgICAiQW5kcm9pZCBCdWlsZGVyIgotfQotCi10YXNrIGphdmFkb2NKYXIodHlwZTogSmFyLCBkZXBlbmRzT246amF2YWRvYykgewotICAgIGNsYXNzaWZpZXIgICAgICAgICAnamF2YWRvYycKLSAgICBmcm9tICAgICAgICAgICAgICAgamF2YWRvYy5kZXN0aW5hdGlvbkRpcgotfQotIAotLy8gYWRkIGphdmFkb2Mvc291cmNlIGphciB0YXNrcyBhcyBhcnRpZmFjdHMKLWFydGlmYWN0cyB7Ci0gICAgYXJjaGl2ZXMgamFyCi0gICAgYXJjaGl2ZXMgc291cmNlc0phcgotICAgIGFyY2hpdmVzIGphdmFkb2NKYXIKLX0KLQotc2lnbmluZyB7Ci0gICAgcmVxdWlyZWQgeyBwcm9qZWN0LmhhcygicmVsZWFzZSIpICYmIGdyYWRsZS50YXNrR3JhcGguaGFzVGFzaygidXBsb2FkQXJjaGl2ZXMiKSB9Ci0gICAgc2lnbiBjb25maWd1cmF0aW9ucy5hcmNoaXZlcwotfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvQW5kcm9pZEJ1aWxkZXIuamF2YSBiL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL0FuZHJvaWRCdWlsZGVyLmphdmEKaW5kZXggOTQ0MmY0ZC4uMGUxMjI0MiAxMDA2NDQKLS0tIGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvQW5kcm9pZEJ1aWxkZXIuamF2YQorKysgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9BbmRyb2lkQnVpbGRlci5qYXZhCkBAIC0xNiwyNCArMTYsMjUgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZGVyOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuU2RrQ29uc3RhbnRzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5jb21waWxpbmcuRGVwZW5kZW5jeUZpbGVQcm9jZXNzb3I7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5kZXBlbmRlbmN5Lk1hbmlmZXN0RGVwZW5kZW5jeTsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLmRlcGVuZGVuY3kuU3ltYm9sRmlsZVByb3ZpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuaW50ZXJuYWwuQnVpbGRDb25maWdHZW5lcmF0b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5pbnRlcm5hbC5DbGFzc0ZpZWxkSW1wbDsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLmludGVybmFsLlN5bWJvbExvYWRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLmludGVybmFsLlN5bWJvbFdyaXRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLmludGVybmFsLlRlc3RNYW5pZmVzdEdlbmVyYXRvcjsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLmludGVybmFsLmNvbXBpbGVyLkFpZGxQcm9jZXNzb3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5pbnRlcm5hbC5jb21waWxlci5GaWxlR2F0aGVyZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5pbnRlcm5hbC5jb21waWxlci5MZWFmRm9sZGVyR2F0aGVyZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5pbnRlcm5hbC5jb21waWxlci5SZW5kZXJTY3JpcHRQcm9jZXNzb3I7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5pbnRlcm5hbC5jb21waWxlci5Tb3VyY2VTZWFyY2hlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLmludGVybmFsLnBhY2thZ2luZy5KYXZhUmVzb3VyY2VQcm9jZXNzb3I7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5pbnRlcm5hbC5wYWNrYWdpbmcuUGFja2FnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5BYXB0T3B0aW9uczsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkNsYXNzRmllbGQ7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Qcm9kdWN0Rmxhdm9yOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuU2lnbmluZ0NvbmZpZzsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLnBhY2thZ2luZy5EdXBsaWNhdGVGaWxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIucGFja2FnaW5nLlBhY2thZ2VyRXhjZXB0aW9uOwpAQCAtNTEsMTEgKzUyLDEzIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLklBbmRyb2lkVGFyZ2V0OwogaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5yZXBvc2l0b3J5LkZ1bGxSZXZpc2lvbjsKIGltcG9ydCBjb20uYW5kcm9pZC51dGlscy5JTG9nZ2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLnV0aWxzLlNka1V0aWxzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQXJyYXlMaXN0TXVsdGltYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5GaWxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CkBAIC02NSw2ICs2OCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKQEAgLTc4LDEzICs4MiwxMiBAQAogICogY3JlYXRlIGEgYnVpbGRlciB3aXRoIHtAbGluayAjQW5kcm9pZEJ1aWxkZXIoU2RrUGFyc2VyLCBTdHJpbmcsIElMb2dnZXIsIGJvb2xlYW4pfQogICoKICAqIHRoZW4gYnVpbGQgc3RlcHMgY2FuIGJlIGRvbmUgd2l0aAotICoge0BsaW5rICNnZW5lcmF0ZUJ1aWxkQ29uZmlnKFN0cmluZywgYm9vbGVhbiwgamF2YS51dGlsLkxpc3QsIFN0cmluZyl9CiAgKiB7QGxpbmsgI3Byb2Nlc3NNYW5pZmVzdChqYXZhLmlvLkZpbGUsIGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuTGlzdCwgU3RyaW5nLCBpbnQsIFN0cmluZywgaW50LCBpbnQsIFN0cmluZyl9Ci0gKiB7QGxpbmsgI3Byb2Nlc3NUZXN0TWFuaWZlc3QoU3RyaW5nLCBpbnQsIGludCwgU3RyaW5nLCBTdHJpbmcsIGphdmEudXRpbC5MaXN0LCBTdHJpbmcpfQorICoge0BsaW5rICNwcm9jZXNzVGVzdE1hbmlmZXN0KFN0cmluZywgaW50LCBpbnQsIFN0cmluZywgU3RyaW5nLCBCb29sZWFuLCBCb29sZWFuLCBqYXZhLnV0aWwuTGlzdCwgU3RyaW5nKX0KICAqIHtAbGluayAjcHJvY2Vzc1Jlc291cmNlcyhqYXZhLmlvLkZpbGUsIGphdmEuaW8uRmlsZSwgamF2YS5pby5GaWxlLCBqYXZhLnV0aWwuTGlzdCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIGNvbS5hbmRyb2lkLmJ1aWxkZXIuVmFyaWFudENvbmZpZ3VyYXRpb24uVHlwZSwgYm9vbGVhbiwgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5BYXB0T3B0aW9ucyl9CiAgKiB7QGxpbmsgI2NvbXBpbGVBbGxBaWRsRmlsZXMoamF2YS51dGlsLkxpc3QsIGphdmEuaW8uRmlsZSwgamF2YS51dGlsLkxpc3QsIGNvbS5hbmRyb2lkLmJ1aWxkZXIuY29tcGlsaW5nLkRlcGVuZGVuY3lGaWxlUHJvY2Vzc29yKX0KLSAqIHtAbGluayAjY29udmVydEJ5dGVDb2RlKEl0ZXJhYmxlLCBJdGVyYWJsZSwgRmlsZSwgU3RyaW5nLCBEZXhPcHRpb25zLCBib29sZWFuKX0KLSAqIHtAbGluayAjcGFja2FnZUFwayhTdHJpbmcsIFN0cmluZywgamF2YS51dGlsLkxpc3QsIFN0cmluZywgU3RyaW5nLCBib29sZWFuLCBTaWduaW5nQ29uZmlnLCBTdHJpbmcpfQorICoge0BsaW5rICNjb252ZXJ0Qnl0ZUNvZGUoSXRlcmFibGUsIEl0ZXJhYmxlLCBGaWxlLCBEZXhPcHRpb25zLCBib29sZWFuKX0KKyAqIHtAbGluayAjcGFja2FnZUFwayhTdHJpbmcsIFN0cmluZywgamF2YS51dGlsLkxpc3QsIFN0cmluZywgamF2YS51dGlsLkNvbGxlY3Rpb24sIGphdmEudXRpbC5TZXQsIGJvb2xlYW4sIGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuU2lnbmluZ0NvbmZpZywgU3RyaW5nKX0KICAqCiAgKiBKYXZhIGNvbXBpbGF0aW9uIGlzIG5vdCBoYW5kbGVkIGJ1dCB0aGUgYnVpbGRlciBwcm92aWRlcyB0aGUgYm9vdGNsYXNzcGF0aCB3aXRoCiAgKiB7QGxpbmsgI2dldEJvb3RDbGFzc3BhdGgoU2RrUGFyc2VyKX0uCkBAIC0xMDQsNiArMTA3LDcgQEAKICAgICBwcml2YXRlIGZpbmFsIElMb2dnZXIgbUxvZ2dlcjsKICAgICBwcml2YXRlIGZpbmFsIENvbW1hbmRMaW5lUnVubmVyIG1DbWRMaW5lUnVubmVyOwogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtVmVyYm9zZUV4ZWM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1MaWJyYXJ5OwogCiAgICAgQE5vbk51bGwKICAgICBwcml2YXRlIGZpbmFsIElBbmRyb2lkVGFyZ2V0IG1UYXJnZXQ7CkBAIC0xNjYsNiArMTcwLDcgQEAKICAgICAvKioKICAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgYm9vdCBjbGFzc3BhdGggdG8gYmUgdXNlZCBkdXJpbmcgY29tcGlsYXRpb24uCiAgICAgICovCisgICAgQE5vbk51bGwKICAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRCb290Q2xhc3NwYXRoKEBOb25OdWxsIFNka1BhcnNlciBzZGtQYXJzZXIpIHsKIAogICAgICAgICBMaXN0PFN0cmluZz4gY2xhc3NwYXRoID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CkBAIC0xOTAsMzUgKzE5NSw5MiBAQAogICAgICAgICByZXR1cm4gY2xhc3NwYXRoOwogICAgIH0KIAorICAgIC8qKiBTZXRzIHdoZXRoZXIgdGhpcyBidWlsZGVyIGlzIGN1cnJlbnRseSB1c2VkIHRvIGJ1aWxkIGEgbGlicmFyeS4gRGVmYXVsdHMgdG8gZmFsc2UuICovCisgICAgcHVibGljIEFuZHJvaWRCdWlsZGVyIHNldEJ1aWxkaW5nTGlicmFyeShib29sZWFuIGxpYnJhcnkpIHsKKyAgICAgICAgbUxpYnJhcnkgPSBsaWJyYXJ5OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKiogU2V0cyB3aGV0aGVyIHRoaXMgYnVpbGRlciBpcyBjdXJyZW50bHkgdXNlZCB0byBidWlsZCBhIGxpYnJhcnkgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0J1aWxkaW5nTGlicmFyeSgpIHsKKyAgICAgICAgcmV0dXJuIG1MaWJyYXJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbXBpbGUgY2xhc3NwYXRoIGZvciB0aGlzIGNvbmZpZy4gSWYgdGhlIGNvbmZpZyB0ZXN0cyBhIGxpYnJhcnksIHRoaXMKKyAgICAgKiB3aWxsIGluY2x1ZGUgdGhlIGNsYXNzcGF0aCBvZiB0aGUgdGVzdGVkIGNvbmZpZworICAgICAqCisgICAgICogQHJldHVybiBhIG5vbiBudWxsLCBidXQgcG9zc2libHkgZW1wdHkgc2V0LgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIFNldDxGaWxlPiBnZXRDb21waWxlQ2xhc3NwYXRoKEBOb25OdWxsIFZhcmlhbnRDb25maWd1cmF0aW9uIHZhcmlhbnRDb25maWd1cmF0aW9uKSB7CisgICAgICAgIFNldDxGaWxlPiBjb21waWxlQ2xhc3NwYXRoID0gdmFyaWFudENvbmZpZ3VyYXRpb24uZ2V0Q29tcGlsZUNsYXNzcGF0aCgpOworCisgICAgICAgIFByb2R1Y3RGbGF2b3IgbWVyZ2VkRmxhdm9yID0gdmFyaWFudENvbmZpZ3VyYXRpb24uZ2V0TWVyZ2VkRmxhdm9yKCk7CisKKyAgICAgICAgaWYgKG1lcmdlZEZsYXZvci5nZXRSZW5kZXJzY3JpcHRTdXBwb3J0TW9kZSgpKSB7CisgICAgICAgICAgICBGaWxlIHJlbmRlclNjcmlwdFN1cHBvcnRKYXIgPSBSZW5kZXJTY3JpcHRQcm9jZXNzb3IuZ2V0U3VwcG9ydEphcigKKyAgICAgICAgICAgICAgICAgICAgbUJ1aWxkVG9vbHMuZ2V0TG9jYXRpb24oKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgICAgIFNldDxGaWxlPiBmdWxsSmFycyA9IFNldHMubmV3SGFzaFNldFdpdGhFeHBlY3RlZFNpemUoY29tcGlsZUNsYXNzcGF0aC5zaXplKCkgKyAxKTsKKyAgICAgICAgICAgIGZ1bGxKYXJzLmFkZEFsbChjb21waWxlQ2xhc3NwYXRoKTsKKyAgICAgICAgICAgIGZ1bGxKYXJzLmFkZChyZW5kZXJTY3JpcHRTdXBwb3J0SmFyKTsKKyAgICAgICAgICAgIGNvbXBpbGVDbGFzc3BhdGggPSBmdWxsSmFyczsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb21waWxlQ2xhc3NwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcGFja2FnZWQgamFycyBmb3IgdGhpcyBjb25maWcuIElmIHRoZSBjb25maWcgdGVzdHMgYSBsaWJyYXJ5LCB0aGlzCisgICAgICogd2lsbCBpbmNsdWRlIHRoZSBqYXJzIG9mIHRoZSB0ZXN0ZWQgY29uZmlnCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbm9uIG51bGwsIGJ1dCBwb3NzaWJseSBlbXB0eSBsaXN0LgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIExpc3Q8RmlsZT4gZ2V0UGFja2FnZWRKYXJzKEBOb25OdWxsIFZhcmlhbnRDb25maWd1cmF0aW9uIHZhcmlhbnRDb25maWd1cmF0aW9uKSB7CisgICAgICAgIExpc3Q8RmlsZT4gcGFja2FnZWRKYXJzID0gdmFyaWFudENvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZWRKYXJzKCk7CisKKyAgICAgICAgUHJvZHVjdEZsYXZvciBtZXJnZWRGbGF2b3IgPSB2YXJpYW50Q29uZmlndXJhdGlvbi5nZXRNZXJnZWRGbGF2b3IoKTsKKworICAgICAgICBpZiAobWVyZ2VkRmxhdm9yLmdldFJlbmRlcnNjcmlwdFN1cHBvcnRNb2RlKCkpIHsKKyAgICAgICAgICAgIEZpbGUgcmVuZGVyU2NyaXB0U3VwcG9ydEphciA9IFJlbmRlclNjcmlwdFByb2Nlc3Nvci5nZXRTdXBwb3J0SmFyKAorICAgICAgICAgICAgICAgICAgICBtQnVpbGRUb29scy5nZXRMb2NhdGlvbigpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAgICAgTGlzdDxGaWxlPiBmdWxsSmFycyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShwYWNrYWdlZEphcnMuc2l6ZSgpICsgMSk7CisgICAgICAgICAgICBmdWxsSmFycy5hZGRBbGwocGFja2FnZWRKYXJzKTsKKyAgICAgICAgICAgIGZ1bGxKYXJzLmFkZChyZW5kZXJTY3JpcHRTdXBwb3J0SmFyKTsKKyAgICAgICAgICAgIHBhY2thZ2VkSmFycyA9IGZ1bGxKYXJzOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VkSmFyczsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBGaWxlIGdldFN1cHBvcnROYXRpdmVMaWJGb2xkZXIoKSB7CisgICAgICAgIHJldHVybiBSZW5kZXJTY3JpcHRQcm9jZXNzb3IuZ2V0U3VwcG9ydE5hdGl2ZUxpYkZvbGRlcigKKyAgICAgICAgICAgICAgICBtQnVpbGRUb29scy5nZXRMb2NhdGlvbigpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBBYXB0UnVubmVyfSBhYmxlIHRvIHJ1biBhYXB0IGNvbW1hbmRzLgogICAgICAqIEByZXR1cm4gYW4gQWFwdFJ1bm5lciBvYmplY3QKICAgICAgKi8KKyAgICBATm9uTnVsbAogICAgIHB1YmxpYyBBYXB0UnVubmVyIGdldEFhcHRSdW5uZXIoKSB7CiAgICAgICAgIHJldHVybiBuZXcgQWFwdFJ1bm5lcigKICAgICAgICAgICAgICAgICBtQnVpbGRUb29scy5nZXRQYXRoKEJ1aWxkVG9vbEluZm8uUGF0aElkLkFBUFQpLAogICAgICAgICAgICAgICAgIG1DbWRMaW5lUnVubmVyKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZSB0aGUgQnVpbGRDb25maWcgY2xhc3MgZm9yIHRoZSBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgcGFja2FnZSBpbiB3aGljaCB0byBnZW5lcmF0ZSB0aGUgY2xhc3MKLSAgICAgKiBAcGFyYW0gZGVidWdnYWJsZSB3aGV0aGVyIHRoZSBhcHAgaXMgY29uc2lkZXJlZCBkZWJ1Z2dhYmxlCi0gICAgICogQHBhcmFtIGphdmFMaW5lcyBhZGRpdGlvbmFsIGphdmEgbGluZXMgdG8gcHV0IGluIHRoZSBjbGFzcy4gVGhlc2UgbXVzdCBiZSB2YWxpZCBKYXZhIGxpbmVzLgotICAgICAqIEBwYXJhbSBzb3VyY2VPdXRwdXREaXIgZGlyZWN0b3J5IHdoZXJlIHRvIHB1dCB0aGlzLiBUaGlzIGlzIHRoZSBzb3VyY2UgZm9sZGVyLCBub3QgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlIGZvbGRlci4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVCdWlsZENvbmZpZygKLSAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVidWdnYWJsZSwKLSAgICAgICAgICAgIEBOb25OdWxsIExpc3Q8U3RyaW5nPiBqYXZhTGluZXMsCi0gICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgc291cmNlT3V0cHV0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEBOb25OdWxsCisgICAgcHVibGljIENvbW1hbmRMaW5lUnVubmVyIGdldENvbW1hbmRMaW5lUnVubmVyKCkgeworICAgICAgICByZXR1cm4gbUNtZExpbmVSdW5uZXI7CisgICAgfQogCi0gICAgICAgIEJ1aWxkQ29uZmlnR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBCdWlsZENvbmZpZ0dlbmVyYXRvcigKLSAgICAgICAgICAgICAgICBzb3VyY2VPdXRwdXREaXIsIHBhY2thZ2VOYW1lLCBkZWJ1Z2dhYmxlKTsKLSAgICAgICAgZ2VuZXJhdG9yLmdlbmVyYXRlKGphdmFMaW5lcyk7CisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgc3RhdGljIENsYXNzRmllbGQgY3JlYXRlQ2xhc3NGaWVsZChATm9uTnVsbCBTdHJpbmcgdHlwZSwgQE5vbk51bGwgU3RyaW5nIG5hbWUsIEBOb25OdWxsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IENsYXNzRmllbGRJbXBsKHR5cGUsIG5hbWUsIHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI2Niw5ICszMjgsMTEgQEAKICAgICAgICAgICAgICAgICAvLyBpZiBubyBtYW5pZmVzdCB0byBtZXJnZSwganVzdCBjb3B5IHRvIGxvY2F0aW9uLCB1bmxlc3Mgd2UgaGF2ZSB0byBpbmplY3QKICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGVzCiAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZUluamVjdGlvbi5pc0VtcHR5KCkgJiYgcGFja2FnZU92ZXJyaWRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZXMuY29weShtYWluTWFuaWZlc3QsIG5ldyBGaWxlKG91dE1hbmlmZXN0TG9jYXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgU2RrVXRpbHMuY29weVhtbFdpdGhTb3VyY2VSZWZlcmVuY2UobWFpbk1hbmlmZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKG91dE1hbmlmZXN0TG9jYXRpb24pKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdE1lcmdlciBtZXJnZXIgPSBuZXcgTWFuaWZlc3RNZXJnZXIoTWVyZ2VyTG9nLndyYXBTZGtMb2cobUxvZ2dlciksIG51bGwpOworICAgICAgICAgICAgICAgICAgICBtZXJnZXIuc2V0SW5zZXJ0U291cmNlTWFya2Vycyhpc0luc2VydFNvdXJjZU1hcmtlcnMoKSk7CiAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UobWVyZ2VyLCBuZXcgRmlsZShvdXRNYW5pZmVzdExvY2F0aW9uKSwgbWFpbk1hbmlmZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUluamVjdGlvbiwgcGFja2FnZU92ZXJyaWRlKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yODcsNiArMzUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0TWVyZ2VyIG1lcmdlciA9IG5ldyBNYW5pZmVzdE1lcmdlcihNZXJnZXJMb2cud3JhcFNka0xvZyhtTG9nZ2VyKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIG1lcmdlci5zZXRJbnNlcnRTb3VyY2VNYXJrZXJzKGlzSW5zZXJ0U291cmNlTWFya2VycygpKTsKICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZShtZXJnZXIsIG1haW5NYW5pZmVzdE91dCwgbWFpbk1hbmlmZXN0LCBtYW5pZmVzdE92ZXJsYXlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUluamVjdGlvbiwgcGFja2FnZU92ZXJyaWRlKTsKIApAQCAtMzE2LDYgKzM4MSw4IEBACiAgICAgICogQHBhcmFtIHRhcmdldFNka1ZlcnNpb24gdGhlIHRhcmdldFNka1ZlcnNpb24gb2YgdGhlIHRlc3QgYXBwbGljYXRpb24KICAgICAgKiBAcGFyYW0gdGVzdGVkUGFja2FnZU5hbWUgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgdGVzdGVkIGFwcGxpY2F0aW9uCiAgICAgICogQHBhcmFtIGluc3RydW1lbnRhdGlvblJ1bm5lciB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uIHJ1bm5lcgorICAgICAqIEBwYXJhbSBoYW5kbGVQcm9maWxpbmcgd2hldGhlciBvciBub3QgdGhlIEluc3RydW1lbnRhdGlvbiBvYmplY3Qgd2lsbCB0dXJuIHByb2ZpbGluZyBvbiBhbmQgb2ZmCisgICAgICogQHBhcmFtIGZ1bmN0aW9uYWxUZXN0IHdoZXRoZXIgb3Igbm90IHRoZSBJbnN0cnVtZW50YXRpb24gY2xhc3Mgc2hvdWxkIHJ1biBhcyBhIGZ1bmN0aW9uYWwgdGVzdAogICAgICAqIEBwYXJhbSBsaWJyYXJpZXMgdGhlIGxpYnJhcnkgZGVwZW5kZW5jeSBncmFwaAogICAgICAqIEBwYXJhbSBvdXRNYW5pZmVzdExvY2F0aW9uIHRoZSBvdXRwdXQgbG9jYXRpb24gZm9yIHRoZSBtZXJnZWQgbWFuaWZlc3QKICAgICAgKgpAQCAtMzI0LDYgKzM5MSw4IEBACiAgICAgICogQHNlZSBjb20uYW5kcm9pZC5idWlsZGVyLlZhcmlhbnRDb25maWd1cmF0aW9uI2dldE1pblNka1ZlcnNpb24oKQogICAgICAqIEBzZWUgY29tLmFuZHJvaWQuYnVpbGRlci5WYXJpYW50Q29uZmlndXJhdGlvbiNnZXRUZXN0ZWRQYWNrYWdlTmFtZSgpCiAgICAgICogQHNlZSBjb20uYW5kcm9pZC5idWlsZGVyLlZhcmlhbnRDb25maWd1cmF0aW9uI2dldEluc3RydW1lbnRhdGlvblJ1bm5lcigpCisgICAgICogQHNlZSBjb20uYW5kcm9pZC5idWlsZGVyLlZhcmlhbnRDb25maWd1cmF0aW9uI2dldEhhbmRsZVByb2ZpbGluZygpCisgICAgICogQHNlZSBjb20uYW5kcm9pZC5idWlsZGVyLlZhcmlhbnRDb25maWd1cmF0aW9uI2dldEZ1bmN0aW9uYWxUZXN0KCkKICAgICAgKiBAc2VlIGNvbS5hbmRyb2lkLmJ1aWxkZXIuVmFyaWFudENvbmZpZ3VyYXRpb24jZ2V0RGlyZWN0TGlicmFyaWVzKCkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVGVzdE1hbmlmZXN0KApAQCAtMzMyLDExICs0MDEsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgIGludCB0YXJnZXRTZGtWZXJzaW9uLAogICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHRlc3RlZFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIGluc3RydW1lbnRhdGlvblJ1bm5lciwKKyAgICAgICAgICAgIEBOb25OdWxsIEJvb2xlYW4gaGFuZGxlUHJvZmlsaW5nLAorICAgICAgICAgICAgQE5vbk51bGwgQm9vbGVhbiBmdW5jdGlvbmFsVGVzdCwKICAgICAgICAgICAgIEBOb25OdWxsIExpc3Q8PyBleHRlbmRzIE1hbmlmZXN0RGVwZW5kZW5jeT4gbGlicmFyaWVzLAogICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIG91dE1hbmlmZXN0TG9jYXRpb24pIHsKICAgICAgICAgY2hlY2tOb3ROdWxsKHRlc3RQYWNrYWdlTmFtZSwgInRlc3RQYWNrYWdlTmFtZSBjYW5ub3QgYmUgbnVsbC4iKTsKICAgICAgICAgY2hlY2tOb3ROdWxsKHRlc3RlZFBhY2thZ2VOYW1lLCAidGVzdGVkUGFja2FnZU5hbWUgY2Fubm90IGJlIG51bGwuIik7CiAgICAgICAgIGNoZWNrTm90TnVsbChpbnN0cnVtZW50YXRpb25SdW5uZXIsICJpbnN0cnVtZW50YXRpb25SdW5uZXIgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIGNoZWNrTm90TnVsbChoYW5kbGVQcm9maWxpbmcsICJoYW5kbGVQcm9maWxpbmcgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIGNoZWNrTm90TnVsbChmdW5jdGlvbmFsVGVzdCwgImZ1bmN0aW9uYWxUZXN0IGNhbm5vdCBiZSBudWxsLiIpOwogICAgICAgICBjaGVja05vdE51bGwobGlicmFyaWVzLCAibGlicmFyaWVzIGNhbm5vdCBiZSBudWxsLiIpOwogICAgICAgICBjaGVja05vdE51bGwob3V0TWFuaWZlc3RMb2NhdGlvbiwgIm91dE1hbmlmZXN0TG9jYXRpb24gY2Fubm90IGJlIG51bGwuIik7CiAKQEAgLTM1MSw2ICs0MjQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uUnVubmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUHJvZmlsaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25hbFRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRUZXN0TWFuaWZlc3QuZ2V0QWJzb2x1dGVQYXRoKCkpOwogCiAgICAgICAgICAgICAgICAgbWVyZ2VMaWJyYXJ5TWFuaWZlc3RzKApAQCAtMzY4LDYgKzQ0Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIHRhcmdldFNka1ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICBpbnN0cnVtZW50YXRpb25SdW5uZXIsCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZVByb2ZpbGluZywKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25hbFRlc3QsCiAgICAgICAgICAgICAgICAgICAgIG91dE1hbmlmZXN0TG9jYXRpb24pOwogICAgICAgICB9CiAgICAgfQpAQCAtMzc4LDYgKzQ1NSw4IEBACiAgICAgICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKICAgICAgICAgICAgIFN0cmluZyB0ZXN0ZWRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgIFN0cmluZyBpbnN0cnVtZW50YXRpb25SdW5uZXIsCisgICAgICAgICAgICBCb29sZWFuIGhhbmRsZVByb2ZpbGluZywKKyAgICAgICAgICAgIEJvb2xlYW4gZnVuY3Rpb25hbFRlc3QsCiAgICAgICAgICAgICBTdHJpbmcgb3V0TWFuaWZlc3RMb2NhdGlvbikgewogICAgICAgICBUZXN0TWFuaWZlc3RHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IFRlc3RNYW5pZmVzdEdlbmVyYXRvcigKICAgICAgICAgICAgICAgICBvdXRNYW5pZmVzdExvY2F0aW9uLApAQCAtMzg1LDcgKzQ2NCw5IEBACiAgICAgICAgICAgICAgICAgbWluU2RrVmVyc2lvbiwKICAgICAgICAgICAgICAgICB0YXJnZXRTZGtWZXJzaW9uLAogICAgICAgICAgICAgICAgIHRlc3RlZFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGluc3RydW1lbnRhdGlvblJ1bm5lcik7CisgICAgICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uUnVubmVyLAorICAgICAgICAgICAgICAgIGhhbmRsZVByb2ZpbGluZywKKyAgICAgICAgICAgICAgICBmdW5jdGlvbmFsVGVzdCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBnZW5lcmF0b3IuZ2VuZXJhdGUoKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewpAQCAtNDQzLDcgKzUyNCw3IEBACiAKICAgICAgICAgTGlzdDxGaWxlPiBtYW5pZmVzdHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKICAgICAgICAgZm9yIChNYW5pZmVzdERlcGVuZGVuY3kgbGlicmFyeSA6IGRpcmVjdExpYnJhcmllcykgewotICAgICAgICAgICAgTGlzdDw/IGV4dGVuZHMgTWFuaWZlc3REZXBlbmRlbmN5PiBzdWJMaWJyYXJpZXMgPSBsaWJyYXJ5LmdldE1hbmlmZXN0RGVwZW5kZW5jaWVzKCk7CisgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNYW5pZmVzdERlcGVuZGVuY3k+IHN1YkxpYnJhcmllcyA9IGxpYnJhcnkuZ2V0TWFuaWZlc3REZXBlbmRlbmNpZXMoKTsKICAgICAgICAgICAgIGlmIChzdWJMaWJyYXJpZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgbWFuaWZlc3RzLmFkZChsaWJyYXJ5LmdldE1hbmlmZXN0KCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTQ1OSw5ICs1NDAsMjcgQEAKICAgICAgICAgfQogCiAgICAgICAgIE1hbmlmZXN0TWVyZ2VyIG1lcmdlciA9IG5ldyBNYW5pZmVzdE1lcmdlcihNZXJnZXJMb2cud3JhcFNka0xvZyhtTG9nZ2VyKSwgbnVsbCk7CisgICAgICAgIG1lcmdlci5zZXRJbnNlcnRTb3VyY2VNYXJrZXJzKGlzSW5zZXJ0U291cmNlTWFya2VycygpKTsKICAgICAgICAgZG9NZXJnZShtZXJnZXIsIG91dE1hbmlmZXN0LCBtYWluTWFuaWZlc3QsIG1hbmlmZXN0cywgYXR0cmlidXRlSW5qZWN0aW9uLCBwYWNrYWdlT3ZlcnJpZGUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB3ZSBzaG91bGQgaW5zZXJ0IHNvdXJjZSBtYXJrZXJzIGluIGdlbmVyYXRlZCBmaWxlcyAoc3VjaCBhcworICAgICAqIFhNTCByZXNvdXJjZXMgYW5kIG1lcmdlZCBtYW5pZmVzdCBmaWxlcykKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSB0byBnZW5lcmF0ZSBzb3VyY2UgY29tbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luc2VydFNvdXJjZU1hcmtlcnMoKSB7CisgICAgICAgIC8vIEluIHJlbGVhc2UgbGlicmFyeSBidWlsZHMgKGdlbmVyYXRpbmcgQUFSJ3MpIHdlIGRvbid0IHdhbnQgc291cmNlIGNvbW1lbnRzLgorICAgICAgICAvLyBJbiBvdGhlciBzY2VuYXJpb3MgKGUuZy4gZHVyaW5nIGRldmVsb3BtZW50KSB3ZSBkby4KKworICAgICAgICAvLyBUT0RPOiBGaW5kIG91dCB3aGV0aGVyIHdlJ3JlIGJ1aWxkaW5nIGluIGEgcmVsZWFzZSBidWlsZCB0eXBlCisgICAgICAgIGJvb2xlYW4gaXNSZWxlYXNlID0gZmFsc2U7CisKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRDb25kaXRpb25zCisgICAgICAgIHJldHVybiAhKG1MaWJyYXJ5ICYmIGlzUmVsZWFzZSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGRvTWVyZ2UoTWFuaWZlc3RNZXJnZXIgbWVyZ2VyLCBGaWxlIG91dHB1dCwgRmlsZSBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGluamVjdGlvbk1hcCwgU3RyaW5nIHBhY2thZ2VPdmVycmlkZSkgewogICAgICAgICBMaXN0PEZpbGU+IGxpc3QgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKQEAgLTUwOSw3ICs2MDgsOCBAQAogICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBwcm9ndWFyZE91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICBWYXJpYW50Q29uZmlndXJhdGlvbi5UeXBlIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWJ1Z2dhYmxlLAotICAgICAgICAgICAgQE5vbk51bGwgQWFwdE9wdGlvbnMgb3B0aW9ucykKKyAgICAgICAgICAgIEBOb25OdWxsIEFhcHRPcHRpb25zIG9wdGlvbnMsCisgICAgICAgICAgICBATm9uTnVsbCBDb2xsZWN0aW9uPFN0cmluZz4gcmVzb3VyY2VDb25maWdzKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgTG9nZ2VkRXJyb3JFeGNlcHRpb24gewogCiAgICAgICAgIGNoZWNrTm90TnVsbChtYW5pZmVzdEZpbGUsICJtYW5pZmVzdEZpbGUgY2Fubm90IGJlIG51bGwuIik7CkBAIC01NjQsMTQgKzY2NCwxNCBAQAogICAgICAgICAgICAgY29tbWFuZC5hZGQoc291cmNlT3V0cHV0RGlyKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh0eXBlICE9IFZhcmlhbnRDb25maWd1cmF0aW9uLlR5cGUuTElCUkFSWSAmJiByZXNQYWNrYWdlT3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHJlc1BhY2thZ2VPdXRwdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgY29tbWFuZC5hZGQoIi1GIik7CiAgICAgICAgICAgICBjb21tYW5kLmFkZChyZXNQYWNrYWdlT3V0cHV0KTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocHJvZ3VhcmRPdXRwdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbW1hbmQuYWRkKCItRyIpOwotICAgICAgICAgICAgICAgIGNvbW1hbmQuYWRkKHByb2d1YXJkT3V0cHV0KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2d1YXJkT3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbW1hbmQuYWRkKCItRyIpOworICAgICAgICAgICAgY29tbWFuZC5hZGQocHJvZ3VhcmRPdXRwdXQpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gb3B0aW9ucyBjb250cm9sbGVkIGJ5IGJ1aWxkIHZhcmlhbnRzCkBAIC02MDAsNyArNzAwLDcgQEAKICAgICAgICAgICAgIGNvbW1hbmQuYWRkKGlnbm9yZUFzc2V0cyk7CiAgICAgICAgIH0KIAotICAgICAgICBMaXN0PFN0cmluZz4gbm9Db21wcmVzc0xpc3QgPSBvcHRpb25zLmdldE5vQ29tcHJlc3MoKTsKKyAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IG5vQ29tcHJlc3NMaXN0ID0gb3B0aW9ucy5nZXROb0NvbXByZXNzKCk7CiAgICAgICAgIGlmIChub0NvbXByZXNzTGlzdCAhPSBudWxsKSB7CiAgICAgICAgICAgICBmb3IgKFN0cmluZyBub0NvbXByZXNzIDogbm9Db21wcmVzc0xpc3QpIHsKICAgICAgICAgICAgICAgICBjb21tYW5kLmFkZCgiLTAiKTsKQEAgLTYwOCw2ICs3MDgsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmICghcmVzb3VyY2VDb25maWdzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgY29tbWFuZC5hZGQoIi1jIik7CisKKyAgICAgICAgICAgIEpvaW5lciBqb2luZXIgPSBKb2luZXIub24oJywnKTsKKyAgICAgICAgICAgIGNvbW1hbmQuYWRkKGpvaW5lci5qb2luKHJlc291cmNlQ29uZmlncykpOworICAgICAgICB9CisKICAgICAgICAgaWYgKHN5bWJvbE91dHB1dERpciAhPSBudWxsICYmCiAgICAgICAgICAgICAgICAgKHR5cGUgPT0gVmFyaWFudENvbmZpZ3VyYXRpb24uVHlwZS5MSUJSQVJZIHx8ICFsaWJyYXJpZXMuaXNFbXB0eSgpKSkgewogICAgICAgICAgICAgY29tbWFuZC5hZGQoIi0tb3V0cHV0LXRleHQtc3ltYm9scyIpOwpAQCAtNzgyLDkgKzg4OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBMaXN0PEZpbGU+IGltcG9ydEZvbGRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIEZpbGUgc291cmNlT3V0cHV0RGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBGaWxlIHJlc091dHB1dERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgRmlsZSBvYmpPdXRwdXREaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIEZpbGUgbGliT3V0cHV0RGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0QXBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlYnVnQnVpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcHRpbUxldmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3B0aW1MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZGtNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgU2V0PFN0cmluZz4gYWJpRmlsdGVycykKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIExvZ2dlZEVycm9yRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tOb3ROdWxsKHNvdXJjZUZvbGRlcnMsICJzb3VyY2VGb2xkZXJzIGNhbm5vdCBiZSBudWxsLiIpOwogICAgICAgICBjaGVja05vdE51bGwoaW1wb3J0Rm9sZGVycywgImltcG9ydEZvbGRlcnMgY2Fubm90IGJlIG51bGwuIik7CkBAIC03OTYsNzYgKzkwOCwyNiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibGx2bS1ycy1jYyBpcyBtaXNzaW5nIik7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBnYXRoZXIgdGhlIGZpbGVzIHRvIGNvbXBpbGUKLSAgICAgICAgRmlsZUdhdGhlcmVyIGZpbGVHYXRoZXJlciA9IG5ldyBGaWxlR2F0aGVyZXIoKTsKLSAgICAgICAgU291cmNlU2VhcmNoZXIgc2VhcmNoZXIgPSBuZXcgU291cmNlU2VhcmNoZXIoc291cmNlRm9sZGVycywgInJzIiwgImZzIik7Ci0gICAgICAgIHNlYXJjaGVyLnNldFVzZUV4ZWN1dG9yKGZhbHNlKTsKLSAgICAgICAgc2VhcmNoZXIuc2VhcmNoKGZpbGVHYXRoZXJlcik7Ci0KLSAgICAgICAgTGlzdDxGaWxlPiByZW5kZXJzY3JpcHRGaWxlcyA9IGZpbGVHYXRoZXJlci5nZXRGaWxlcygpOwotCi0gICAgICAgIGlmIChyZW5kZXJzY3JpcHRGaWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHN1cHBvcnRNb2RlICYmIG1CdWlsZFRvb2xzLmdldFJldmlzaW9uKCkuY29tcGFyZVRvKG5ldyBGdWxsUmV2aXNpb24oMTgsMSwgMCkpID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiUmVuZGVyU2NyaXB0IFN1cHBvcnQgTW9kZSByZXF1aXJlcyBidWlsZFRvb2xzVmVyc2lvbiA+PSAxOC4xIik7CiAgICAgICAgIH0KIAotICAgICAgICBTdHJpbmcgcnNQYXRoID0gbUJ1aWxkVG9vbHMuZ2V0UGF0aChCdWlsZFRvb2xJbmZvLlBhdGhJZC5BTkRST0lEX1JTKTsKLSAgICAgICAgU3RyaW5nIHJzQ2xhbmdQYXRoID0gbUJ1aWxkVG9vbHMuZ2V0UGF0aChCdWlsZFRvb2xJbmZvLlBhdGhJZC5BTkRST0lEX1JTX0NMQU5HKTsKLQotICAgICAgICAvLyB0aGUgcmVuZGVyc2NyaXB0IGNvbXBpbGVyIGRvZXNuJ3QgZXhwZWN0IHRoZSB0b3AgcmVzIGZvbGRlciwKLSAgICAgICAgLy8gYnV0IHRoZSByYXcgZm9sZGVyIGRpcmVjdGx5LgotICAgICAgICBGaWxlIHJhd0ZvbGRlciA9IG5ldyBGaWxlKHJlc091dHB1dERpciwgU2RrQ29uc3RhbnRzLkZEX1JFU19SQVcpOwotCi0gICAgICAgIC8vIGNvbXBpbGUgYWxsIHRoZSBmaWxlcyBpbiBhIHNpbmdsZSBwYXNzCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGNvbW1hbmQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKLQotICAgICAgICBjb21tYW5kLmFkZChyZW5kZXJzY3JpcHQpOwotCi0gICAgICAgIGlmIChkZWJ1Z0J1aWxkKSB7Ci0gICAgICAgICAgICBjb21tYW5kLmFkZCgiLWciKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbW1hbmQuYWRkKCItTyIpOwotICAgICAgICBjb21tYW5kLmFkZChJbnRlZ2VyLnRvU3RyaW5nKG9wdGltTGV2ZWwpKTsKLQotICAgICAgICAvLyBhZGQgYWxsIGltcG9ydCBwYXRocwotICAgICAgICBjb21tYW5kLmFkZCgiLUkiKTsKLSAgICAgICAgY29tbWFuZC5hZGQocnNQYXRoKTsKLSAgICAgICAgY29tbWFuZC5hZGQoIi1JIik7Ci0gICAgICAgIGNvbW1hbmQuYWRkKHJzQ2xhbmdQYXRoKTsKLQotICAgICAgICBmb3IgKEZpbGUgaW1wb3J0UGF0aCA6IGltcG9ydEZvbGRlcnMpIHsKLSAgICAgICAgICAgIGlmIChpbXBvcnRQYXRoLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICBjb21tYW5kLmFkZCgiLUkiKTsKLSAgICAgICAgICAgICAgICBjb21tYW5kLmFkZChpbXBvcnRQYXRoLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNvdXJjZSBvdXRwdXQKLSAgICAgICAgY29tbWFuZC5hZGQoIi1wIik7Ci0gICAgICAgIGNvbW1hbmQuYWRkKHNvdXJjZU91dHB1dERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgLy8gcmVzIG91dHB1dAotICAgICAgICBjb21tYW5kLmFkZCgiLW8iKTsKLSAgICAgICAgY29tbWFuZC5hZGQocmF3Rm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICBjb21tYW5kLmFkZCgiLXRhcmdldC1hcGkiKTsKLSAgICAgICAgY29tbWFuZC5hZGQoSW50ZWdlci50b1N0cmluZyh0YXJnZXRBcGkgPCAxMSA/IDExIDogdGFyZ2V0QXBpKSk7Ci0KLSAgICAgICAgLy8gaW5wdXQgZmlsZXMKLSAgICAgICAgZm9yIChGaWxlIHNvdXJjZUZpbGUgOiByZW5kZXJzY3JpcHRGaWxlcykgewotICAgICAgICAgICAgY29tbWFuZC5hZGQoc291cmNlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudiA9IG51bGw7Ci0gICAgICAgIGlmIChTZGtDb25zdGFudHMuQ1VSUkVOVF9QTEFURk9STSA9PSBTZGtDb25zdGFudHMuUExBVEZPUk1fREFSV0lOKSB7Ci0gICAgICAgICAgICBlbnYgPSBNYXBzLm5ld0hhc2hNYXAoKTsKLSAgICAgICAgICAgIGVudi5wdXQoIkRZTERfTElCUkFSWV9QQVRIIiwgbUJ1aWxkVG9vbHMuZ2V0TG9jYXRpb24oKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoU2RrQ29uc3RhbnRzLkNVUlJFTlRfUExBVEZPUk0gPT0gU2RrQ29uc3RhbnRzLlBMQVRGT1JNX0xJTlVYKSB7Ci0gICAgICAgICAgICBlbnYgPSBNYXBzLm5ld0hhc2hNYXAoKTsKLSAgICAgICAgICAgIGVudi5wdXQoIkxEX0xJQlJBUllfUEFUSCIsIG1CdWlsZFRvb2xzLmdldExvY2F0aW9uKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNtZExpbmVSdW5uZXIucnVuQ21kTGluZShjb21tYW5kLCBlbnYpOworICAgICAgICBSZW5kZXJTY3JpcHRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFJlbmRlclNjcmlwdFByb2Nlc3NvcigKKyAgICAgICAgICAgICAgICBzb3VyY2VGb2xkZXJzLAorICAgICAgICAgICAgICAgIGltcG9ydEZvbGRlcnMsCisgICAgICAgICAgICAgICAgc291cmNlT3V0cHV0RGlyLAorICAgICAgICAgICAgICAgIHJlc091dHB1dERpciwKKyAgICAgICAgICAgICAgICBvYmpPdXRwdXREaXIsCisgICAgICAgICAgICAgICAgbGliT3V0cHV0RGlyLAorICAgICAgICAgICAgICAgIG1CdWlsZFRvb2xzLAorICAgICAgICAgICAgICAgIHRhcmdldEFwaSwKKyAgICAgICAgICAgICAgICBkZWJ1Z0J1aWxkLAorICAgICAgICAgICAgICAgIG9wdGltTGV2ZWwsCisgICAgICAgICAgICAgICAgbmRrTW9kZSwKKyAgICAgICAgICAgICAgICBzdXBwb3J0TW9kZSwKKyAgICAgICAgICAgICAgICBhYmlGaWx0ZXJzKTsKKyAgICAgICAgcHJvY2Vzc29yLmJ1aWxkKG1DbWRMaW5lUnVubmVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTkxMCw4ICs5NzIsOCBAQAogCiAgICAgLyoqCiAgICAgICogQ29udmVydHMgdGhlIGJ5dGVjb2RlIHRvIERhbHZpayBmb3JtYXQKLSAgICAgKiBAcGFyYW0gY2xhc3Nlc0xvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcGlsZXIgb3V0cHV0Ci0gICAgICogQHBhcmFtIGxpYnJhcmllcyB0aGUgbGlzdCBvZiBsaWJyYXJpZXMKKyAgICAgKiBAcGFyYW0gaW5wdXRzIHRoZSBpbnB1dCBmaWxlcworICAgICAqIEBwYXJhbSBwcmVEZXhlZExpYnJhcmllcyB0aGUgbGlzdCBvZiBwcmUtZGV4ZWQgbGlicmFyaWVzCiAgICAgICogQHBhcmFtIG91dERleEZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBvdXRwdXQgY2xhc3Nlcy5kZXggZmlsZQogICAgICAqIEBwYXJhbSBkZXhPcHRpb25zIGRleCBvcHRpb25zCiAgICAgICogQHBhcmFtIGluY3JlbWVudGFsIHRydWUgaWYgaXQgc2hvdWxkIGF0dGVtcHQgaW5jcmVtZW50YWwgZGV4IGlmIGFwcGxpY2FibGUKQEAgLTkyMSwxNCArOTgzLDEzIEBACiAgICAgICogQHRocm93cyBMb2dnZWRFcnJvckV4Y2VwdGlvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNvbnZlcnRCeXRlQ29kZSgKLSAgICAgICAgICAgIEBOb25OdWxsIEl0ZXJhYmxlPEZpbGU+IGNsYXNzZXNMb2NhdGlvbiwKLSAgICAgICAgICAgIEBOb25OdWxsIEl0ZXJhYmxlPEZpbGU+IGxpYnJhcmllcywKLSAgICAgICAgICAgIEBOdWxsYWJsZSBGaWxlIHByb2d1YXJkRmlsZSwKLSAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBvdXREZXhGaWxlLAorICAgICAgICAgICAgQE5vbk51bGwgSXRlcmFibGU8RmlsZT4gaW5wdXRzLAorICAgICAgICAgICAgQE5vbk51bGwgSXRlcmFibGU8RmlsZT4gcHJlRGV4ZWRMaWJyYXJpZXMsCisgICAgICAgICAgICBATm9uTnVsbCBGaWxlIG91dERleEZpbGUsCiAgICAgICAgICAgICBATm9uTnVsbCBEZXhPcHRpb25zIGRleE9wdGlvbnMsCiAgICAgICAgICAgICBib29sZWFuIGluY3JlbWVudGFsKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBMb2dnZWRFcnJvckV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrTm90TnVsbChjbGFzc2VzTG9jYXRpb24sICJjbGFzc2VzTG9jYXRpb24gY2Fubm90IGJlIG51bGwuIik7Ci0gICAgICAgIGNoZWNrTm90TnVsbChsaWJyYXJpZXMsICJsaWJyYXJpZXMgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIGNoZWNrTm90TnVsbChpbnB1dHMsICJpbnB1dHMgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIGNoZWNrTm90TnVsbChwcmVEZXhlZExpYnJhcmllcywgInByZURleGVkTGlicmFyaWVzIGNhbm5vdCBiZSBudWxsLiIpOwogICAgICAgICBjaGVja05vdE51bGwob3V0RGV4RmlsZSwgIm91dERleEZpbGUgY2Fubm90IGJlIG51bGwuIik7CiAgICAgICAgIGNoZWNrTm90TnVsbChkZXhPcHRpb25zLCAiZGV4T3B0aW9ucyBjYW5ub3QgYmUgbnVsbC4iKTsKIApAQCAtOTU2LDQ1ICsxMDE3LDk5IEBACiAgICAgICAgICAgICBjb21tYW5kLmFkZCgiLS1jb3JlLWxpYnJhcnkiKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChkZXhPcHRpb25zLmdldEp1bWJvTW9kZSgpKSB7CisgICAgICAgICAgICBjb21tYW5kLmFkZCgiLS1mb3JjZS1qdW1ibyIpOworICAgICAgICB9CisKICAgICAgICAgaWYgKGluY3JlbWVudGFsKSB7CiAgICAgICAgICAgICBjb21tYW5kLmFkZCgiLS1pbmNyZW1lbnRhbCIpOwogICAgICAgICAgICAgY29tbWFuZC5hZGQoIi0tbm8tc3RyaWN0Iik7CiAgICAgICAgIH0KIAogICAgICAgICBjb21tYW5kLmFkZCgiLS1vdXRwdXQiKTsKLSAgICAgICAgY29tbWFuZC5hZGQob3V0RGV4RmlsZSk7CisgICAgICAgIGNvbW1hbmQuYWRkKG91dERleEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogCi0gICAgICAgIC8vIGNsZWFuIHVwIGFuZCBhZGQgY2xhc3MgaW5wdXRzCi0gICAgICAgIExpc3Q8U3RyaW5nPiBjbGFzc2VzTGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwotICAgICAgICBmb3IgKEZpbGUgZiA6IGNsYXNzZXNMb2NhdGlvbikgeworICAgICAgICAvLyBjbGVhbiB1cCBpbnB1dCBsaXN0CisgICAgICAgIExpc3Q8U3RyaW5nPiBpbnB1dExpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChGaWxlIGYgOiBpbnB1dHMpIHsKICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgZi5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGNsYXNzZXNMaXN0LmFkZChmLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICBpbnB1dExpc3QuYWRkKGYuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFjbGFzc2VzTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Mb2dnZXIudmVyYm9zZSgiRGV4IGNsYXNzIGlucHV0czogIiArIGNsYXNzZXNMaXN0KTsKLSAgICAgICAgICAgIGNvbW1hbmQuYWRkQWxsKGNsYXNzZXNMaXN0KTsKKyAgICAgICAgaWYgKCFpbnB1dExpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtTG9nZ2VyLnZlcmJvc2UoIkRleCBpbnB1dHM6ICIgKyBpbnB1dExpc3QpOworICAgICAgICAgICAgY29tbWFuZC5hZGRBbGwoaW5wdXRMaXN0KTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNsZWFuIHVwIGFuZCBhZGQgbGlicmFyeSBpbnB1dHMuCiAgICAgICAgIExpc3Q8U3RyaW5nPiBsaWJyYXJ5TGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwotICAgICAgICBmb3IgKEZpbGUgZiA6IGxpYnJhcmllcykgeworICAgICAgICBmb3IgKEZpbGUgZiA6IHByZURleGVkTGlicmFyaWVzKSB7CiAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIGYuZXhpc3RzKCkpIHsKICAgICAgICAgICAgICAgICBsaWJyYXJ5TGlzdC5hZGQoZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIWxpYnJhcnlMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbUxvZ2dlci52ZXJib3NlKCJEZXggbGlicmFyeSBpbnB1dHM6ICIgKyBsaWJyYXJ5TGlzdCk7CisgICAgICAgICAgICBtTG9nZ2VyLnZlcmJvc2UoIkRleCBwcmUtZGV4ZWQgaW5wdXRzOiAiICsgbGlicmFyeUxpc3QpOwogICAgICAgICAgICAgY29tbWFuZC5hZGRBbGwobGlicmFyeUxpc3QpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHByb2d1YXJkRmlsZSAhPSBudWxsICYmIHByb2d1YXJkRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgbUxvZ2dlci52ZXJib3NlKCJQcm9HdWFyZGVkIGlucHV0cyAiICsgcHJvZ3VhcmRGaWxlKTsKLSAgICAgICAgICAgIGNvbW1hbmQuYWRkKHByb2d1YXJkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIG1DbWRMaW5lUnVubmVyLnJ1bkNtZExpbmUoY29tbWFuZCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhlIGJ5dGVjb2RlIHRvIERhbHZpayBmb3JtYXQKKyAgICAgKiBAcGFyYW0gaW5wdXRGaWxlIHRoZSBpbnB1dCBmaWxlCisgICAgICogQHBhcmFtIG91dEZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBvdXRwdXQgY2xhc3Nlcy5kZXggZmlsZQorICAgICAqIEBwYXJhbSBkZXhPcHRpb25zIGRleCBvcHRpb25zCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgTG9nZ2VkRXJyb3JFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmVEZXhMaWJyYXJ5KAorICAgICAgICAgICAgQE5vbk51bGwgRmlsZSBpbnB1dEZpbGUsCisgICAgICAgICAgICBATm9uTnVsbCBGaWxlIG91dEZpbGUsCisgICAgICAgICAgICBATm9uTnVsbCBEZXhPcHRpb25zIGRleE9wdGlvbnMpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBMb2dnZWRFcnJvckV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTm90TnVsbChpbnB1dEZpbGUsICJpbnB1dEZpbGUgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIGNoZWNrTm90TnVsbChvdXRGaWxlLCAib3V0RmlsZSBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGRleE9wdGlvbnMsICJkZXhPcHRpb25zIGNhbm5vdCBiZSBudWxsLiIpOworCisgICAgICAgIC8vIGxhdW5jaCBkeDogY3JlYXRlIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gY29tbWFuZCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgICAgIFN0cmluZyBkeCA9IG1CdWlsZFRvb2xzLmdldFBhdGgoQnVpbGRUb29sSW5mby5QYXRoSWQuRFgpOworICAgICAgICBpZiAoZHggPT0gbnVsbCB8fCAhbmV3IEZpbGUoZHgpLmlzRmlsZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkeCBpcyBtaXNzaW5nIik7CiAgICAgICAgIH0KIAorICAgICAgICBjb21tYW5kLmFkZChkeCk7CisKKyAgICAgICAgaWYgKGRleE9wdGlvbnMuZ2V0SmF2YU1heEhlYXBTaXplKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY29tbWFuZC5hZGQoIi1KWG14IiArIGRleE9wdGlvbnMuZ2V0SmF2YU1heEhlYXBTaXplKCkpOworICAgICAgICB9CisKKyAgICAgICAgY29tbWFuZC5hZGQoIi0tZGV4Iik7CisKKyAgICAgICAgaWYgKG1WZXJib3NlRXhlYykgeworICAgICAgICAgICAgY29tbWFuZC5hZGQoIi0tdmVyYm9zZSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRleE9wdGlvbnMuaXNDb3JlTGlicmFyeSgpKSB7CisgICAgICAgICAgICBjb21tYW5kLmFkZCgiLS1jb3JlLWxpYnJhcnkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXhPcHRpb25zLmdldEp1bWJvTW9kZSgpKSB7CisgICAgICAgICAgICBjb21tYW5kLmFkZCgiLS1mb3JjZS1qdW1ibyIpOworICAgICAgICB9CisKKyAgICAgICAgY29tbWFuZC5hZGQoIi0tb3V0cHV0Iik7CisgICAgICAgIGNvbW1hbmQuYWRkKG91dEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIGNvbW1hbmQuYWRkKGlucHV0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKICAgICAgICAgbUNtZExpbmVSdW5uZXIucnVuQ21kTGluZShjb21tYW5kLCBudWxsKTsKICAgICB9CiAKQEAgLTEwMDUsNyArMTEyMCw4IEBACiAgICAgICogQHBhcmFtIGNsYXNzZXNEZXhMb2NhdGlvbiB0aGUgbG9jYXRpb24gb2YgdGhlIGNsYXNzZXMuZGV4IGZpbGUKICAgICAgKiBAcGFyYW0gcGFja2FnZWRKYXJzIHRoZSBqYXJzIHRoYXQgYXJlIHBhY2thZ2VkIChsaWJyYXJpZXMgKyBqYXIgZGVwZW5kZW5jaWVzKQogICAgICAqIEBwYXJhbSBqYXZhUmVzb3VyY2VzTG9jYXRpb24gdGhlIHByb2Nlc3NlZCBKYXZhIHJlc291cmNlIGZvbGRlcgotICAgICAqIEBwYXJhbSBqbmlMaWJzTG9jYXRpb24gdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21waWxlZCBKTkkgbGlicmFyaWVzCisgICAgICogQHBhcmFtIGpuaUxpYnNGb2xkZXJzIHRoZSBmb2xkZXJzIGNvbnRhaW5pbmcgam5pIHNoYXJlZCBsaWJyYXJpZXMKKyAgICAgKiBAcGFyYW0gYWJpRmlsdGVycyBvcHRpb25hbCBBQkkgZmlsdGVyCiAgICAgICogQHBhcmFtIGpuaURlYnVnQnVpbGQgd2hldGhlciB0aGUgYXBwIHNob3VsZCBpbmNsdWRlIGpuaSBkZWJ1ZyBkYXRhCiAgICAgICogQHBhcmFtIHNpZ25pbmdDb25maWcgdGhlIHNpZ25pbmcgY29uZmlndXJhdGlvbgogICAgICAqIEBwYXJhbSBvdXRBcGtMb2NhdGlvbiBsb2NhdGlvbiBvZiB0aGUgQVBLLgpAQCAtMTAyMiw3ICsxMTM4LDggQEAKICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBjbGFzc2VzRGV4TG9jYXRpb24sCiAgICAgICAgICAgICBATm9uTnVsbCBMaXN0PEZpbGU+IHBhY2thZ2VkSmFycywKICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgamF2YVJlc291cmNlc0xvY2F0aW9uLAotICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBqbmlMaWJzTG9jYXRpb24sCisgICAgICAgICAgICBATnVsbGFibGUgQ29sbGVjdGlvbjxGaWxlPiBqbmlMaWJzRm9sZGVycywKKyAgICAgICAgICAgIEBOdWxsYWJsZSBTZXQ8U3RyaW5nPiBhYmlGaWx0ZXJzLAogICAgICAgICAgICAgYm9vbGVhbiBqbmlEZWJ1Z0J1aWxkLAogICAgICAgICAgICAgQE51bGxhYmxlIFNpZ25pbmdDb25maWcgc2lnbmluZ0NvbmZpZywKICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBvdXRBcGtMb2NhdGlvbikgdGhyb3dzIER1cGxpY2F0ZUZpbGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwKQEAgLTEwNTksOCArMTE3NiwxMCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBhbHNvIGFkZCByZXNvdXJjZXMgZnJvbSBsaWJyYXJ5IHByb2plY3RzIGFuZCBqYXJzCi0gICAgICAgICAgICBpZiAoam5pTGlic0xvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYWNrYWdlci5hZGROYXRpdmVMaWJyYXJpZXMoam5pTGlic0xvY2F0aW9uKTsKKyAgICAgICAgICAgIGlmIChqbmlMaWJzRm9sZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChGaWxlIGpuaUZvbGRlciA6IGpuaUxpYnNGb2xkZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VyLmFkZE5hdGl2ZUxpYnJhcmllcyhqbmlGb2xkZXIsIGFiaUZpbHRlcnMpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcGFja2FnZXIuc2VhbEFwaygpOwpkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvRGVmYXVsdEJ1aWxkVHlwZS5qYXZhIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvRGVmYXVsdEJ1aWxkVHlwZS5qYXZhCmluZGV4IGVhODJlMTIuLjYzYWJmMDAgMTAwNjQ0Ci0tLSBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL0RlZmF1bHRCdWlsZFR5cGUuamF2YQorKysgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9EZWZhdWx0QnVpbGRUeXBlLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLmludGVybmFsLkJhc2VDb25maWdJbXBsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQnVpbGRUeXBlOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuTmRrQ29uZmlnOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuU2lnbmluZ0NvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CiAKQEAgLTExMSw3ICsxMTIsOCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIEBOdWxsYWJsZSBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lU3VmZml4KCkgeworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVTdWZmaXgoKSB7CiAgICAgICAgIHJldHVybiBtUGFja2FnZU5hbWVTdWZmaXg7CiAgICAgfQogCkBAIC0xMjIsNyArMTI0LDggQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBATnVsbGFibGUgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uTmFtZVN1ZmZpeCgpIHsKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25OYW1lU3VmZml4KCkgewogICAgICAgICByZXR1cm4gbVZlcnNpb25OYW1lU3VmZml4OwogICAgIH0KIApAQCAtMTYwLDYgKzE2MywxMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBOZGtDb25maWcgZ2V0TmRrQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKICAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CiAgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL0RlZmF1bHRNYW5pZmVzdFBhcnNlci5qYXZhIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvRGVmYXVsdE1hbmlmZXN0UGFyc2VyLmphdmEKaW5kZXggOTdkODUzMy4uZThkNzBkNiAxMDA2NDQKLS0tIGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvRGVmYXVsdE1hbmlmZXN0UGFyc2VyLmphdmEKKysrIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvRGVmYXVsdE1hbmlmZXN0UGFyc2VyLmphdmEKQEAgLTY3LDYgKzY3LDI3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRWZXJzaW9uQ29kZShATm9uTnVsbCBGaWxlIG1hbmlmZXN0RmlsZSkgeworICAgICAgICBYUGF0aCB4cGF0aCA9IEFuZHJvaWRYUGF0aEZhY3RvcnkubmV3WFBhdGgoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlPSB4cGF0aC5ldmFsdWF0ZSgiL21hbmlmZXN0L0BhbmRyb2lkOnZlcnNpb25Db2RlIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0obWFuaWZlc3RGaWxlKSkpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB3b24ndCBoYXBwZW4uCisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHJldHVybiAtMSBiZWxvdy4KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldE1pblNka1ZlcnNpb24oQE5vbk51bGwgRmlsZSBtYW5pZmVzdEZpbGUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IEFuZHJvaWRNYW5pZmVzdC5nZXRNaW5TZGtWZXJzaW9uKG5ldyBGaWxlV3JhcHBlcihtYW5pZmVzdEZpbGUpKTsKZGlmZiAtLWdpdCBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL0RlZmF1bHRQcm9kdWN0Rmxhdm9yLmphdmEgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9EZWZhdWx0UHJvZHVjdEZsYXZvci5qYXZhCmluZGV4IDY1NDFkZGUuLjJkYmRkODEgMTAwNjQ0Ci0tLSBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL0RlZmF1bHRQcm9kdWN0Rmxhdm9yLmphdmEKKysrIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvRGVmYXVsdFByb2R1Y3RGbGF2b3IuamF2YQpAQCAtMTksOSArMTksMTUgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuaW50ZXJuYWwuQmFzZUNvbmZpZ0ltcGw7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5OZGtDb25maWc7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Qcm9kdWN0Rmxhdm9yOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuU2lnbmluZ0NvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKICAqIFRoZSBjb25maWd1cmF0aW9uIG9mIGEgcHJvZHVjdCBmbGF2b3IuCkBAIC0zNiwxMiArNDIsMTcgQEAKICAgICBwcml2YXRlIGludCBtTWluU2RrVmVyc2lvbiA9IC0xOwogICAgIHByaXZhdGUgaW50IG1UYXJnZXRTZGtWZXJzaW9uID0gLTE7CiAgICAgcHJpdmF0ZSBpbnQgbVJlbmRlcnNjcmlwdFRhcmdldEFwaSA9IC0xOworICAgIHByaXZhdGUgQm9vbGVhbiBtUmVuZGVyc2NyaXB0U3VwcG9ydE1vZGU7CisgICAgcHJpdmF0ZSBCb29sZWFuIG1SZW5kZXJzY3JpcHROZGtNb2RlOwogICAgIHByaXZhdGUgaW50IG1WZXJzaW9uQ29kZSA9IC0xOwogICAgIHByaXZhdGUgU3RyaW5nIG1WZXJzaW9uTmFtZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVBhY2thZ2VOYW1lID0gbnVsbDsKICAgICBwcml2YXRlIFN0cmluZyBtVGVzdFBhY2thZ2VOYW1lID0gbnVsbDsKICAgICBwcml2YXRlIFN0cmluZyBtVGVzdEluc3RydW1lbnRhdGlvblJ1bm5lciA9IG51bGw7CisgICAgcHJpdmF0ZSBCb29sZWFuIG1UZXN0SGFuZGxlUHJvZmlsaW5nID0gbnVsbDsKKyAgICBwcml2YXRlIEJvb2xlYW4gbVRlc3RGdW5jdGlvbmFsVGVzdCA9IG51bGw7CiAgICAgcHJpdmF0ZSBTaWduaW5nQ29uZmlnIG1TaWduaW5nQ29uZmlnID0gbnVsbDsKKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1SZXNvdXJjZUNvbmZpZ3VyYXRpb24gPSBudWxsOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIFByb2R1Y3RGbGF2b3Igd2l0aCBhIGdpdmVuIG5hbWUuCkBAIC0xNDUsNiArMTU2LDI2IEBACiAgICAgICAgIG1SZW5kZXJzY3JpcHRUYXJnZXRBcGkgPSByZW5kZXJzY3JpcHRUYXJnZXRBcGk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVuZGVyc2NyaXB0U3VwcG9ydE1vZGUoKSB7CisgICAgICAgIC8vIGRlZmF1bHQgaXMgZmFsc2UKKyAgICAgICAgcmV0dXJuIG1SZW5kZXJzY3JpcHRTdXBwb3J0TW9kZSAhPSBudWxsICYmIG1SZW5kZXJzY3JpcHRTdXBwb3J0TW9kZS5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJzY3JpcHRTdXBwb3J0TW9kZShib29sZWFuIHJlbmRlcnNjcmlwdFN1cHBvcnRNb2RlKSB7CisgICAgICAgIG1SZW5kZXJzY3JpcHRTdXBwb3J0TW9kZSA9IHJlbmRlcnNjcmlwdFN1cHBvcnRNb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGdldFJlbmRlcnNjcmlwdE5ka01vZGUoKSB7CisgICAgICAgIC8vIGRlZmF1bHQgaXMgZmFsc2UKKyAgICAgICAgcmV0dXJuIG1SZW5kZXJzY3JpcHROZGtNb2RlICE9IG51bGwgJiYgbVJlbmRlcnNjcmlwdE5ka01vZGUuYm9vbGVhblZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVuZGVyc2NyaXB0TmRrTW9kZShib29sZWFuIHJlbmRlcnNjcmlwdE5ka01vZGUpIHsKKyAgICAgICAgbVJlbmRlcnNjcmlwdE5ka01vZGUgPSByZW5kZXJzY3JpcHROZGtNb2RlOworICAgIH0KKwogICAgIEBOb25OdWxsCiAgICAgcHVibGljIFByb2R1Y3RGbGF2b3Igc2V0VGVzdFBhY2thZ2VOYW1lKFN0cmluZyB0ZXN0UGFja2FnZU5hbWUpIHsKICAgICAgICAgbVRlc3RQYWNrYWdlTmFtZSA9IHRlc3RQYWNrYWdlTmFtZTsKQEAgLTE2OSw2ICsyMDAsMzAgQEAKICAgICAgICAgcmV0dXJuIG1UZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBCb29sZWFuIGdldFRlc3RIYW5kbGVQcm9maWxpbmcoKSB7CisgICAgICAgIHJldHVybiBtVGVzdEhhbmRsZVByb2ZpbGluZzsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBQcm9kdWN0Rmxhdm9yIHNldFRlc3RIYW5kbGVQcm9maWxpbmcoYm9vbGVhbiBoYW5kbGVQcm9maWxpbmcpIHsKKyAgICAgICAgbVRlc3RIYW5kbGVQcm9maWxpbmcgPSBoYW5kbGVQcm9maWxpbmc7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBCb29sZWFuIGdldFRlc3RGdW5jdGlvbmFsVGVzdCgpIHsKKyAgICAgICAgcmV0dXJuIG1UZXN0RnVuY3Rpb25hbFRlc3Q7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgUHJvZHVjdEZsYXZvciBzZXRUZXN0RnVuY3Rpb25hbFRlc3QoYm9vbGVhbiBmdW5jdGlvbmFsVGVzdCkgeworICAgICAgICBtVGVzdEZ1bmN0aW9uYWxUZXN0ID0gZnVuY3Rpb25hbFRlc3Q7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKwogICAgIEBOdWxsYWJsZQogICAgIHB1YmxpYyBTaWduaW5nQ29uZmlnIGdldFNpZ25pbmdDb25maWcoKSB7CiAgICAgICAgIHJldHVybiBtU2lnbmluZ0NvbmZpZzsKQEAgLTE4MCw2ICsyMzUsNDYgQEAKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIE5ka0NvbmZpZyBnZXROZGtDb25maWcoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFJlc291cmNlQ29uZmlndXJhdGlvbihATm9uTnVsbCBTdHJpbmcgY29uZmlndXJhdGlvbikgeworICAgICAgICBpZiAobVJlc291cmNlQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtUmVzb3VyY2VDb25maWd1cmF0aW9uID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBtUmVzb3VyY2VDb25maWd1cmF0aW9uLmFkZChjb25maWd1cmF0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZUNvbmZpZ3VyYXRpb25zKEBOb25OdWxsIFN0cmluZy4uLiBjb25maWd1cmF0aW9ucykgeworICAgICAgICBpZiAobVJlc291cmNlQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtUmVzb3VyY2VDb25maWd1cmF0aW9uID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBtUmVzb3VyY2VDb25maWd1cmF0aW9uLmFkZEFsbChBcnJheXMuYXNMaXN0KGNvbmZpZ3VyYXRpb25zKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkUmVzb3VyY2VDb25maWd1cmF0aW9ucyhATm9uTnVsbCBDb2xsZWN0aW9uPFN0cmluZz4gY29uZmlndXJhdGlvbnMpIHsKKyAgICAgICAgaWYgKG1SZXNvdXJjZUNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbVJlc291cmNlQ29uZmlndXJhdGlvbiA9IFNldHMubmV3SGFzaFNldCgpOworICAgICAgICB9CisKKyAgICAgICAgbVJlc291cmNlQ29uZmlndXJhdGlvbi5hZGRBbGwoY29uZmlndXJhdGlvbnMpOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRSZXNvdXJjZUNvbmZpZ3VyYXRpb25zKCkgeworICAgICAgICBpZiAobVJlc291cmNlQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtUmVzb3VyY2VDb25maWd1cmF0aW9uID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVJlc291cmNlQ29uZmlndXJhdGlvbjsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBNZXJnZXMgdGhlIGZsYXZvciBvbiB0b3Agb2YgYSBiYXNlIHBsYXRmb3JtIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRoIHRoZSByZXN1bHQuCiAgICAgICogQHBhcmFtIGJhc2UgdGhlIGZsYXZvciB0byBtZXJnZSBvbiB0b3Agb2YKQEAgLTE5Myw2ICsyODgsMTAgQEAKICAgICAgICAgZmxhdm9yLm1UYXJnZXRTZGtWZXJzaW9uID0gY2hvb3NlSW50KG1UYXJnZXRTZGtWZXJzaW9uLCBiYXNlLm1UYXJnZXRTZGtWZXJzaW9uKTsKICAgICAgICAgZmxhdm9yLm1SZW5kZXJzY3JpcHRUYXJnZXRBcGkgPSBjaG9vc2VJbnQobVJlbmRlcnNjcmlwdFRhcmdldEFwaSwKICAgICAgICAgICAgICAgICBiYXNlLm1SZW5kZXJzY3JpcHRUYXJnZXRBcGkpOworICAgICAgICBmbGF2b3IubVJlbmRlcnNjcmlwdFN1cHBvcnRNb2RlID0gY2hvb3NlQm9vbGVhbihtUmVuZGVyc2NyaXB0U3VwcG9ydE1vZGUsCisgICAgICAgICAgICAgICAgYmFzZS5tUmVuZGVyc2NyaXB0U3VwcG9ydE1vZGUpOworICAgICAgICBmbGF2b3IubVJlbmRlcnNjcmlwdE5ka01vZGUgPSBjaG9vc2VCb29sZWFuKG1SZW5kZXJzY3JpcHROZGtNb2RlLAorICAgICAgICAgICAgICAgIGJhc2UubVJlbmRlcnNjcmlwdE5ka01vZGUpOwogCiAgICAgICAgIGZsYXZvci5tVmVyc2lvbkNvZGUgPSBjaG9vc2VJbnQobVZlcnNpb25Db2RlLCBiYXNlLm1WZXJzaW9uQ29kZSk7CiAgICAgICAgIGZsYXZvci5tVmVyc2lvbk5hbWUgPSBjaG9vc2VTdHJpbmcobVZlcnNpb25OYW1lLCBiYXNlLm1WZXJzaW9uTmFtZSk7CkBAIC0yMDMsOSArMzAyLDE3IEBACiAgICAgICAgIGZsYXZvci5tVGVzdEluc3RydW1lbnRhdGlvblJ1bm5lciA9IGNob29zZVN0cmluZyhtVGVzdEluc3RydW1lbnRhdGlvblJ1bm5lciwKICAgICAgICAgICAgICAgICBiYXNlLm1UZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyKTsKIAorICAgICAgICBmbGF2b3IubVRlc3RIYW5kbGVQcm9maWxpbmcgPSBjaG9vc2VCb29sZWFuKG1UZXN0SGFuZGxlUHJvZmlsaW5nLAorICAgICAgICAgICAgICAgIGJhc2UubVRlc3RIYW5kbGVQcm9maWxpbmcpOworCisgICAgICAgIGZsYXZvci5tVGVzdEZ1bmN0aW9uYWxUZXN0ID0gY2hvb3NlQm9vbGVhbihtVGVzdEZ1bmN0aW9uYWxUZXN0LAorICAgICAgICAgICAgICAgIGJhc2UubVRlc3RGdW5jdGlvbmFsVGVzdCk7CisKICAgICAgICAgZmxhdm9yLm1TaWduaW5nQ29uZmlnID0KICAgICAgICAgICAgICAgICBtU2lnbmluZ0NvbmZpZyAhPSBudWxsID8gbVNpZ25pbmdDb25maWcgOiBiYXNlLm1TaWduaW5nQ29uZmlnOwogCisgICAgICAgIGZsYXZvci5hZGRSZXNvdXJjZUNvbmZpZ3VyYXRpb25zKGJhc2UuZ2V0UmVzb3VyY2VDb25maWd1cmF0aW9ucygpKTsKKwogICAgICAgICByZXR1cm4gZmxhdm9yOwogICAgIH0KIApAQCAtMjE4LDYgKzMyNSwxMCBAQAogICAgICAgICByZXR1cm4gb3ZlcmxheSAhPSBudWxsID8gb3ZlcmxheSA6IGJhc2U7CiAgICAgfQogCisgICAgcHJpdmF0ZSBCb29sZWFuIGNob29zZUJvb2xlYW4oQm9vbGVhbiBvdmVybGF5LCBCb29sZWFuIGJhc2UpIHsKKyAgICAgICAgcmV0dXJuIG92ZXJsYXkgIT0gbnVsbCA/IG92ZXJsYXkgOiBiYXNlOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKQEAgLTIyNiwyNyArMzM3LDMwIEBACiAKICAgICAgICAgRGVmYXVsdFByb2R1Y3RGbGF2b3IgdGhhdCA9IChEZWZhdWx0UHJvZHVjdEZsYXZvcikgbzsKIAotICAgICAgICBpZiAoIW1OYW1lLmVxdWFscyh0aGF0Lm1OYW1lKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICBpZiAobU1pblNka1ZlcnNpb24gIT0gdGhhdC5tTWluU2RrVmVyc2lvbikgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobVRhcmdldFNka1ZlcnNpb24gIT0gdGhhdC5tVGFyZ2V0U2RrVmVyc2lvbikgcmV0dXJuIGZhbHNlOwogICAgICAgICBpZiAobVJlbmRlcnNjcmlwdFRhcmdldEFwaSAhPSB0aGF0Lm1SZW5kZXJzY3JpcHRUYXJnZXRBcGkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG1UYXJnZXRTZGtWZXJzaW9uICE9IHRoYXQubVRhcmdldFNka1ZlcnNpb24pIHJldHVybiBmYWxzZTsKICAgICAgICAgaWYgKG1WZXJzaW9uQ29kZSAhPSB0aGF0Lm1WZXJzaW9uQ29kZSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobVBhY2thZ2VOYW1lICE9IG51bGwgPwotICAgICAgICAgICAgICAgICFtUGFja2FnZU5hbWUuZXF1YWxzKHRoYXQubVBhY2thZ2VOYW1lKSA6Ci0gICAgICAgICAgICAgICAgdGhhdC5tUGFja2FnZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgaWYgKCFtTmFtZS5lcXVhbHModGhhdC5tTmFtZSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG1QYWNrYWdlTmFtZSAhPSBudWxsID8gIW1QYWNrYWdlTmFtZS5lcXVhbHModGhhdC5tUGFja2FnZU5hbWUpIDogdGhhdC5tUGFja2FnZU5hbWUgIT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKG1UZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICFtVGVzdEluc3RydW1lbnRhdGlvblJ1bm5lci5lcXVhbHModGhhdC5tVGVzdEluc3RydW1lbnRhdGlvblJ1bm5lcikgOgotICAgICAgICAgICAgICAgIHRoYXQubVRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXIgIT0gbnVsbCkKKyAgICAgICAgaWYgKG1SZW5kZXJzY3JpcHROZGtNb2RlICE9IG51bGwgPyAhbVJlbmRlcnNjcmlwdE5ka01vZGUuZXF1YWxzKHRoYXQubVJlbmRlcnNjcmlwdE5ka01vZGUpIDogdGhhdC5tUmVuZGVyc2NyaXB0TmRrTW9kZSAhPSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobVRlc3RQYWNrYWdlTmFtZSAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAhbVRlc3RQYWNrYWdlTmFtZS5lcXVhbHModGhhdC5tVGVzdFBhY2thZ2VOYW1lKSA6IHRoYXQubVRlc3RQYWNrYWdlTmFtZSAhPSBudWxsKQorICAgICAgICBpZiAobVJlbmRlcnNjcmlwdFN1cHBvcnRNb2RlICE9IG51bGwgPyAhbVJlbmRlcnNjcmlwdFN1cHBvcnRNb2RlLmVxdWFscyh0aGF0Lm1SZW5kZXJzY3JpcHRTdXBwb3J0TW9kZSkgOiB0aGF0Lm1SZW5kZXJzY3JpcHRTdXBwb3J0TW9kZSAhPSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobVZlcnNpb25OYW1lICE9IG51bGwgPwotICAgICAgICAgICAgICAgICFtVmVyc2lvbk5hbWUuZXF1YWxzKHRoYXQubVZlcnNpb25OYW1lKSA6IHRoYXQubVZlcnNpb25OYW1lICE9IG51bGwpCisgICAgICAgIGlmIChtUmVzb3VyY2VDb25maWd1cmF0aW9uICE9IG51bGwgPyAhbVJlc291cmNlQ29uZmlndXJhdGlvbi5lcXVhbHModGhhdC5tUmVzb3VyY2VDb25maWd1cmF0aW9uKSA6IHRoYXQubVJlc291cmNlQ29uZmlndXJhdGlvbiAhPSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobVNpZ25pbmdDb25maWcgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgIW1TaWduaW5nQ29uZmlnLmVxdWFscyh0aGF0Lm1TaWduaW5nQ29uZmlnKSA6IHRoYXQubVNpZ25pbmdDb25maWcgIT0gbnVsbCkKKyAgICAgICAgaWYgKG1TaWduaW5nQ29uZmlnICE9IG51bGwgPyAhbVNpZ25pbmdDb25maWcuZXF1YWxzKHRoYXQubVNpZ25pbmdDb25maWcpIDogdGhhdC5tU2lnbmluZ0NvbmZpZyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobVRlc3RGdW5jdGlvbmFsVGVzdCAhPSBudWxsID8gIW1UZXN0RnVuY3Rpb25hbFRlc3QuZXF1YWxzKHRoYXQubVRlc3RGdW5jdGlvbmFsVGVzdCkgOiB0aGF0Lm1UZXN0RnVuY3Rpb25hbFRlc3QgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG1UZXN0SGFuZGxlUHJvZmlsaW5nICE9IG51bGwgPyAhbVRlc3RIYW5kbGVQcm9maWxpbmcuZXF1YWxzKHRoYXQubVRlc3RIYW5kbGVQcm9maWxpbmcpIDogdGhhdC5tVGVzdEhhbmRsZVByb2ZpbGluZyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobVRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXIgIT0gbnVsbCA/ICFtVGVzdEluc3RydW1lbnRhdGlvblJ1bm5lci5lcXVhbHModGhhdC5tVGVzdEluc3RydW1lbnRhdGlvblJ1bm5lcikgOiB0aGF0Lm1UZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtVGVzdFBhY2thZ2VOYW1lICE9IG51bGwgPyAhbVRlc3RQYWNrYWdlTmFtZS5lcXVhbHModGhhdC5tVGVzdFBhY2thZ2VOYW1lKSA6IHRoYXQubVRlc3RQYWNrYWdlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobVZlcnNpb25OYW1lICE9IG51bGwgPyAhbVZlcnNpb25OYW1lLmVxdWFscyh0aGF0Lm1WZXJzaW9uTmFtZSkgOiB0aGF0Lm1WZXJzaW9uTmFtZSAhPSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMjU5LDEzICszNzMsMTcgQEAKICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBtTWluU2RrVmVyc2lvbjsKICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBtVGFyZ2V0U2RrVmVyc2lvbjsKICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBtUmVuZGVyc2NyaXB0VGFyZ2V0QXBpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChtUmVuZGVyc2NyaXB0U3VwcG9ydE1vZGUgIT0gbnVsbCA/IG1SZW5kZXJzY3JpcHRTdXBwb3J0TW9kZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKG1SZW5kZXJzY3JpcHROZGtNb2RlICE9IG51bGwgPyBtUmVuZGVyc2NyaXB0TmRrTW9kZS5oYXNoQ29kZSgpIDogMCk7CiAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgbVZlcnNpb25Db2RlOwogICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChtVmVyc2lvbk5hbWUgIT0gbnVsbCA/IG1WZXJzaW9uTmFtZS5oYXNoQ29kZSgpIDogMCk7CiAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKG1QYWNrYWdlTmFtZSAhPSBudWxsID8gbVBhY2thZ2VOYW1lLmhhc2hDb2RlKCkgOiAwKTsKICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAobVRlc3RQYWNrYWdlTmFtZSAhPSBudWxsID8gbVRlc3RQYWNrYWdlTmFtZS5oYXNoQ29kZSgpIDogMCk7Ci0gICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKG1UZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyICE9IG51bGwgPwotICAgICAgICAgICAgICAgIG1UZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAobVRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXIgIT0gbnVsbCA/IG1UZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAobVRlc3RIYW5kbGVQcm9maWxpbmcgIT0gbnVsbCA/IG1UZXN0SGFuZGxlUHJvZmlsaW5nLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAobVRlc3RGdW5jdGlvbmFsVGVzdCAhPSBudWxsID8gbVRlc3RGdW5jdGlvbmFsVGVzdC5oYXNoQ29kZSgpIDogMCk7CiAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKG1TaWduaW5nQ29uZmlnICE9IG51bGwgPyBtU2lnbmluZ0NvbmZpZy5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKG1SZXNvdXJjZUNvbmZpZ3VyYXRpb24gIT0gbnVsbCA/IG1SZXNvdXJjZUNvbmZpZ3VyYXRpb24uaGFzaENvZGUoKSA6IDApOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMjc3LDE4ICszOTUsMTcgQEAKICAgICAgICAgICAgICAgICAuYWRkKCJtaW5TZGtWZXJzaW9uIiwgbU1pblNka1ZlcnNpb24pCiAgICAgICAgICAgICAgICAgLmFkZCgidGFyZ2V0U2RrVmVyc2lvbiIsIG1UYXJnZXRTZGtWZXJzaW9uKQogICAgICAgICAgICAgICAgIC5hZGQoInJlbmRlcnNjcmlwdFRhcmdldEFwaSIsIG1SZW5kZXJzY3JpcHRUYXJnZXRBcGkpCisgICAgICAgICAgICAgICAgLmFkZCgicmVuZGVyc2NyaXB0U3VwcG9ydE1vZGUiLCBtUmVuZGVyc2NyaXB0U3VwcG9ydE1vZGUpCisgICAgICAgICAgICAgICAgLmFkZCgicmVuZGVyc2NyaXB0TmRrTW9kZSIsIG1SZW5kZXJzY3JpcHROZGtNb2RlKQogICAgICAgICAgICAgICAgIC5hZGQoInZlcnNpb25Db2RlIiwgbVZlcnNpb25Db2RlKQogICAgICAgICAgICAgICAgIC5hZGQoInZlcnNpb25OYW1lIiwgbVZlcnNpb25OYW1lKQogICAgICAgICAgICAgICAgIC5hZGQoInBhY2thZ2VOYW1lIiwgbVBhY2thZ2VOYW1lKQogICAgICAgICAgICAgICAgIC5hZGQoInRlc3RQYWNrYWdlTmFtZSIsIG1UZXN0UGFja2FnZU5hbWUpCiAgICAgICAgICAgICAgICAgLmFkZCgidGVzdEluc3RydW1lbnRhdGlvblJ1bm5lciIsIG1UZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyKQorICAgICAgICAgICAgICAgIC5hZGQoInRlc3RIYW5kbGVQcm9maWxpbmciLCBtVGVzdEhhbmRsZVByb2ZpbGluZykKKyAgICAgICAgICAgICAgICAuYWRkKCJ0ZXN0RnVuY3Rpb25hbFRlc3QiLCBtVGVzdEZ1bmN0aW9uYWxUZXN0KQogICAgICAgICAgICAgICAgIC5hZGQoInNpZ25pbmdDb25maWciLCBtU2lnbmluZ0NvbmZpZykKKyAgICAgICAgICAgICAgICAuYWRkKCJyZXNDb25maWciLCBtUmVzb3VyY2VDb25maWd1cmF0aW9uKQogICAgICAgICAgICAgICAgIC50b1N0cmluZygpOwogICAgIH0KLQotICAgIC8qCi0gICAgICAgIHJlbGVhc2Ugc2lnbmluZyBpbmZvIChrZXlzdG9yZSwga2V5IGFsaWFzLCBwYXNzd29yZHMsLi4uKS4KLSAgICAgICAgbmF0aXZlIGFiaSBmaWx0ZXIKLSAgICAqLwotCiB9CmRpZmYgLS1naXQgYS9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9EZWZhdWx0U2RrUGFyc2VyLmphdmEgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9EZWZhdWx0U2RrUGFyc2VyLmphdmEKaW5kZXggM2Y1Mjk3MS4uNjI0NGZiOSAxMDA2NDQKLS0tIGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvRGVmYXVsdFNka1BhcnNlci5qYXZhCisrKyBiL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL0RlZmF1bHRTZGtQYXJzZXIuamF2YQpAQCAtNTAsNiArNTAsNyBAQAogcHVibGljIGNsYXNzIERlZmF1bHRTZGtQYXJzZXIgaW1wbGVtZW50cyBTZGtQYXJzZXIgewogCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNka0xvY2F0aW9uOworICAgIHByaXZhdGUgZmluYWwgRmlsZSBtTmRrTG9jYXRpb247CiAgICAgcHJpdmF0ZSBTZGtNYW5hZ2VyIG1NYW5hZ2VyOwogCiAgICAgcHJpdmF0ZSBJQW5kcm9pZFRhcmdldCBtVGFyZ2V0OwpAQCAtNjAsMTIgKzYxLDEzIEBACiAgICAgcHJpdmF0ZSBGaWxlIG1BZGI7CiAgICAgcHJpdmF0ZSBGaWxlIG1aaXBBbGlnbjsKIAotICAgIHB1YmxpYyBEZWZhdWx0U2RrUGFyc2VyKEBOb25OdWxsIFN0cmluZyBzZGtMb2NhdGlvbikgeworICAgIHB1YmxpYyBEZWZhdWx0U2RrUGFyc2VyKEBOb25OdWxsIFN0cmluZyBzZGtMb2NhdGlvbiwgQE51bGxhYmxlIEZpbGUgbmRrTG9jYXRpb24pIHsKICAgICAgICAgaWYgKCFzZGtMb2NhdGlvbi5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKICAgICAgICAgICAgIG1TZGtMb2NhdGlvbiA9IHNka0xvY2F0aW9uICsgRmlsZS5zZXBhcmF0b3I7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtU2RrTG9jYXRpb24gPSBzZGtMb2NhdGlvbjsKICAgICAgICAgfQorICAgICAgICBtTmRrTG9jYXRpb24gPSBuZGtMb2NhdGlvbjsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTIxMSw0ICsyMTMsMTAgQEAKIAogICAgICAgICByZXR1cm4gbVRvb2xzOwogICAgIH0KKworICAgIEBOdWxsYWJsZQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWxlIGdldE5ka0xvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gbU5ka0xvY2F0aW9uOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL0RleE9wdGlvbnMuamF2YSBiL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL0RleE9wdGlvbnMuamF2YQppbmRleCA5NjZkMDgxLi4xZGIxM2JlIDEwMDY0NAotLS0gYS9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9EZXhPcHRpb25zLmphdmEKKysrIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvRGV4T3B0aW9ucy5qYXZhCkBAIC0yMCw1ICsyMCw3IEBACiAKICAgICBib29sZWFuIGlzQ29yZUxpYnJhcnkoKTsKICAgICBib29sZWFuIGdldEluY3JlbWVudGFsKCk7CisgICAgYm9vbGVhbiBnZXRQcmVEZXhMaWJyYXJpZXMoKTsKKyAgICBib29sZWFuIGdldEp1bWJvTW9kZSgpOwogICAgIFN0cmluZyBnZXRKYXZhTWF4SGVhcFNpemUoKTsKIH0KZGlmZiAtLWdpdCBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL01hbmlmZXN0UGFyc2VyLmphdmEgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9NYW5pZmVzdFBhcnNlci5qYXZhCmluZGV4IDViNjQxMWMuLjNiOGU0YTMgMTAwNjQ0Ci0tLSBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL01hbmlmZXN0UGFyc2VyLmphdmEKKysrIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvTWFuaWZlc3RQYXJzZXIuamF2YQpAQCAtMjEsMTQgKzIxLDU2IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiAKKy8qKgorICogQSBNYW5pZmVzdCBwYXJzZXIKKyAqLwogcHVibGljIGludGVyZmFjZSBNYW5pZmVzdFBhcnNlciB7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWUgcGFyc2VkIGZyb20gdGhlIGdpdmVuIG1hbmlmZXN0IGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuaWZlc3RGaWxlIHRoZSBtYW5pZmVzdCBmaWxlIHRvIHBhcnNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUgb3IgbnVsbCBpZiBub3QgZm91bmQuCisgICAgICovCiAgICAgQE51bGxhYmxlCiAgICAgU3RyaW5nIGdldFBhY2thZ2UoQE5vbk51bGwgRmlsZSBtYW5pZmVzdEZpbGUpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWluU2RrVmVyc2lvbiBwYXJzZWQgZnJvbSB0aGUgZ2l2ZW4gbWFuaWZlc3QgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5pZmVzdEZpbGUgdGhlIG1hbmlmZXN0IGZpbGUgdG8gcGFyc2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1pblNka1ZlcnNpb24gb3IgMSBpZiBub3QgZm91bmQuCisgICAgICovCiAgICAgaW50IGdldE1pblNka1ZlcnNpb24oQE5vbk51bGwgRmlsZSBtYW5pZmVzdEZpbGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGFyZ2V0U2RrVmVyc2lvbiBwYXJzZWQgZnJvbSB0aGUgZ2l2ZW4gbWFuaWZlc3QgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5pZmVzdEZpbGUgdGhlIG1hbmlmZXN0IGZpbGUgdG8gcGFyc2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRhcmdldFNka1ZlcnNpb24gb3IgLTEgaWYgbm90IGZvdW5kLgorICAgICAqLwogICAgIGludCBnZXRUYXJnZXRTZGtWZXJzaW9uKEBOb25OdWxsIEZpbGUgbWFuaWZlc3RGaWxlKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZlcnNpb24gbmFtZSBwYXJzZWQgZnJvbSB0aGUgZ2l2ZW4gbWFuaWZlc3QgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5pZmVzdEZpbGUgdGhlIG1hbmlmZXN0IGZpbGUgdG8gcGFyc2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZlcnNpb24gbmFtZSBvciBudWxsIGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KICAgICBATnVsbGFibGUKICAgICBTdHJpbmcgZ2V0VmVyc2lvbk5hbWUoQE5vbk51bGwgRmlsZSBtYW5pZmVzdEZpbGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBjb2RlIHBhcnNlZCBmcm9tIHRoZSBnaXZlbiBtYW5pZmVzdCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmlmZXN0RmlsZSB0aGUgbWFuaWZlc3QgZmlsZSB0byBwYXJzZQorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBjb2RlIG9yIC0xIGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBpbnQgZ2V0VmVyc2lvbkNvZGUoQE5vbk51bGwgRmlsZSBtYW5pZmVzdEZpbGUpOworCiB9CmRpZmYgLS1naXQgYS9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9QbGF0Zm9ybVNka1BhcnNlci5qYXZhIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvUGxhdGZvcm1TZGtQYXJzZXIuamF2YQppbmRleCAzMzI1ZWEwLi5kMGUxODI4IDEwMDY0NAotLS0gYS9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9QbGF0Zm9ybVNka1BhcnNlci5qYXZhCisrKyBiL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL1BsYXRmb3JtU2RrUGFyc2VyLmphdmEKQEAgLTE2NSw0ICsxNjUsMTAgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbUhvc3RUb29sczsKICAgICB9CisKKyAgICBATnVsbGFibGUKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsZSBnZXROZGtMb2NhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvU2RrUGFyc2VyLmphdmEgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9TZGtQYXJzZXIuamF2YQppbmRleCA3YzRlMGMyLi5jMjQ3Njk0IDEwMDY0NAotLS0gYS9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9TZGtQYXJzZXIuamF2YQorKysgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9TZGtQYXJzZXIuamF2YQpAQCAtOTQsNiArOTQsMTMgQEAKICAgICBATm9uTnVsbAogICAgIEZpbGUgZ2V0QWRiKCk7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiBhcnRpZmFjdCByZXBvc2l0b3JpZXMgYnVpbHQtaW4gdGhlIFNESy4KKyAgICAgKiBAcmV0dXJuIGEgbm9uIG51bGwgbGlzdCBvZiByZXBvc2l0b3J5IGZvbGRlcnMuCisgICAgICovCiAgICAgQE5vbk51bGwKICAgICBMaXN0PEZpbGU+IGdldFJlcG9zaXRvcmllcygpOworCisgICAgQE51bGxhYmxlCisgICAgRmlsZSBnZXROZGtMb2NhdGlvbigpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL1ZhcmlhbnRDb25maWd1cmF0aW9uLmphdmEgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9WYXJpYW50Q29uZmlndXJhdGlvbi5qYXZhCmluZGV4IDYxNGQ0NjcuLjgwZGY0NTQgMTAwNjQ0Ci0tLSBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL1ZhcmlhbnRDb25maWd1cmF0aW9uLmphdmEKKysrIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvVmFyaWFudENvbmZpZ3VyYXRpb24uamF2YQpAQCAtMjIsNiArMjIsMTEgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLmRlcGVuZGVuY3kuRGVwZW5kZW5jeUNvbnRhaW5lcjsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLmRlcGVuZGVuY3kuSmFyRGVwZW5kZW5jeTsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLmRlcGVuZGVuY3kuTGlicmFyeURlcGVuZGVuY3k7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5pbnRlcm5hbC5NZXJnZWROZGtDb25maWc7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5pbnRlcm5hbC5TdHJpbmdIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5DbGFzc0ZpZWxkOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuTmRrQ29uZmlnOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuUHJvZHVjdEZsYXZvcjsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLlNpZ25pbmdDb25maWc7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Tb3VyY2VQcm92aWRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLnRlc3RpbmcuVGVzdERhdGE7CkBAIC0zMiw2ICszNyw3IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKQEAgLTQ1LDI1ICs1MSw2MSBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFuaWZlc3RQYXJzZXIgc01hbmlmZXN0UGFyc2VyID0gbmV3IERlZmF1bHRNYW5pZmVzdFBhcnNlcigpOwogCisgICAgLyoqCisgICAgICogRnVsbCwgdW5pcXVlIG5hbWUgb2YgdGhlIHZhcmlhbnQgaW4gY2FtZWwgY2FzZSwgaW5jbHVkaW5nIEJ1aWxkVHlwZSBhbmQgRmxhdm9ycyAoYW5kIFRlc3QpCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbUZ1bGxOYW1lOworICAgIC8qKgorICAgICAqIEZsYXZvciBOYW1lIG9mIHRoZSB2YXJpYW50LCBpbmNsdWRpbmcgYWxsIGZsYXZvcnMgaW4gY2FtZWwgY2FzZSAoc3RhcnRpbmcgd2l0aCBhIGxvd2VyCisgICAgICogY2FzZSkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbUZsYXZvck5hbWU7CisgICAgLyoqCisgICAgICogRnVsbCwgdW5pcXVlIG5hbWUgb2YgdGhlIHZhcmlhbnQsIGluY2x1ZGluZyBCdWlsZFR5cGUsIGZsYXZvcnMgYW5kIHRlc3QsIGRhc2ggc2VwYXJhdGVkLgorICAgICAqIChzaW1pbGFyIHRvIGZ1bGwgbmFtZSBidXQgd2l0aCBkYXNoZXMpCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbUJhc2VOYW1lOworICAgIC8qKgorICAgICAqIFVuaXF1ZSBkaXJlY3RvcnkgbmFtZSAoY2FuIGluY2x1ZGUgbXVsdGlwbGUgZm9sZGVycykgZm9yIHRoZSB2YXJpYW50LCBiYXNlZCBvbiBidWlsZCB0eXBlLAorICAgICAqIGZsYXZvciBhbmQgdGVzdC4KKyAgICAgKiBUaGlzIGFsd2F5cyB1c2VzIGZvcndhcmQgc2xhc2hlcyAoJy8nKSBhcyBzZXBhcmF0b3Igb24gYWxsIHBsYXRmb3JtLgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbURpck5hbWU7CisKKyAgICBATm9uTnVsbAogICAgIHByaXZhdGUgZmluYWwgRGVmYXVsdFByb2R1Y3RGbGF2b3IgbURlZmF1bHRDb25maWc7CisgICAgQE5vbk51bGwKICAgICBwcml2YXRlIGZpbmFsIFNvdXJjZVByb3ZpZGVyIG1EZWZhdWx0U291cmNlUHJvdmlkZXI7CiAKKyAgICBATm9uTnVsbAogICAgIHByaXZhdGUgZmluYWwgRGVmYXVsdEJ1aWxkVHlwZSBtQnVpbGRUeXBlOwogICAgIC8qKiBTb3VyY2VQcm92aWRlciBmb3IgdGhlIEJ1aWxkVHlwZS4gQ2FuIGJlIG51bGwgKi8KKyAgICBATnVsbGFibGUKICAgICBwcml2YXRlIGZpbmFsIFNvdXJjZVByb3ZpZGVyIG1CdWlsZFR5cGVTb3VyY2VQcm92aWRlcjsKIAorICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IG1GbGF2b3JEaW1lbnNpb25OYW1lcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwogICAgIHByaXZhdGUgZmluYWwgTGlzdDxEZWZhdWx0UHJvZHVjdEZsYXZvcj4gbUZsYXZvckNvbmZpZ3MgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKICAgICBwcml2YXRlIGZpbmFsIExpc3Q8U291cmNlUHJvdmlkZXI+IG1GbGF2b3JTb3VyY2VQcm92aWRlcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKIAorICAgIC8qKiBWYXJpYW50IHNwZWNpZmljIHNvdXJjZSBwcm92aWRlciwgbWF5IGJlIG51bGwgKi8KKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIFNvdXJjZVByb3ZpZGVyIG1WYXJpYW50U291cmNlUHJvdmlkZXI7CisKKyAgICAvKiogTXVsdGlGbGF2b3JzIHNwZWNpZmljIHNvdXJjZSBwcm92aWRlciwgbWF5IGJlIG51bGwgKi8KKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIFNvdXJjZVByb3ZpZGVyIG1NdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyOworCisgICAgQE5vbk51bGwKICAgICBwcml2YXRlIGZpbmFsIFR5cGUgbVR5cGU7CiAgICAgLyoqIE9wdGlvbmFsIHRlc3RlZCBjb25maWcgaW4gY2FzZSB0eXBlIGlzIFR5cGUjVEVTVCAqLwogICAgIHByaXZhdGUgZmluYWwgVmFyaWFudENvbmZpZ3VyYXRpb24gbVRlc3RlZENvbmZpZzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGVidWdOYW1lOwogICAgIC8qKiBBbiBvcHRpb25hbCBvdXRwdXQgdGhhdCBpcyBvbmx5IHZhbGlkIGlmIHRoZSB0eXBlIGlzIFR5cGUjTElCUkFSWSBzbyB0aGF0IHRoZSB0ZXN0CiAgICAgICogZm9yIHRoZSBsaWJyYXJ5IGNhbiB1c2UgdGhlIGxpYnJhcnkgYXMgaWYgaXQgd2FzIGEgbm9ybWFsIGRlcGVuZGVuY3kuICovCiAgICAgcHJpdmF0ZSBMaWJyYXJ5RGVwZW5kZW5jeSBtT3V0cHV0OwogCiAgICAgcHJpdmF0ZSBEZWZhdWx0UHJvZHVjdEZsYXZvciBtTWVyZ2VkRmxhdm9yOworICAgIHByaXZhdGUgZmluYWwgTWVyZ2VkTmRrQ29uZmlnIG1NZXJnZWROZGtDb25maWcgPSBuZXcgTWVyZ2VkTmRrQ29uZmlnKCk7CiAKICAgICBwcml2YXRlIGZpbmFsIFNldDxKYXJEZXBlbmRlbmN5PiBtSmFycyA9IFNldHMubmV3SGFzaFNldCgpOwogCkBAIC05OCwxOCArMTQwLDE2IEBACiAgICAgICogQHBhcmFtIGRlZmF1bHRTb3VyY2VQcm92aWRlciB0aGUgZGVmYXVsdCBzb3VyY2UgcHJvdmlkZXIuIFJlcXVpcmVkCiAgICAgICogQHBhcmFtIGJ1aWxkVHlwZSB0aGUgYnVpbGQgdHlwZSBmb3IgdGhpcyB2YXJpYW50LiBSZXF1aXJlZC4KICAgICAgKiBAcGFyYW0gYnVpbGRUeXBlU291cmNlUHJvdmlkZXIgdGhlIHNvdXJjZSBwcm92aWRlciBmb3IgdGhlIGJ1aWxkIHR5cGUuIFJlcXVpcmVkLgotICAgICAqIEBwYXJhbSBkZWJ1Z05hbWUgYW4gb3B0aW9uYWwgZGVidWcgbmFtZQogICAgICAqLwogICAgIHB1YmxpYyBWYXJpYW50Q29uZmlndXJhdGlvbigKICAgICAgICAgICAgIEBOb25OdWxsIERlZmF1bHRQcm9kdWN0Rmxhdm9yIGRlZmF1bHRDb25maWcsCiAgICAgICAgICAgICBATm9uTnVsbCBTb3VyY2VQcm92aWRlciBkZWZhdWx0U291cmNlUHJvdmlkZXIsCiAgICAgICAgICAgICBATm9uTnVsbCBEZWZhdWx0QnVpbGRUeXBlIGJ1aWxkVHlwZSwKLSAgICAgICAgICAgIEBOb25OdWxsIFNvdXJjZVByb3ZpZGVyIGJ1aWxkVHlwZVNvdXJjZVByb3ZpZGVyLAotICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBkZWJ1Z05hbWUpIHsKLSAgICAgICAgdGhpcyhkZWZhdWx0Q29uZmlnLCBkZWZhdWx0U291cmNlUHJvdmlkZXIsCisgICAgICAgICAgICBATnVsbGFibGUgU291cmNlUHJvdmlkZXIgYnVpbGRUeXBlU291cmNlUHJvdmlkZXIpIHsKKyAgICAgICAgdGhpcygKKyAgICAgICAgICAgICAgICBkZWZhdWx0Q29uZmlnLCBkZWZhdWx0U291cmNlUHJvdmlkZXIsCiAgICAgICAgICAgICAgICAgYnVpbGRUeXBlLCBidWlsZFR5cGVTb3VyY2VQcm92aWRlciwKLSAgICAgICAgICAgICAgICBUeXBlLkRFRkFVTFQsIG51bGwgLyp0ZXN0ZWRDb25maWcqLywKLSAgICAgICAgICAgICAgICBkZWJ1Z05hbWUpOworICAgICAgICAgICAgICAgIFR5cGUuREVGQVVMVCwgbnVsbCAvKnRlc3RlZENvbmZpZyovKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyMCwxOSArMTYwLDE3IEBACiAgICAgICogQHBhcmFtIGJ1aWxkVHlwZSB0aGUgYnVpbGQgdHlwZSBmb3IgdGhpcyB2YXJpYW50LiBSZXF1aXJlZC4KICAgICAgKiBAcGFyYW0gYnVpbGRUeXBlU291cmNlUHJvdmlkZXIgdGhlIHNvdXJjZSBwcm92aWRlciBmb3IgdGhlIGJ1aWxkIHR5cGUuCiAgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHByb2plY3QuCi0gICAgICogQHBhcmFtIGRlYnVnTmFtZSBhbiBvcHRpb25hbCBkZWJ1ZyBuYW1lCiAgICAgICovCiAgICAgcHVibGljIFZhcmlhbnRDb25maWd1cmF0aW9uKAogICAgICAgICAgICAgQE5vbk51bGwgRGVmYXVsdFByb2R1Y3RGbGF2b3IgZGVmYXVsdENvbmZpZywKICAgICAgICAgICAgIEBOb25OdWxsIFNvdXJjZVByb3ZpZGVyIGRlZmF1bHRTb3VyY2VQcm92aWRlciwKICAgICAgICAgICAgIEBOb25OdWxsIERlZmF1bHRCdWlsZFR5cGUgYnVpbGRUeXBlLAogICAgICAgICAgICAgQE51bGxhYmxlIFNvdXJjZVByb3ZpZGVyIGJ1aWxkVHlwZVNvdXJjZVByb3ZpZGVyLAotICAgICAgICAgICAgQE5vbk51bGwgVHlwZSB0eXBlLAotICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBkZWJ1Z05hbWUpIHsKLSAgICAgICAgdGhpcyhkZWZhdWx0Q29uZmlnLCBkZWZhdWx0U291cmNlUHJvdmlkZXIsCisgICAgICAgICAgICBATm9uTnVsbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgdGhpcygKKyAgICAgICAgICAgICAgICBkZWZhdWx0Q29uZmlnLCBkZWZhdWx0U291cmNlUHJvdmlkZXIsCiAgICAgICAgICAgICAgICAgYnVpbGRUeXBlLCBidWlsZFR5cGVTb3VyY2VQcm92aWRlciwKLSAgICAgICAgICAgICAgICB0eXBlLCBudWxsIC8qdGVzdGVkQ29uZmlnKi8sCi0gICAgICAgICAgICAgICAgZGVidWdOYW1lKTsKKyAgICAgICAgICAgICAgICB0eXBlLCBudWxsIC8qdGVzdGVkQ29uZmlnKi8pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ0LDcgKzE4Miw2IEBACiAgICAgICogQHBhcmFtIGJ1aWxkVHlwZVNvdXJjZVByb3ZpZGVyIHRoZSBzb3VyY2UgcHJvdmlkZXIgZm9yIHRoZSBidWlsZCB0eXBlLgogICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBwcm9qZWN0LgogICAgICAqIEBwYXJhbSB0ZXN0ZWRDb25maWcgdGhlIHJlZmVyZW5jZSB0byB0aGUgdGVzdGVkIHByb2plY3QuIFJlcXVpcmVkIGlmIHR5cGUgaXMgVHlwZS5URVNUCi0gICAgICogQHBhcmFtIGRlYnVnTmFtZSBhbiBvcHRpb25hbCBkZWJ1ZyBuYW1lCiAgICAgICovCiAgICAgcHVibGljIFZhcmlhbnRDb25maWd1cmF0aW9uKAogICAgICAgICAgICAgQE5vbk51bGwgRGVmYXVsdFByb2R1Y3RGbGF2b3IgZGVmYXVsdENvbmZpZywKQEAgLTE1MiwxOCArMTg5LDE3IEBACiAgICAgICAgICAgICBATm9uTnVsbCBEZWZhdWx0QnVpbGRUeXBlIGJ1aWxkVHlwZSwKICAgICAgICAgICAgIEBOdWxsYWJsZSBTb3VyY2VQcm92aWRlciBidWlsZFR5cGVTb3VyY2VQcm92aWRlciwKICAgICAgICAgICAgIEBOb25OdWxsIFR5cGUgdHlwZSwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBWYXJpYW50Q29uZmlndXJhdGlvbiB0ZXN0ZWRDb25maWcsCi0gICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIGRlYnVnTmFtZSkgeworICAgICAgICAgICAgQE51bGxhYmxlIFZhcmlhbnRDb25maWd1cmF0aW9uIHRlc3RlZENvbmZpZykgewogICAgICAgICBtRGVmYXVsdENvbmZpZyA9IGNoZWNrTm90TnVsbChkZWZhdWx0Q29uZmlnKTsKICAgICAgICAgbURlZmF1bHRTb3VyY2VQcm92aWRlciA9IGNoZWNrTm90TnVsbChkZWZhdWx0U291cmNlUHJvdmlkZXIpOwogICAgICAgICBtQnVpbGRUeXBlID0gY2hlY2tOb3ROdWxsKGJ1aWxkVHlwZSk7CiAgICAgICAgIG1CdWlsZFR5cGVTb3VyY2VQcm92aWRlciA9IGJ1aWxkVHlwZVNvdXJjZVByb3ZpZGVyOwogICAgICAgICBtVHlwZSA9IGNoZWNrTm90TnVsbCh0eXBlKTsKICAgICAgICAgbVRlc3RlZENvbmZpZyA9IHRlc3RlZENvbmZpZzsKLSAgICAgICAgbURlYnVnTmFtZSA9IGRlYnVnTmFtZTsKICAgICAgICAgY2hlY2tTdGF0ZShtVHlwZSAhPSBUeXBlLlRFU1QgfHwgbVRlc3RlZENvbmZpZyAhPSBudWxsKTsKIAogICAgICAgICBtTWVyZ2VkRmxhdm9yID0gbURlZmF1bHRDb25maWc7CisgICAgICAgIGNvbXB1dGVOZGtDb25maWcoKTsKIAogICAgICAgICBpZiAodGVzdGVkQ29uZmlnICE9IG51bGwgJiYKICAgICAgICAgICAgICAgICB0ZXN0ZWRDb25maWcubVR5cGUgPT0gVHlwZS5MSUJSQVJZICYmCkBAIC0xNzUsMjYgKzIxMSwyNDAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmdWxsLCB1bmlxdWUgbmFtZSBvZiB0aGUgdmFyaWFudCBpbiBjYW1lbCBjYXNlIChzdGFydGluZyB3aXRoIGEgbG93ZXIgY2FzZSksCisgICAgICogaW5jbHVkaW5nIEJ1aWxkVHlwZSwgRmxhdm9ycyBhbmQgVGVzdCAoaWYgYXBwbGljYWJsZSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB2YXJpYW50CisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgeworICAgICAgICBpZiAobUZ1bGxOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgU3RyaW5nIGZsYXZvck5hbWUgPSBnZXRGbGF2b3JOYW1lKCk7CisgICAgICAgICAgICBpZiAoIWZsYXZvck5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGZsYXZvck5hbWUpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmdIZWxwZXIuY2FwaXRhbGl6ZShtQnVpbGRUeXBlLmdldE5hbWUoKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQobUJ1aWxkVHlwZS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVR5cGUgPT0gVHlwZS5URVNUKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJUZXN0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1GdWxsTmFtZSA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbUZ1bGxOYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZmxhdm9yIG5hbWUgb2YgdGhlIHZhcmlhbnQsIGluY2x1ZGluZyBhbGwgZmxhdm9ycyBpbiBjYW1lbCBjYXNlIChzdGFydGluZworICAgICAqIHdpdGggYSBsb3dlciBjYXNlKS4gSWYgdGhlIHZhcmlhbnQgaGFzIG5vIGZsYXZvciwgdGhlbiBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBmbGF2b3IgbmFtZSBvciBhbiBlbXB0eSBzdHJpbmcuCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZsYXZvck5hbWUoKSB7CisgICAgICAgIGlmIChtRmxhdm9yTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUZsYXZvckNvbmZpZ3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbUZsYXZvck5hbWUgPSAiIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yIChEZWZhdWx0UHJvZHVjdEZsYXZvciBmbGF2b3IgOiBtRmxhdm9yQ29uZmlncykgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZmlyc3QgPyBmbGF2b3IuZ2V0TmFtZSgpIDogU3RyaW5nSGVscGVyLmNhcGl0YWxpemUoZmxhdm9yLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1GbGF2b3JOYW1lID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtRmxhdm9yTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmdWxsLCB1bmlxdWUgbmFtZSBvZiB0aGUgdmFyaWFudCwgaW5jbHVkaW5nIEJ1aWxkVHlwZSwgZmxhdm9ycyBhbmQgdGVzdCwKKyAgICAgKiBkYXNoIHNlcGFyYXRlZC4gKHNpbWlsYXIgdG8gZnVsbCBuYW1lIGJ1dCB3aXRoIGRhc2hlcykKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZhcmlhbnQKKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7CisgICAgICAgIGlmIChtQmFzZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgICAgIGlmICghbUZsYXZvckNvbmZpZ3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChQcm9kdWN0Rmxhdm9yIHBmIDogbUZsYXZvckNvbmZpZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBmLmdldE5hbWUoKSkuYXBwZW5kKCctJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzYi5hcHBlbmQobUJ1aWxkVHlwZS5nZXROYW1lKCkpOworCisgICAgICAgICAgICBpZiAobVR5cGUgPT0gVHlwZS5URVNUKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCctJykuYXBwZW5kKCJ0ZXN0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1CYXNlTmFtZSA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbUJhc2VOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB1bmlxdWUgZGlyZWN0b3J5IG5hbWUgKGNhbiBpbmNsdWRlIG11bHRpcGxlIGZvbGRlcnMpIGZvciB0aGUgdmFyaWFudCwKKyAgICAgKiBiYXNlZCBvbiBidWlsZCB0eXBlLCBmbGF2b3IgYW5kIHRlc3QuCisgICAgICogVGhpcyBhbHdheXMgdXNlcyBmb3J3YXJkIHNsYXNoZXMgKCcvJykgYXMgc2VwYXJhdG9yIG9uIGFsbCBwbGF0Zm9ybS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGRpcmVjdG9yeSBuYW1lIGZvciB0aGUgdmFyaWFudAorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIFN0cmluZyBnZXREaXJOYW1lKCkgeworICAgICAgICBpZiAobURpck5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgICAgIGlmIChtVHlwZSA9PSBUeXBlLlRFU1QpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoInRlc3QvIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbUZsYXZvckNvbmZpZ3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChEZWZhdWx0UHJvZHVjdEZsYXZvciBmbGF2b3IgOiBtRmxhdm9yQ29uZmlncykgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZmxhdm9yLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcvJykuYXBwZW5kKG1CdWlsZFR5cGUuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQobUJ1aWxkVHlwZS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRGlyTmFtZSA9IHNiLnRvU3RyaW5nKCk7CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtRGlyTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBhcHBsaWVkIGZsYXZvcnMuCisgICAgICoKKyAgICAgKiBUaGUgbGlzdCBjb250YWlucyB0aGUgZGltZW5zaW9uIG5hbWVzIGFzIHdlbGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0LCBwb3NzaWJseSBlbXB0eSBpZiB0aGVyZSBhcmUgbm8gZmxhdm9ycy4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Rmxhdm9yTmFtZXNXaXRoRGltZW5zaW9uTmFtZXMoKSB7CisgICAgICAgIGlmIChtRmxhdm9yQ29uZmlncy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8U3RyaW5nPiBuYW1lczsKKyAgICAgICAgaW50IGNvdW50ID0gbUZsYXZvckNvbmZpZ3Muc2l6ZSgpOworCisgICAgICAgIGlmIChjb3VudCA+IDEpIHsKKyAgICAgICAgICAgIG5hbWVzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KGNvdW50ICogMik7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbmFtZXMuYWRkKG1GbGF2b3JDb25maWdzLmdldChpKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIG5hbWVzLmFkZChtRmxhdm9yRGltZW5zaW9uTmFtZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmFtZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG1GbGF2b3JDb25maWdzLmdldCgwKS5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hbWVzOworICAgIH0KKworCisgICAgLyoqCiAgICAgICogQWRkIGEgbmV3IGNvbmZpZ3VyZWQgUHJvZHVjdEZsYXZvci4KICAgICAgKgogICAgICAqIElmIG11bHRpcGxlIGZsYXZvcnMgYXJlIGFkZGVkLCB0aGUgcHJpb3JpdHkgZm9sbG93cyB0aGUgb3JkZXIgdGhleSBhcmUgYWRkZWQgd2hlbiBpdAogICAgICAqIGNvbWVzIHRvIHJlc29sdmluZyBBbmRyb2lkIHJlc291cmNlcyBvdmVybGF5cyAoaWUgZWFybGllciBhZGRlZCBmbGF2b3JzIHN1cGVyc2VkZXMKICAgICAgKiBsYXR0ZXIgYWRkZWQgb25lcykuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gc291cmNlUHJvdmlkZXIgdGhlIGNvbmZpZ3VyZWQgcHJvZHVjdCBmbGF2b3IKKyAgICAgKiBAcGFyYW0gcHJvZHVjdEZsYXZvciB0aGUgY29uZmlndXJlZCBwcm9kdWN0IGZsYXZvcgorICAgICAqIEBwYXJhbSBzb3VyY2VQcm92aWRlciB0aGUgc291cmNlIHByb3ZpZGVyIGZvciB0aGUgcHJvZHVjdCBmbGF2b3IKKyAgICAgKiBAcGFyYW0gZGltZW5zaW9uTmFtZSB0aGUgbmFtZSBvZiB0aGUgZGltZW5zaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmxhdm9yCisgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBjb25maWcgb2JqZWN0CiAgICAgICovCiAgICAgQE5vbk51bGwKLSAgICBwdWJsaWMgVmFyaWFudENvbmZpZ3VyYXRpb24gYWRkUHJvZHVjdEZsYXZvcihATm9uTnVsbCBEZWZhdWx0UHJvZHVjdEZsYXZvciBwcm9kdWN0Rmxhdm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyKSB7CisgICAgcHVibGljIFZhcmlhbnRDb25maWd1cmF0aW9uIGFkZFByb2R1Y3RGbGF2b3IoCisgICAgICAgICAgICBATm9uTnVsbCBEZWZhdWx0UHJvZHVjdEZsYXZvciBwcm9kdWN0Rmxhdm9yLAorICAgICAgICAgICAgQE5vbk51bGwgU291cmNlUHJvdmlkZXIgc291cmNlUHJvdmlkZXIsCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgZGltZW5zaW9uTmFtZSkgeworCiAgICAgICAgIG1GbGF2b3JDb25maWdzLmFkZChwcm9kdWN0Rmxhdm9yKTsKICAgICAgICAgbUZsYXZvclNvdXJjZVByb3ZpZGVycy5hZGQoc291cmNlUHJvdmlkZXIpOworICAgICAgICBtRmxhdm9yRGltZW5zaW9uTmFtZXMuYWRkKGRpbWVuc2lvbk5hbWUpOworCiAgICAgICAgIG1NZXJnZWRGbGF2b3IgPSBwcm9kdWN0Rmxhdm9yLm1lcmdlT3ZlcihtTWVyZ2VkRmxhdm9yKTsKKyAgICAgICAgY29tcHV0ZU5ka0NvbmZpZygpOwogCiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhcmlhbnQtc3BlY2lmaWMgc291cmNlIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBzb3VyY2VQcm92aWRlciB0aGUgc291cmNlIHByb3ZpZGVyIGZvciB0aGUgcHJvZHVjdCBmbGF2b3IKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvbmZpZyBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgVmFyaWFudENvbmZpZ3VyYXRpb24gc2V0VmFyaWFudFNvdXJjZVByb3ZpZGVyKEBOdWxsYWJsZSBTb3VyY2VQcm92aWRlciBzb3VyY2VQcm92aWRlcikgeworICAgICAgICBtVmFyaWFudFNvdXJjZVByb3ZpZGVyID0gc291cmNlUHJvdmlkZXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhcmlhbnQtc3BlY2lmaWMgc291cmNlIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBzb3VyY2VQcm92aWRlciB0aGUgc291cmNlIHByb3ZpZGVyIGZvciB0aGUgcHJvZHVjdCBmbGF2b3IKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvbmZpZyBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgVmFyaWFudENvbmZpZ3VyYXRpb24gc2V0TXVsdGlGbGF2b3JTb3VyY2VQcm92aWRlcihATnVsbGFibGUgU291cmNlUHJvdmlkZXIgc291cmNlUHJvdmlkZXIpIHsKKyAgICAgICAgbU11bHRpRmxhdm9yU291cmNlUHJvdmlkZXIgPSBzb3VyY2VQcm92aWRlcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFyaWFudCBzcGVjaWZpYyBzb3VyY2UgcHJvdmlkZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgcHJvdmlkZXIgb3IgbnVsbCBpZiBub25lIGhhcyBiZWVuIHByb3ZpZGVkLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBTb3VyY2VQcm92aWRlciBnZXRWYXJpYW50U291cmNlUHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiBtVmFyaWFudFNvdXJjZVByb3ZpZGVyOworICAgIH0KKworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBTb3VyY2VQcm92aWRlciBnZXRNdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gbU11bHRpRmxhdm9yU291cmNlUHJvdmlkZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVOZGtDb25maWcoKSB7CisgICAgICAgIG1NZXJnZWROZGtDb25maWcucmVzZXQoKTsKKworICAgICAgICBpZiAobURlZmF1bHRDb25maWcuZ2V0TmRrQ29uZmlnKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbU1lcmdlZE5ka0NvbmZpZy5hcHBlbmQobURlZmF1bHRDb25maWcuZ2V0TmRrQ29uZmlnKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IG1GbGF2b3JDb25maWdzLnNpemUoKSAtIDEgOyBpID49IDAgOyBpLS0pIHsKKyAgICAgICAgICAgIE5ka0NvbmZpZyBuZGtDb25maWcgPSBtRmxhdm9yQ29uZmlncy5nZXQoaSkuZ2V0TmRrQ29uZmlnKCk7CisgICAgICAgICAgICBpZiAobmRrQ29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTWVyZ2VkTmRrQ29uZmlnLmFwcGVuZChuZGtDb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1CdWlsZFR5cGUuZ2V0TmRrQ29uZmlnKCkgIT0gbnVsbCAmJiBtVHlwZSAhPSBUeXBlLlRFU1QpIHsKKyAgICAgICAgICAgIG1NZXJnZWROZGtDb25maWcuYXBwZW5kKG1CdWlsZFR5cGUuZ2V0TmRrQ29uZmlnKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGVwZW5kZW5jaWVzCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29udGFpbmVyIGEgRGVwZW5kZW5jeUNvbnRhaW5lci4KQEAgLTI3Niw4ICs1MjYsMTUgQEAKICAgICAgICAgcmV0dXJuIG1GbGF2b3JDb25maWdzOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgU291cmNlUHJvdmlkZXJzIGZvciB0aGUgZmxhdm9ycy4KKyAgICAgKgorICAgICAqIFRoZSBsaXN0IGlzIG9yZGVyZWQgZnJvbSBoaWdoZXIgcHJpb3JpdHkgdG8gbG93ZXIgcHJpb3JpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIFNvdXJjZSBQcm92aWRlcnMgZm9yIHRoZSBmbGF2b3JzLiBOZXZlciBudWxsLgorICAgICAqLwogICAgIEBOb25OdWxsCi0gICAgcHVibGljIEl0ZXJhYmxlPFNvdXJjZVByb3ZpZGVyPiBnZXRGbGF2b3JTb3VyY2VTZXRzKCkgeworICAgIHB1YmxpYyBMaXN0PFNvdXJjZVByb3ZpZGVyPiBnZXRGbGF2b3JTb3VyY2VQcm92aWRlcnMoKSB7CiAgICAgICAgIHJldHVybiBtRmxhdm9yU291cmNlUHJvdmlkZXJzOwogICAgIH0KIApAQCAtMzMwLDEwICs1ODcsMTEgQEAKICAgICAgICAgICAgIExpYnJhcnlEZXBlbmRlbmN5IGxpYnJhcnkgPSBkaXJlY3REZXBlbmRlbmNpZXMuZ2V0KGkpOwogCiAgICAgICAgICAgICAvLyBnZXQgaXRzIGxpYnJhcmllcwotICAgICAgICAgICAgTGlzdDxMaWJyYXJ5RGVwZW5kZW5jeT4gZGVwZW5kZW5jaWVzID0gbGlicmFyeS5nZXREZXBlbmRlbmNpZXMoKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb248TGlicmFyeURlcGVuZGVuY3k+IGRlcGVuZGVuY2llcyA9IGxpYnJhcnkuZ2V0RGVwZW5kZW5jaWVzKCk7CisgICAgICAgICAgICBMaXN0PExpYnJhcnlEZXBlbmRlbmN5PiBkZXBMaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KGRlcGVuZGVuY2llcyk7CiAKICAgICAgICAgICAgIC8vIHJlc29sdmUgdGhlIGRlcGVuZGVuY2llcyBmb3IgdGhvc2UgbGlicmFyaWVzCi0gICAgICAgICAgICByZXNvbHZlSW5kaXJlY3RMaWJyYXJ5RGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llcywgb3V0RmxhdERlcGVuZGVuY2llcyk7CisgICAgICAgICAgICByZXNvbHZlSW5kaXJlY3RMaWJyYXJ5RGVwZW5kZW5jaWVzKGRlcExpc3QsIG91dEZsYXREZXBlbmRlbmNpZXMpOwogCiAgICAgICAgICAgICAvLyBhbmQgYWRkIHRoZSBjdXJyZW50IG9uZSAoaWYgbmVlZGVkKSBpbiBmcm9udCAoaGlnaGVyIHByaW9yaXR5KQogICAgICAgICAgICAgaWYgKCFvdXRGbGF0RGVwZW5kZW5jaWVzLmNvbnRhaW5zKGxpYnJhcnkpKSB7CkBAIC0zODYsNyArNjQ0LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIGdldCBxdWVyeSBwYWNrYWdlIG5hbWUgZm9yICIgKyBtRGVidWdOYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgZ2V0IHF1ZXJ5IHBhY2thZ2UgbmFtZSBmb3IgIiArIGdldEZ1bGxOYW1lKCkpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lOwpAQCAtNDQ3LDcgKzcwNSwxMSBAQAogCiAgICAgICAgIGlmICh2ZXJzaW9uU3VmZml4ICE9IG51bGwgJiYgdmVyc2lvblN1ZmZpeC5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgIGlmICh2ZXJzaW9uTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbk5hbWUgPSBnZXRWZXJzaW9uTmFtZUZyb21NYW5pZmVzdCgpOworICAgICAgICAgICAgICAgIGlmIChtVHlwZSAhPSBUeXBlLlRFU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbk5hbWUgPSBnZXRWZXJzaW9uTmFtZUZyb21NYW5pZmVzdCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZlcnNpb25OYW1lID0gIiI7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB2ZXJzaW9uTmFtZSA9IHZlcnNpb25OYW1lICsgdmVyc2lvblN1ZmZpeDsKQEAgLTQ1Niw3ICs3MTgsMjcgQEAKICAgICAgICAgcmV0dXJuIHZlcnNpb25OYW1lOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZlcnNpb24gY29kZSBmb3IgdGhpcyB2YXJpYW50LiBUaGlzIGNvdWxkIGJlIGNvbWluZyBmcm9tIHRoZSBtYW5pZmVzdCBvcgorICAgICAqIGNvdWxkIGJlIG92ZXJyaWRkZW4gdGhyb3VnaCB0aGUgcHJvZHVjdCBmbGF2b3JzLCBhbmQgY2FuIGhhdmUgYSBzdWZmaXggc3BlY2lmaWVkIGJ5CisgICAgICogdGhlIGJ1aWxkIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIGNvZGUgb3IgLTEgaWYgdGhlcmUgd2FzIG5vbiBkZWZpbmVkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbkNvZGUoKSB7CisgICAgICAgIGludCB2ZXJzaW9uQ29kZSA9IG1NZXJnZWRGbGF2b3IuZ2V0VmVyc2lvbkNvZGUoKTsKKworICAgICAgICBpZiAodmVyc2lvbkNvZGUgPT0gLTEgJiYgbVR5cGUgIT0gVHlwZS5URVNUKSB7CisKKyAgICAgICAgICAgIHZlcnNpb25Db2RlID0gZ2V0VmVyc2lvbkNvZGVGcm9tTWFuaWZlc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2ZXJzaW9uQ29kZTsKKyAgICB9CisKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9URVNUX1JVTk5FUiA9ICJhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQm9vbGVhbiBERUZBVUxUX0hBTkRMRV9QUk9GSUxJTkcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBCb29sZWFuIERFRkFVTFRfRlVOQ1RJT05BTF9URVNUID0gZmFsc2U7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBpbnN0cnVtZW50YXRpb25SdW5uZXIgdG8gdXNlIHRvIHRlc3QgdGhpcyB2YXJpYW50LCBvciBpZiB0aGUKQEAgLTQ3NSw2ICs3NTcsMzggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGhhbmRsZVByb2ZpbGluZyB2YWx1ZSB0byB1c2UgdG8gdGVzdCB0aGlzIHZhcmlhbnQsIG9yIGlmIHRoZQorICAgICAqIHZhcmlhbnQgaXMgYSB0ZXN0LCB0aGUgb25lIHRvIHVzZSB0byB0ZXN0IHRoZSB0ZXN0ZWQgdmFyaWFudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBoYW5kbGVQcm9maWxpbmcgdmFsdWUKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBCb29sZWFuIGdldEhhbmRsZVByb2ZpbGluZygpIHsKKyAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24gY29uZmlnID0gdGhpczsKKyAgICAgICAgaWYgKG1UeXBlID09IFR5cGUuVEVTVCkgeworICAgICAgICAgICAgY29uZmlnID0gZ2V0VGVzdGVkQ29uZmlnKCk7CisgICAgICAgIH0KKyAgICAgICAgQm9vbGVhbiBoYW5kbGVQcm9maWxpbmcgPSBjb25maWcubU1lcmdlZEZsYXZvci5nZXRUZXN0SGFuZGxlUHJvZmlsaW5nKCk7CisgICAgICAgIHJldHVybiBoYW5kbGVQcm9maWxpbmcgIT0gbnVsbCA/IGhhbmRsZVByb2ZpbGluZyA6IERFRkFVTFRfSEFORExFX1BST0ZJTElORzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGZ1bmN0aW9uYWxUZXN0IHZhbHVlIHRvIHVzZSB0byB0ZXN0IHRoaXMgdmFyaWFudCwgb3IgaWYgdGhlCisgICAgICogdmFyaWFudCBpcyBhIHRlc3QsIHRoZSBvbmUgdG8gdXNlIHRvIHRlc3QgdGhlIHRlc3RlZCB2YXJpYW50LgorICAgICAqIEByZXR1cm4gdGhlIGZ1bmN0aW9uYWxUZXN0IHZhbHVlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgQm9vbGVhbiBnZXRGdW5jdGlvbmFsVGVzdCgpIHsKKyAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24gY29uZmlnID0gdGhpczsKKyAgICAgICAgaWYgKG1UeXBlID09IFR5cGUuVEVTVCkgeworICAgICAgICAgICAgY29uZmlnID0gZ2V0VGVzdGVkQ29uZmlnKCk7CisgICAgICAgIH0KKyAgICAgICAgQm9vbGVhbiBmdW5jdGlvbmFsVGVzdCA9IGNvbmZpZy5tTWVyZ2VkRmxhdm9yLmdldFRlc3RGdW5jdGlvbmFsVGVzdCgpOworICAgICAgICByZXR1cm4gZnVuY3Rpb25hbFRlc3QgIT0gbnVsbCA/IGZ1bmN0aW9uYWxUZXN0IDogREVGQVVMVF9GVU5DVElPTkFMX1RFU1Q7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmVhZHMgdGhlIHBhY2thZ2UgbmFtZSBmcm9tIHRoZSBtYW5pZmVzdC4gVGhpcyBpcyB1bm1vZGlmaWVkIGJ5IHRoZSBidWlsZCB0eXBlLgogICAgICAqLwogICAgIEBOdWxsYWJsZQpAQCAtNDk0LDYgKzgwOCwxNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSB2ZXJzaW9uIGNvZGUgZnJvbSB0aGUgbWFuaWZlc3QuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRWZXJzaW9uQ29kZUZyb21NYW5pZmVzdCgpIHsKKyAgICAgICAgRmlsZSBtYW5pZmVzdExvY2F0aW9uID0gbURlZmF1bHRTb3VyY2VQcm92aWRlci5nZXRNYW5pZmVzdEZpbGUoKTsKKyAgICAgICAgcmV0dXJuIHNNYW5pZmVzdFBhcnNlci5nZXRWZXJzaW9uQ29kZShtYW5pZmVzdExvY2F0aW9uKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIG1pblNka1ZlcnNpb24gZm9yIHRoaXMgdmFyaWFudC4KICAgICAgKgogICAgICAqIFRoaXMgdXNlcyBib3RoIHRoZSB2YWx1ZSBmcm9tIHRoZSBtYW5pZmVzdCAoaWYgcHJlc2VudCksIGFuZCB0aGUgb3ZlcnJpZGUgY29taW5nCkBAIC01NTIsNiArODc0LDEzIEBACiAgICAgcHVibGljIExpc3Q8RmlsZT4gZ2V0TWFuaWZlc3RPdmVybGF5cygpIHsKICAgICAgICAgTGlzdDxGaWxlPiBpbnB1dHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKIAorICAgICAgICBpZiAobVZhcmlhbnRTb3VyY2VQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBGaWxlIHZhcmlhbnRMb2NhdGlvbiA9IG1WYXJpYW50U291cmNlUHJvdmlkZXIuZ2V0TWFuaWZlc3RGaWxlKCk7CisgICAgICAgICAgICBpZiAodmFyaWFudExvY2F0aW9uLmlzRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgaW5wdXRzLmFkZCh2YXJpYW50TG9jYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgaWYgKG1CdWlsZFR5cGVTb3VyY2VQcm92aWRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBGaWxlIHR5cGVMb2NhdGlvbiA9IG1CdWlsZFR5cGVTb3VyY2VQcm92aWRlci5nZXRNYW5pZmVzdEZpbGUoKTsKICAgICAgICAgICAgIGlmICh0eXBlTG9jYXRpb24uaXNGaWxlKCkpIHsKQEAgLTU1OSw2ICs4ODgsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmIChtTXVsdGlGbGF2b3JTb3VyY2VQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBGaWxlIHZhcmlhbnRMb2NhdGlvbiA9IG1NdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyLmdldE1hbmlmZXN0RmlsZSgpOworICAgICAgICAgICAgaWYgKHZhcmlhbnRMb2NhdGlvbi5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgIGlucHV0cy5hZGQodmFyaWFudExvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGZvciAoU291cmNlUHJvdmlkZXIgc291cmNlUHJvdmlkZXIgOiBtRmxhdm9yU291cmNlUHJvdmlkZXJzKSB7CiAgICAgICAgICAgICBGaWxlIGYgPSBzb3VyY2VQcm92aWRlci5nZXRNYW5pZmVzdEZpbGUoKTsKICAgICAgICAgICAgIGlmIChmLmlzRmlsZSgpKSB7CkBAIC02MDEsNyArOTM3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIFNldDxGaWxlPiBtYWluUmVzRGlycyA9IG1EZWZhdWx0U291cmNlUHJvdmlkZXIuZ2V0UmVzRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgQ29sbGVjdGlvbjxGaWxlPiBtYWluUmVzRGlycyA9IG1EZWZhdWx0U291cmNlUHJvdmlkZXIuZ2V0UmVzRGlyZWN0b3JpZXMoKTsKIAogICAgICAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldChCdWlsZGVyQ29uc3RhbnRzLk1BSU4pOwogICAgICAgICByZXNvdXJjZVNldC5hZGRTb3VyY2VzKG1haW5SZXNEaXJzKTsKQEAgLTYxNCw3ICs5NTAsNyBAQAogICAgICAgICBmb3IgKGludCBuID0gbUZsYXZvclNvdXJjZVByb3ZpZGVycy5zaXplKCkgLSAxOyBuID49IDAgOyBuLS0pIHsKICAgICAgICAgICAgIFNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyID0gbUZsYXZvclNvdXJjZVByb3ZpZGVycy5nZXQobik7CiAKLSAgICAgICAgICAgIFNldDxGaWxlPiBmbGF2b3JSZXNEaXJzID0gc291cmNlUHJvdmlkZXIuZ2V0UmVzRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb248RmlsZT4gZmxhdm9yUmVzRGlycyA9IHNvdXJjZVByb3ZpZGVyLmdldFJlc0RpcmVjdG9yaWVzKCk7CiAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRoZSBzYW1lIG9mIHRoZSBmbGF2b3IgY29uZmlnLCBidXQgaXQncyBpbiBhIGRpZmZlcmVudCBsaXN0LgogICAgICAgICAgICAgLy8gVGhpcyBpcyBmaW5lIGFzIGJvdGggbGlzdCBhcmUgcGFyYWxsZWwgY29sbGVjdGlvbnMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXMuCiAgICAgICAgICAgICByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldChtRmxhdm9yQ29uZmlncy5nZXQobikuZ2V0TmFtZSgpKTsKQEAgLTYyMiwxMyArOTU4LDMwIEBACiAgICAgICAgICAgICByZXNvdXJjZVNldHMuYWRkKHJlc291cmNlU2V0KTsKICAgICAgICAgfQogCisgICAgICAgIC8vIG11bHRpZmxhdm9yIHNwZWNpZmljIG92ZXJyaWRlcyBmbGF2b3IKKyAgICAgICAgaWYgKG1NdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb248RmlsZT4gdmFyaWFudFJlc0RpcnMgPSBtTXVsdGlGbGF2b3JTb3VyY2VQcm92aWRlci5nZXRSZXNEaXJlY3RvcmllcygpOworICAgICAgICAgICAgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXQoZ2V0Rmxhdm9yTmFtZSgpKTsKKyAgICAgICAgICAgIHJlc291cmNlU2V0LmFkZFNvdXJjZXModmFyaWFudFJlc0RpcnMpOworICAgICAgICAgICAgcmVzb3VyY2VTZXRzLmFkZChyZXNvdXJjZVNldCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCB0eXBlIG92ZXJyaWRlcyB0aGUgZmxhdm9ycwogICAgICAgICBpZiAobUJ1aWxkVHlwZVNvdXJjZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNldDxGaWxlPiB0eXBlUmVzRGlycyA9IG1CdWlsZFR5cGVTb3VyY2VQcm92aWRlci5nZXRSZXNEaXJlY3RvcmllcygpOworICAgICAgICAgICAgQ29sbGVjdGlvbjxGaWxlPiB0eXBlUmVzRGlycyA9IG1CdWlsZFR5cGVTb3VyY2VQcm92aWRlci5nZXRSZXNEaXJlY3RvcmllcygpOwogICAgICAgICAgICAgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXQobUJ1aWxkVHlwZS5nZXROYW1lKCkpOwogICAgICAgICAgICAgcmVzb3VyY2VTZXQuYWRkU291cmNlcyh0eXBlUmVzRGlycyk7CiAgICAgICAgICAgICByZXNvdXJjZVNldHMuYWRkKHJlc291cmNlU2V0KTsKICAgICAgICAgfQogCisgICAgICAgIC8vIHZhcmlhbnQgc3BlY2lmaWMgb3ZlcnJpZGVzIGFsbAorICAgICAgICBpZiAobVZhcmlhbnRTb3VyY2VQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uPEZpbGU+IHZhcmlhbnRSZXNEaXJzID0gbVZhcmlhbnRTb3VyY2VQcm92aWRlci5nZXRSZXNEaXJlY3RvcmllcygpOworICAgICAgICAgICAgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXQoZ2V0RnVsbE5hbWUoKSk7CisgICAgICAgICAgICByZXNvdXJjZVNldC5hZGRTb3VyY2VzKHZhcmlhbnRSZXNEaXJzKTsKKyAgICAgICAgICAgIHJlc291cmNlU2V0cy5hZGQocmVzb3VyY2VTZXQpOworICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIHJlc291cmNlU2V0czsKICAgICB9CiAKQEAgLTY1OSw3ICsxMDEyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIFNldDxGaWxlPiBtYWluUmVzRGlycyA9IG1EZWZhdWx0U291cmNlUHJvdmlkZXIuZ2V0QXNzZXRzRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgQ29sbGVjdGlvbjxGaWxlPiBtYWluUmVzRGlycyA9IG1EZWZhdWx0U291cmNlUHJvdmlkZXIuZ2V0QXNzZXRzRGlyZWN0b3JpZXMoKTsKIAogICAgICAgICBBc3NldFNldCBhc3NldFNldCA9IG5ldyBBc3NldFNldChCdWlsZGVyQ29uc3RhbnRzLk1BSU4pOwogICAgICAgICBhc3NldFNldC5hZGRTb3VyY2VzKG1haW5SZXNEaXJzKTsKQEAgLTY2OSw3ICsxMDIyLDcgQEAKICAgICAgICAgZm9yIChpbnQgbiA9IG1GbGF2b3JTb3VyY2VQcm92aWRlcnMuc2l6ZSgpIC0gMTsgbiA+PSAwIDsgbi0tKSB7CiAgICAgICAgICAgICBTb3VyY2VQcm92aWRlciBzb3VyY2VQcm92aWRlciA9IG1GbGF2b3JTb3VyY2VQcm92aWRlcnMuZ2V0KG4pOwogCi0gICAgICAgICAgICBTZXQ8RmlsZT4gZmxhdm9yUmVzRGlycyA9IHNvdXJjZVByb3ZpZGVyLmdldEFzc2V0c0RpcmVjdG9yaWVzKCk7CisgICAgICAgICAgICBDb2xsZWN0aW9uPEZpbGU+IGZsYXZvclJlc0RpcnMgPSBzb3VyY2VQcm92aWRlci5nZXRBc3NldHNEaXJlY3RvcmllcygpOwogICAgICAgICAgICAgLy8gd2UgbmVlZCB0aGUgc2FtZSBvZiB0aGUgZmxhdm9yIGNvbmZpZywgYnV0IGl0J3MgaW4gYSBkaWZmZXJlbnQgbGlzdC4KICAgICAgICAgICAgIC8vIFRoaXMgaXMgZmluZSBhcyBib3RoIGxpc3QgYXJlIHBhcmFsbGVsIGNvbGxlY3Rpb25zIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zLgogICAgICAgICAgICAgYXNzZXRTZXQgPSBuZXcgQXNzZXRTZXQobUZsYXZvckNvbmZpZ3MuZ2V0KG4pLmdldE5hbWUoKSk7CkBAIC02NzcsMTYgKzEwMzAsNDggQEAKICAgICAgICAgICAgIGFzc2V0U2V0cy5hZGQoYXNzZXRTZXQpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gbXVsdGlmbGF2b3Igc3BlY2lmaWMgb3ZlcnJpZGVzIGZsYXZvcgorICAgICAgICBpZiAobU11bHRpRmxhdm9yU291cmNlUHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgQ29sbGVjdGlvbjxGaWxlPiB2YXJpYW50UmVzRGlycyA9IG1NdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyLmdldEFzc2V0c0RpcmVjdG9yaWVzKCk7CisgICAgICAgICAgICBhc3NldFNldCA9IG5ldyBBc3NldFNldChnZXRGbGF2b3JOYW1lKCkpOworICAgICAgICAgICAgYXNzZXRTZXQuYWRkU291cmNlcyh2YXJpYW50UmVzRGlycyk7CisgICAgICAgICAgICBhc3NldFNldHMuYWRkKGFzc2V0U2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJ1aWxkIHR5cGUgb3ZlcnJpZGVzIGZsYXZvcnMKICAgICAgICAgaWYgKG1CdWlsZFR5cGVTb3VyY2VQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTZXQ8RmlsZT4gdHlwZVJlc0RpcnMgPSBtQnVpbGRUeXBlU291cmNlUHJvdmlkZXIuZ2V0QXNzZXRzRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb248RmlsZT4gdHlwZVJlc0RpcnMgPSBtQnVpbGRUeXBlU291cmNlUHJvdmlkZXIuZ2V0QXNzZXRzRGlyZWN0b3JpZXMoKTsKICAgICAgICAgICAgIGFzc2V0U2V0ID0gbmV3IEFzc2V0U2V0KG1CdWlsZFR5cGUuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgIGFzc2V0U2V0LmFkZFNvdXJjZXModHlwZVJlc0RpcnMpOwogICAgICAgICAgICAgYXNzZXRTZXRzLmFkZChhc3NldFNldCk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyB2YXJpYW50IHNwZWNpZmljIG92ZXJyaWRlcyBhbGwKKyAgICAgICAgaWYgKG1WYXJpYW50U291cmNlUHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgQ29sbGVjdGlvbjxGaWxlPiB2YXJpYW50UmVzRGlycyA9IG1WYXJpYW50U291cmNlUHJvdmlkZXIuZ2V0QXNzZXRzRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgICAgIGFzc2V0U2V0ID0gbmV3IEFzc2V0U2V0KGdldEZ1bGxOYW1lKCkpOworICAgICAgICAgICAgYXNzZXRTZXQuYWRkU291cmNlcyh2YXJpYW50UmVzRGlycyk7CisgICAgICAgICAgICBhc3NldFNldHMuYWRkKGFzc2V0U2V0KTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBhc3NldFNldHM7CiAgICAgfQogCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgTGlzdDxGaWxlPiBnZXRMaWJyYXJ5Sm5pRm9sZGVycygpIHsKKyAgICAgICAgTGlzdDxGaWxlPiBsaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aEV4cGVjdGVkU2l6ZShtRmxhdExpYnJhcmllcy5zaXplKCkpOworCisgICAgICAgIGZvciAoaW50IG4gPSBtRmxhdExpYnJhcmllcy5zaXplKCkgLSAxIDsgbiA+PSAwIDsgbi0tKSB7CisgICAgICAgICAgICBMaWJyYXJ5RGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gbUZsYXRMaWJyYXJpZXMuZ2V0KG4pOworICAgICAgICAgICAgRmlsZSBqbmlGb2xkZXIgPSBkZXBlbmRlbmN5LmdldEpuaUZvbGRlcigpOworICAgICAgICAgICAgaWYgKGpuaUZvbGRlci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoam5pRm9sZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybnMgYWxsIHRoZSByZW5kZXJzY3JpcHQgaW1wb3J0IGZvbGRlciB0aGF0IGFyZSBvdXRzaWRlIG9mIHRoZSBjdXJyZW50IHByb2plY3QuCiAgICAgICovCkBAIC03MjQsNiArMTEwOSwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1NdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNvdXJjZUxpc3QuYWRkQWxsKG1NdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyLmdldFJlbmRlcnNjcmlwdERpcmVjdG9yaWVzKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1WYXJpYW50U291cmNlUHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc291cmNlTGlzdC5hZGRBbGwobVZhcmlhbnRTb3VyY2VQcm92aWRlci5nZXRSZW5kZXJzY3JpcHREaXJlY3RvcmllcygpKTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBzb3VyY2VMaXN0OwogICAgIH0KIApAQCAtNzU4LDYgKzExNTEsMzkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmIChtTXVsdGlGbGF2b3JTb3VyY2VQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzb3VyY2VMaXN0LmFkZEFsbChtTXVsdGlGbGF2b3JTb3VyY2VQcm92aWRlci5nZXRBaWRsRGlyZWN0b3JpZXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVZhcmlhbnRTb3VyY2VQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzb3VyY2VMaXN0LmFkZEFsbChtVmFyaWFudFNvdXJjZVByb3ZpZGVyLmdldEFpZGxEaXJlY3RvcmllcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzb3VyY2VMaXN0OworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgcHVibGljIExpc3Q8RmlsZT4gZ2V0Sm5pU291cmNlTGlzdCgpIHsKKyAgICAgICAgTGlzdDxGaWxlPiBzb3VyY2VMaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIHNvdXJjZUxpc3QuYWRkQWxsKG1EZWZhdWx0U291cmNlUHJvdmlkZXIuZ2V0Sm5pRGlyZWN0b3JpZXMoKSk7CisgICAgICAgIGlmIChtVHlwZSAhPSBUeXBlLlRFU1QgJiYgbUJ1aWxkVHlwZVNvdXJjZVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNvdXJjZUxpc3QuYWRkQWxsKG1CdWlsZFR5cGVTb3VyY2VQcm92aWRlci5nZXRKbmlEaXJlY3RvcmllcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoYXNGbGF2b3JzKCkpIHsKKyAgICAgICAgICAgIGZvciAoU291cmNlUHJvdmlkZXIgZmxhdm9yU291cmNlU2V0IDogbUZsYXZvclNvdXJjZVByb3ZpZGVycykgeworICAgICAgICAgICAgICAgIHNvdXJjZUxpc3QuYWRkQWxsKGZsYXZvclNvdXJjZVNldC5nZXRKbmlEaXJlY3RvcmllcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtTXVsdGlGbGF2b3JTb3VyY2VQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzb3VyY2VMaXN0LmFkZEFsbChtTXVsdGlGbGF2b3JTb3VyY2VQcm92aWRlci5nZXRKbmlEaXJlY3RvcmllcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtVmFyaWFudFNvdXJjZVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNvdXJjZUxpc3QuYWRkQWxsKG1WYXJpYW50U291cmNlUHJvdmlkZXIuZ2V0Sm5pRGlyZWN0b3JpZXMoKSk7CisgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gc291cmNlTGlzdDsKICAgICB9CiAKQEAgLTgxOSwyNyArMTI0NSw1MiBAQAogICAgICAgICByZXR1cm4gTGlzdHMubmV3QXJyYXlMaXN0KGphcnMpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIGZvciB0aGUgQnVpbGRDb25maWcgY2xhc3MuCisgICAgICoKKyAgICAgKiBJdGVtcyBjYW4gYmUgZWl0aGVyIGZpZWxkcyAoaW5zdGFuY2Ugb2Yge0BsaW5rIGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQ2xhc3NGaWVsZH0pCisgICAgICogb3IgY29tbWVudHMgKGluc3RhbmNlIG9mIFN0cmluZykuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBpdGVtcy4KKyAgICAgKi8KICAgICBATm9uTnVsbAotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QnVpbGRDb25maWdMaW5lcygpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGZ1bGxMaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRCdWlsZENvbmZpZ0l0ZW1zKCkgeworICAgICAgICBMaXN0PE9iamVjdD4gZnVsbExpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKIAotICAgICAgICBMaXN0PFN0cmluZz4gbGlzdCA9IG1EZWZhdWx0Q29uZmlnLmdldEJ1aWxkQ29uZmlnKCk7Ci0gICAgICAgIGlmICghbGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZ1bGxMaXN0LmFkZCgiLy8gbGluZXMgZnJvbSBkZWZhdWx0IGNvbmZpZy4iKTsKLSAgICAgICAgICAgIGZ1bGxMaXN0LmFkZEFsbChsaXN0KTsKLSAgICAgICAgfQorICAgICAgICBTZXQ8U3RyaW5nPiB1c2VkRmllbGROYW1lcyA9IFNldHMubmV3SGFzaFNldCgpOwogCi0gICAgICAgIGxpc3QgPSBtQnVpbGRUeXBlLmdldEJ1aWxkQ29uZmlnKCk7CisgICAgICAgIExpc3Q8Q2xhc3NGaWVsZD4gbGlzdCA9IG1CdWlsZFR5cGUuZ2V0QnVpbGRDb25maWdGaWVsZHMoKTsKICAgICAgICAgaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZnVsbExpc3QuYWRkKCIvLyBsaW5lcyBmcm9tIGJ1aWxkIHR5cGU6ICIgKyBtQnVpbGRUeXBlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBmdWxsTGlzdC5hZGRBbGwobGlzdCk7CisgICAgICAgICAgICBmdWxsTGlzdC5hZGQoIkZpZWxkcyBmcm9tIGJ1aWxkIHR5cGU6ICIgKyBtQnVpbGRUeXBlLmdldE5hbWUoKSk7CisgICAgICAgICAgICBmb3IgKENsYXNzRmllbGQgZiA6IGxpc3QpIHsKKyAgICAgICAgICAgICAgICB1c2VkRmllbGROYW1lcy5hZGQoZi5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGZ1bGxMaXN0LmFkZChmKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGZvciAoRGVmYXVsdFByb2R1Y3RGbGF2b3IgZmxhdm9yIDogbUZsYXZvckNvbmZpZ3MpIHsKLSAgICAgICAgICAgIGxpc3QgPSBmbGF2b3IuZ2V0QnVpbGRDb25maWcoKTsKKyAgICAgICAgICAgIGxpc3QgPSBmbGF2b3IuZ2V0QnVpbGRDb25maWdGaWVsZHMoKTsKICAgICAgICAgICAgIGlmICghbGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmdWxsTGlzdC5hZGQoIi8vIGxpbmVzIGZyb20gcHJvZHVjdCBmbGF2b3I6ICIgKyBmbGF2b3IuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBmdWxsTGlzdC5hZGRBbGwobGlzdCk7CisgICAgICAgICAgICAgICAgZnVsbExpc3QuYWRkKCJGaWVsZHMgZnJvbSBwcm9kdWN0IGZsYXZvcjogIiArIGZsYXZvci5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGZvciAoQ2xhc3NGaWVsZCBmIDogbGlzdCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZWRGaWVsZE5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2VkRmllbGROYW1lcy5hZGQoZi5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZnVsbExpc3QuYWRkKGYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbGlzdCA9IG1EZWZhdWx0Q29uZmlnLmdldEJ1aWxkQ29uZmlnRmllbGRzKCk7CisgICAgICAgIGlmICghbGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZ1bGxMaXN0LmFkZCgiRmllbGRzIGZyb20gZGVmYXVsdCBjb25maWcuIik7CisgICAgICAgICAgICBmb3IgKENsYXNzRmllbGQgZiA6IGxpc3QpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICghdXNlZEZpZWxkTmFtZXMuY29udGFpbnMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlZEZpZWxkTmFtZXMuYWRkKGYuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnVsbExpc3QuYWRkKGYpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC04ODUsNiArMTMzNiwyMSBAQAogICAgICAgICByZXR1cm4gZnVsbExpc3Q7CiAgICAgfQogCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGdldENvbnN1bWVyUHJvZ3VhcmRGaWxlcygpIHsKKyAgICAgICAgTGlzdDxPYmplY3Q+IGZ1bGxMaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICAgICAgLy8gYWRkIHRoZSBjb25maWcgZmlsZXMgZnJvbSB0aGUgYnVpbGQgdHlwZSwgbWFpbiBjb25maWcgYW5kIGZsYXZvcnMKKyAgICAgICAgZnVsbExpc3QuYWRkQWxsKG1EZWZhdWx0Q29uZmlnLmdldENvbnN1bWVyUHJvZ3VhcmRGaWxlcygpKTsKKyAgICAgICAgZnVsbExpc3QuYWRkQWxsKG1CdWlsZFR5cGUuZ2V0Q29uc3VtZXJQcm9ndWFyZEZpbGVzKCkpOworCisgICAgICAgIGZvciAoRGVmYXVsdFByb2R1Y3RGbGF2b3IgZmxhdm9yIDogbUZsYXZvckNvbmZpZ3MpIHsKKyAgICAgICAgICAgIGZ1bGxMaXN0LmFkZEFsbChmbGF2b3IuZ2V0Q29uc3VtZXJQcm9ndWFyZEZpbGVzKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZ1bGxMaXN0OworICAgIH0KKwogICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewogICAgICAgICBpZiAobVR5cGUgIT0gVHlwZS5URVNUKSB7CiAgICAgICAgICAgICBGaWxlIG1hbmlmZXN0ID0gbURlZmF1bHRTb3VyY2VQcm92aWRlci5nZXRNYW5pZmVzdEZpbGUoKTsKQEAgLTg5NSwxMSArMTM2MSwxOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgTmRrQ29uZmlnIGdldE5ka0NvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIG1NZXJnZWROZGtDb25maWc7CisgICAgfQogCiAgICAgQE51bGxhYmxlCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFN1cHBvcnRlZEFiaXMoKSB7Ci0gICAgICAgIC8vIG5vIG5kayBzdXBwb3J0IHlldCwgc28gcmV0dXJuIG51bGwKKyAgICAgICAgaWYgKG1NZXJnZWROZGtDb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZXJnZWROZGtDb25maWcuZ2V0QWJpRmlsdGVycygpOworICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvY29tcGlsaW5nL0J1aWxkQ29uZmlnR2VuZXJhdG9yLmphdmEgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9jb21waWxpbmcvQnVpbGRDb25maWdHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTI5OGI0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvY29tcGlsaW5nL0J1aWxkQ29uZmlnR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZGVyLmNvbXBpbGluZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CitpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5BbmRyb2lkQnVpbGRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkNsYXNzRmllbGQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uc3F1YXJldXAuamF2YXdyaXRlci5KYXZhV3JpdGVyOworCitpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lk1vZGlmaWVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKKy8qKgorICogQ2xhc3MgYWJsZSB0byBnZW5lcmF0ZSBhIEJ1aWxkQ29uZmlnIGNsYXNzIGluIEFuZHJvaWQgcHJvamVjdC4KKyAqIFRoZSBCdWlsZENvbmZpZyBjbGFzcyBjb250YWlucyBjb25zdGFudHMgcmVsYXRlZCB0byB0aGUgYnVpbGQgdGFyZ2V0LgorICovCitwdWJsaWMgY2xhc3MgQnVpbGRDb25maWdHZW5lcmF0b3IgeworCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQlVJTERfQ09ORklHX05BTUUgPSAiQnVpbGRDb25maWcuamF2YSI7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtR2VuRm9sZGVyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1CdWlsZENvbmZpZ1BhY2thZ2VOYW1lOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENsYXNzRmllbGQ+IG1GaWVsZHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIExpc3Q8T2JqZWN0PiBtSXRlbXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBnZW5lcmF0b3IKKyAgICAgKiBAcGFyYW0gZ2VuRm9sZGVyIHRoZSBnZW4gZm9sZGVyIG9mIHRoZSBwcm9qZWN0CisgICAgICogQHBhcmFtIGJ1aWxkQ29uZmlnUGFja2FnZU5hbWUgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRDb25maWdHZW5lcmF0b3IoQE5vbk51bGwgU3RyaW5nIGdlbkZvbGRlciwgQE5vbk51bGwgU3RyaW5nIGJ1aWxkQ29uZmlnUGFja2FnZU5hbWUpIHsKKyAgICAgICAgbUdlbkZvbGRlciA9IGNoZWNrTm90TnVsbChnZW5Gb2xkZXIpOworICAgICAgICBtQnVpbGRDb25maWdQYWNrYWdlTmFtZSA9IGNoZWNrTm90TnVsbChidWlsZENvbmZpZ1BhY2thZ2VOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRDb25maWdHZW5lcmF0b3IgYWRkRmllbGQoCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgdHlwZSwgQE5vbk51bGwgU3RyaW5nIG5hbWUsIEBOb25OdWxsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBtRmllbGRzLmFkZChBbmRyb2lkQnVpbGRlci5jcmVhdGVDbGFzc0ZpZWxkKHR5cGUsIG5hbWUsIHZhbHVlKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZENvbmZpZ0dlbmVyYXRvciBhZGRJdGVtcyhATnVsbGFibGUgQ29sbGVjdGlvbjxPYmplY3Q+IGl0ZW1zKSB7CisgICAgICAgIGlmIChpdGVtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtSXRlbXMuYWRkQWxsKGl0ZW1zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgRmlsZSByZXByZXNlbnRpbmcgd2hlcmUgdGhlIEJ1aWxkQ29uZmlnIGNsYXNzIHdpbGwgYmUuCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0Rm9sZGVyUGF0aCgpIHsKKyAgICAgICAgRmlsZSBnZW5Gb2xkZXIgPSBuZXcgRmlsZShtR2VuRm9sZGVyKTsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGdlbkZvbGRlciwgbUJ1aWxkQ29uZmlnUGFja2FnZU5hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikpOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldEJ1aWxkQ29uZmlnRmlsZSgpIHsKKyAgICAgICAgRmlsZSBmb2xkZXIgPSBnZXRGb2xkZXJQYXRoKCk7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShmb2xkZXIsIEJVSUxEX0NPTkZJR19OQU1FKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIEJ1aWxkQ29uZmlnIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBwa2dGb2xkZXIgPSBnZXRGb2xkZXJQYXRoKCk7CisgICAgICAgIGlmICghcGtnRm9sZGVyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIGlmICghcGtnRm9sZGVyLm1rZGlycygpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGUgIiArIHBrZ0ZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBGaWxlIGJ1aWxkQ29uZmlnSmF2YSA9IG5ldyBGaWxlKHBrZ0ZvbGRlciwgQlVJTERfQ09ORklHX05BTUUpOworICAgICAgICBGaWxlV3JpdGVyIG91dCA9IG5ldyBGaWxlV3JpdGVyKGJ1aWxkQ29uZmlnSmF2YSk7CisKKyAgICAgICAgSmF2YVdyaXRlciB3cml0ZXIgPSBuZXcgSmF2YVdyaXRlcihvdXQpOworCisgICAgICAgIFNldDxNb2RpZmllcj4gcHVibGljRmluYWwgPSBFbnVtU2V0Lm9mKE1vZGlmaWVyLlBVQkxJQywgTW9kaWZpZXIuRklOQUwpOworICAgICAgICBTZXQ8TW9kaWZpZXI+IHB1YmxpY0ZpbmFsU3RhdGljID0gRW51bVNldC5vZihNb2RpZmllci5QVUJMSUMsIE1vZGlmaWVyLkZJTkFMLCBNb2RpZmllci5TVEFUSUMpOworCisgICAgICAgIHdyaXRlci5lbWl0SmF2YWRvYygiQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZS4gRE8gTk9UIE1PRElGWSIpCisgICAgICAgICAgICAgICAgLmVtaXRQYWNrYWdlKG1CdWlsZENvbmZpZ1BhY2thZ2VOYW1lKQorICAgICAgICAgICAgICAgIC5iZWdpblR5cGUoIkJ1aWxkQ29uZmlnIiwgImNsYXNzIiwgcHVibGljRmluYWwpOworCisgICAgICAgIGZvciAoQ2xhc3NGaWVsZCBmaWVsZCA6IG1GaWVsZHMpIHsKKyAgICAgICAgICAgIHdyaXRlci5lbWl0RmllbGQoCisgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBwdWJsaWNGaW5hbFN0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKE9iamVjdCBpdGVtIDogbUl0ZW1zKSB7CisgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIENsYXNzRmllbGQpIHsKKyAgICAgICAgICAgICAgICBDbGFzc0ZpZWxkIGZpZWxkID0gKENsYXNzRmllbGQpaXRlbTsKKyAgICAgICAgICAgICAgICB3cml0ZXIuZW1pdEZpZWxkKAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljRmluYWxTdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRWYWx1ZSgpKTsKKworICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLmVtaXRTaW5nbGVMaW5lQ29tbWVudCgoU3RyaW5nKSBpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdyaXRlci5lbmRUeXBlKCk7CisKKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvZGVwZW5kZW5jeS9MaWJyYXJ5RGVwZW5kZW5jeS5qYXZhIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvZGVwZW5kZW5jeS9MaWJyYXJ5RGVwZW5kZW5jeS5qYXZhCmluZGV4IGMxNDMyNzYuLjM2NDk1ODggMTAwNjQ0Ci0tLSBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL2RlcGVuZGVuY3kvTGlicmFyeURlcGVuZGVuY3kuamF2YQorKysgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9kZXBlbmRlbmN5L0xpYnJhcnlEZXBlbmRlbmN5LmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQW5kcm9pZExpYnJhcnk7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCkBAIC0yNywxNSArMjgsMTUgQEAKIHB1YmxpYyBpbnRlcmZhY2UgTGlicmFyeURlcGVuZGVuY3kgZXh0ZW5kcyBBbmRyb2lkTGlicmFyeSwgTWFuaWZlc3REZXBlbmRlbmN5LCBTeW1ib2xGaWxlUHJvdmlkZXIgewogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGlyZWN0IGRlcGVuZGVuY3kgb2YgdGhpcyBkZXBlbmRlbmN5LgorICAgICAqIFJldHVybnMgdGhlIGRpcmVjdCBkZXBlbmRlbmN5IG9mIHRoaXMgZGVwZW5kZW5jeS4gVGhlIG9yZGVyIGlzIGltcG9ydGFudAogICAgICAqLwogICAgIEBOb25OdWxsCiAgICAgTGlzdDxMaWJyYXJ5RGVwZW5kZW5jeT4gZ2V0RGVwZW5kZW5jaWVzKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGxvY2FsIEphciBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZGVwZW5kZW5jeS4KKyAgICAgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIGxvY2FsIEphciBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZGVwZW5kZW5jeS4KICAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBKYXJEZXBlbmRlbmN5LiBNYXkgYmUgZW1wdHkgYnV0IG5vdCBudWxsLgogICAgICAqLwogICAgIEBOb25OdWxsCi0gICAgTGlzdDxKYXJEZXBlbmRlbmN5PiBnZXRMb2NhbERlcGVuZGVuY2llcygpOworICAgIENvbGxlY3Rpb248SmFyRGVwZW5kZW5jeT4gZ2V0TG9jYWxEZXBlbmRlbmNpZXMoKTsKIH0KZGlmZiAtLWdpdCBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL0Jhc2VDb25maWdJbXBsLmphdmEgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9CYXNlQ29uZmlnSW1wbC5qYXZhCmluZGV4IGUyNTE3YzUuLjYyNjUzZDMgMTAwNjQ0Ci0tLSBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL0Jhc2VDb25maWdJbXBsLmphdmEKKysrIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvQmFzZUNvbmZpZ0ltcGwuamF2YQpAQCAtMTgsMTEgKzE4LDEzIEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQmFzZUNvbmZpZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkNsYXNzRmllbGQ7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKQEAgLTMxLDIzICszMywyOCBAQAogcHVibGljIGNsYXNzIEJhc2VDb25maWdJbXBsIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBCYXNlQ29uZmlnIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAotICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IG1CdWlsZENvbmZpZ0xpbmVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENsYXNzRmllbGQ+IG1CdWlsZENvbmZpZ0ZpZWxkcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwogICAgIHByaXZhdGUgZmluYWwgTGlzdDxGaWxlPiBtUHJvZ3VhcmRGaWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxGaWxlPiBtQ29uc3VtZXJQcm9ndWFyZEZpbGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZENvbmZpZyhTdHJpbmcuLi4gbGluZXMpIHsKLSAgICAgICAgbUJ1aWxkQ29uZmlnTGluZXMuY2xlYXIoKTsKLSAgICAgICAgbUJ1aWxkQ29uZmlnTGluZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QobGluZXMpKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZENvbmZpZ0ZpZWxkcyhATm9uTnVsbCBDbGFzc0ZpZWxkLi4uIGZpZWxkcykgeworICAgICAgICBtQnVpbGRDb25maWdGaWVsZHMuY2xlYXIoKTsKKyAgICAgICAgbUJ1aWxkQ29uZmlnRmllbGRzLmFkZEFsbChBcnJheXMuYXNMaXN0KGZpZWxkcykpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkQ29uZmlnKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIG1CdWlsZENvbmZpZ0xpbmVzLmNsZWFyKCk7Ci0gICAgICAgIG1CdWlsZENvbmZpZ0xpbmVzLmFkZChsaW5lKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZENvbmZpZ0ZpZWxkcyhATm9uTnVsbCBDb2xsZWN0aW9uPENsYXNzRmllbGQ+IGZpZWxkcykgeworICAgICAgICBtQnVpbGRDb25maWdGaWVsZHMuY2xlYXIoKTsKKyAgICAgICAgbUJ1aWxkQ29uZmlnRmllbGRzLmFkZEFsbChmaWVsZHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEJ1aWxkQ29uZmlnRmllbGQoQE5vbk51bGwgQ2xhc3NGaWVsZCBmaWVsZCkgeworICAgICAgICBtQnVpbGRDb25maWdGaWVsZHMuYWRkKGZpZWxkKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBATm9uTnVsbAotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QnVpbGRDb25maWcoKSB7Ci0gICAgICAgIHJldHVybiBtQnVpbGRDb25maWdMaW5lczsKKyAgICBwdWJsaWMgTGlzdDxDbGFzc0ZpZWxkPiBnZXRCdWlsZENvbmZpZ0ZpZWxkcygpIHsKKyAgICAgICAgcmV0dXJuIG1CdWlsZENvbmZpZ0ZpZWxkczsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTU2LDEyICs2MywyMCBAQAogICAgICAgICByZXR1cm4gbVByb2d1YXJkRmlsZXM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgTGlzdDxGaWxlPiBnZXRDb25zdW1lclByb2d1YXJkRmlsZXMoKSB7CisgICAgICAgIHJldHVybiBtQ29uc3VtZXJQcm9ndWFyZEZpbGVzOworICAgIH0KKwogICAgIHByb3RlY3RlZCB2b2lkIF9pbml0V2l0aChCYXNlQ29uZmlnIHRoYXQpIHsKLSAgICAgICAgbUJ1aWxkQ29uZmlnTGluZXMuY2xlYXIoKTsKLSAgICAgICAgbUJ1aWxkQ29uZmlnTGluZXMuYWRkQWxsKHRoYXQuZ2V0QnVpbGRDb25maWcoKSk7CisgICAgICAgIHNldEJ1aWxkQ29uZmlnRmllbGRzKHRoYXQuZ2V0QnVpbGRDb25maWdGaWVsZHMoKSk7CiAKICAgICAgICAgbVByb2d1YXJkRmlsZXMuY2xlYXIoKTsKICAgICAgICAgbVByb2d1YXJkRmlsZXMuYWRkQWxsKHRoYXQuZ2V0UHJvZ3VhcmRGaWxlcygpKTsKKworICAgICAgICBtQ29uc3VtZXJQcm9ndWFyZEZpbGVzLmNsZWFyKCk7CisgICAgICAgIG1Db25zdW1lclByb2d1YXJkRmlsZXMuYWRkQWxsKHRoYXQuZ2V0Q29uc3VtZXJQcm9ndWFyZEZpbGVzKCkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNzEsMTYgKzg2LDE4IEBACiAKICAgICAgICAgQmFzZUNvbmZpZ0ltcGwgdGhhdCA9IChCYXNlQ29uZmlnSW1wbCkgbzsKIAotICAgICAgICBpZiAoIW1CdWlsZENvbmZpZ0xpbmVzLmVxdWFscyh0aGF0Lm1CdWlsZENvbmZpZ0xpbmVzKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1CdWlsZENvbmZpZ0ZpZWxkcy5lcXVhbHModGhhdC5tQnVpbGRDb25maWdGaWVsZHMpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIGlmICghbVByb2d1YXJkRmlsZXMuZXF1YWxzKHRoYXQubVByb2d1YXJkRmlsZXMpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbUNvbnN1bWVyUHJvZ3VhcmRGaWxlcy5lcXVhbHModGhhdC5tQ29uc3VtZXJQcm9ndWFyZEZpbGVzKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGludCByZXN1bHQgPSBtQnVpbGRDb25maWdMaW5lcy5oYXNoQ29kZSgpOworICAgICAgICBpbnQgcmVzdWx0ID0gbUJ1aWxkQ29uZmlnRmllbGRzLmhhc2hDb2RlKCk7CiAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgbVByb2d1YXJkRmlsZXMuaGFzaENvZGUoKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBtQ29uc3VtZXJQcm9ndWFyZEZpbGVzLmhhc2hDb2RlKCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvQnVpbGRDb25maWdHZW5lcmF0b3IuamF2YSBiL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL0J1aWxkQ29uZmlnR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MWVkNWQuLjAwMDAwMDAKLS0tIGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvQnVpbGRDb25maWdHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGRlci5pbnRlcm5hbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOwotCi0vKioKLSAqIENsYXNzIGFibGUgdG8gZ2VuZXJhdGUgYSBCdWlsZENvbmZpZyBjbGFzcyBpbiBBbmRyb2lkIHByb2plY3QuCi0gKiBUaGUgQnVpbGRDb25maWcgY2xhc3MgY29udGFpbnMgY29uc3RhbnRzIHJlbGF0ZWQgdG8gdGhlIGJ1aWxkIHRhcmdldC4KLSAqLwotcHVibGljIGNsYXNzIEJ1aWxkQ29uZmlnR2VuZXJhdG9yIHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBURU1QTEFURSA9ICJCdWlsZENvbmZpZy50ZW1wbGF0ZSI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBIX1BBQ0tBR0UgPSAiI1BBQ0tBR0UjIjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEhfREVCVUcgPSAiI0RFQlVHIyI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBIX0xJTkVTID0gIiNBRERJVElPTkFMX0xJTkVTIyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtR2VuRm9sZGVyOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1BcHBQYWNrYWdlOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtRGVidWc7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBCVUlMRF9DT05GSUdfTkFNRSA9ICJCdWlsZENvbmZpZy5qYXZhIjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBnZW5lcmF0b3IKLSAgICAgKiBAcGFyYW0gZ2VuRm9sZGVyIHRoZSBnZW4gZm9sZGVyIG9mIHRoZSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIGFwcFBhY2thZ2UgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UKLSAgICAgKiBAcGFyYW0gZGVidWcgd2hldGhlciBpdCdzIGEgZGVidWcgYnVpbGQKLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRDb25maWdHZW5lcmF0b3IoQE5vbk51bGwgU3RyaW5nIGdlbkZvbGRlciwgQE5vbk51bGwgU3RyaW5nIGFwcFBhY2thZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVidWcpIHsKLSAgICAgICAgbUdlbkZvbGRlciA9IGNoZWNrTm90TnVsbChnZW5Gb2xkZXIpOwotICAgICAgICBtQXBwUGFja2FnZSA9IGNoZWNrTm90TnVsbChhcHBQYWNrYWdlKTsKLSAgICAgICAgbURlYnVnID0gZGVidWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIEZpbGUgcmVwcmVzZW50aW5nIHdoZXJlIHRoZSBCdWlsZENvbmZpZyBjbGFzcyB3aWxsIGJlLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldEZvbGRlclBhdGgoKSB7Ci0gICAgICAgIEZpbGUgZ2VuRm9sZGVyID0gbmV3IEZpbGUobUdlbkZvbGRlcik7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZShnZW5Gb2xkZXIsIG1BcHBQYWNrYWdlLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRCdWlsZENvbmZpZ0ZpbGUoKSB7Ci0gICAgICAgIEZpbGUgZm9sZGVyID0gZ2V0Rm9sZGVyUGF0aCgpOwotICAgICAgICByZXR1cm4gbmV3IEZpbGUoZm9sZGVyLCBCVUlMRF9DT05GSUdfTkFNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIHRoZSBCdWlsZENvbmZpZyBjbGFzcy4KLSAgICAgKiBAcGFyYW0gYWRkaXRpb25hbExpbmVzIGEgbGlzdCBvZiBhZGRpdGlvbmFsIGxpbmVzIHRvIGJlIGFkZGVkIHRvIHRoZSBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZShATnVsbGFibGUgTGlzdDxTdHJpbmc+IGFkZGl0aW9uYWxMaW5lcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBNYXBzLm5ld0hhc2hNYXAoKTsKLSAgICAgICAgbWFwLnB1dChQSF9QQUNLQUdFLCBtQXBwUGFja2FnZSk7Ci0gICAgICAgIG1hcC5wdXQoUEhfREVCVUcsIEJvb2xlYW4udG9TdHJpbmcobURlYnVnKSk7Ci0KLSAgICAgICAgaWYgKGFkZGl0aW9uYWxMaW5lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBhZGRpdGlvbmFsTGluZXMpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgICAiKS5hcHBlbmQobGluZSkuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFwLnB1dChQSF9MSU5FUywgc2IudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1hcC5wdXQoUEhfTElORVMsICIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgcGtnRm9sZGVyID0gZ2V0Rm9sZGVyUGF0aCgpOwotICAgICAgICBpZiAoIXBrZ0ZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBwa2dGb2xkZXIubWtkaXJzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIGJ1aWxkQ29uZmlnSmF2YSA9IG5ldyBGaWxlKHBrZ0ZvbGRlciwgQlVJTERfQ09ORklHX05BTUUpOwotCi0gICAgICAgIFRlbXBsYXRlUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZW1wbGF0ZVByb2Nlc3NvcigKLSAgICAgICAgICAgICAgICBCdWlsZENvbmZpZ0dlbmVyYXRvci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKFRFTVBMQVRFKSwgbWFwKTsKLSAgICAgICAgcHJvY2Vzc29yLmdlbmVyYXRlKGJ1aWxkQ29uZmlnSmF2YSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvQ2xhc3NGaWVsZEltcGwuamF2YSBiL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL0NsYXNzRmllbGRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ4MjRiNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL0NsYXNzRmllbGRJbXBsLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGRlci5pbnRlcm5hbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5DbGFzc0ZpZWxkOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NGaWVsZEltcGwgaW1wbGVtZW50cyBDbGFzc0ZpZWxkLCBTZXJpYWxpemFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHR5cGU7CisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7CisKKyAgICBwdWJsaWMgQ2xhc3NGaWVsZEltcGwoQE5vbk51bGwgU3RyaW5nIHR5cGUsIEBOb25OdWxsIFN0cmluZyBuYW1lLCBATm9uTnVsbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRDb25kaXRpb25zCisgICAgICAgIGlmICh0eXBlID09IG51bGwgfHwgbmFtZSA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQnVpbGQgQ29uZmlnIGZpZWxkIGNhbm5vdCBoYXZlIGEgbnVsbCBwYXJhbWV0ZXIiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOb25OdWxsCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBDbGFzc0ZpZWxkSW1wbCB0aGF0ID0gKENsYXNzRmllbGRJbXBsKSBvOworCisgICAgICAgIGlmICghbmFtZS5lcXVhbHModGhhdC5uYW1lKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXR5cGUuZXF1YWxzKHRoYXQudHlwZSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF2YWx1ZS5lcXVhbHModGhhdC52YWx1ZSkpIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gdHlwZS5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIG5hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyB2YWx1ZS5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL01lcmdlZE5ka0NvbmZpZy5qYXZhIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvTWVyZ2VkTmRrQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4M2U5OQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL01lcmdlZE5ka0NvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZGVyLmludGVybmFsOworCitpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLk5ka0NvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIE5ka0NvbmZpZyB1c2VkIHRvIG1lcmdlIG11bHRpcGxlIGNvbmZpZ3MgdG9nZXRoZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXJnZWROZGtDb25maWcgaW1wbGVtZW50cyBOZGtDb25maWcgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbW9kdWxlTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBjRmxhZ3M7CisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBsZExpYnM7CisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBhYmlGaWx0ZXJzOworICAgIHByaXZhdGUgU3RyaW5nIHN0bDsKKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBtb2R1bGVOYW1lID0gbnVsbDsKKyAgICAgICAgY0ZsYWdzID0gbnVsbDsKKyAgICAgICAgbGRMaWJzID0gbnVsbDsKKyAgICAgICAgYWJpRmlsdGVycyA9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFN0cmluZyBnZXRNb2R1bGVOYW1lKCkgeworICAgICAgICByZXR1cm4gbW9kdWxlTmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldGNGbGFncygpIHsKKyAgICAgICAgcmV0dXJuIGNGbGFnczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0TGRMaWJzKCkgeworICAgICAgICByZXR1cm4gbGRMaWJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRBYmlGaWx0ZXJzKCkgeworICAgICAgICByZXR1cm4gYWJpRmlsdGVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0bCgpIHsKKyAgICAgICAgcmV0dXJuIHN0bDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmQoQE5vbk51bGwgTmRrQ29uZmlnIG5ka0NvbmZpZykgeworICAgICAgICAvLyBvdmVycmlkZQorICAgICAgICBpZiAobmRrQ29uZmlnLmdldE1vZHVsZU5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBtb2R1bGVOYW1lID0gbmRrQ29uZmlnLmdldE1vZHVsZU5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZGtDb25maWcuZ2V0U3RsKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgc3RsID0gbmRrQ29uZmlnLmdldFN0bCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXBwZW5kCisgICAgICAgIGlmIChuZGtDb25maWcuZ2V0QWJpRmlsdGVycygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChhYmlGaWx0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhYmlGaWx0ZXJzID0gU2V0cy5uZXdIYXNoU2V0V2l0aEV4cGVjdGVkU2l6ZShuZGtDb25maWcuZ2V0QWJpRmlsdGVycygpLnNpemUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFiaUZpbHRlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFiaUZpbHRlcnMuYWRkQWxsKG5ka0NvbmZpZy5nZXRBYmlGaWx0ZXJzKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNGbGFncyA9PSBudWxsKSB7CisgICAgICAgICAgICBjRmxhZ3MgPSBuZGtDb25maWcuZ2V0Y0ZsYWdzKCk7CisgICAgICAgIH0gZWxzZSBpZiAobmRrQ29uZmlnLmdldGNGbGFncygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNGbGFncyA9IGNGbGFncyArICIgIiArIG5ka0NvbmZpZy5nZXRjRmxhZ3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZGtDb25maWcuZ2V0TGRMaWJzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxkTGlicyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbGRMaWJzID0gU2V0cy5uZXdIYXNoU2V0V2l0aEV4cGVjdGVkU2l6ZShuZGtDb25maWcuZ2V0TGRMaWJzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGRMaWJzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZExpYnMuYWRkQWxsKG5ka0NvbmZpZy5nZXRMZExpYnMoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9TdHJpbmdIZWxwZXIuamF2YSBiL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL1N0cmluZ0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNTlhODIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9TdHJpbmdIZWxwZXIuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZGVyLmludGVybmFsOworCitpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgU3RyaW5nSGVscGVyIHsKKworICAgIEBOb25OdWxsCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwaXRhbGl6ZShATm9uTnVsbCBTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzYi5hcHBlbmQoc3RyaW5nLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpKS5hcHBlbmQoc3RyaW5nLnN1YnN0cmluZygxKSk7CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvVGVzdE1hbmlmZXN0R2VuZXJhdG9yLmphdmEgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9UZXN0TWFuaWZlc3RHZW5lcmF0b3IuamF2YQppbmRleCA2OWZhN2I1Li45ZTQ0M2E3IDEwMDY0NAotLS0gYS9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9UZXN0TWFuaWZlc3RHZW5lcmF0b3IuamF2YQorKysgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9UZXN0TWFuaWZlc3RHZW5lcmF0b3IuamF2YQpAQCAtMzMsNiArMzMsOCBAQAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQSF9UQVJHRVRfU0RLX1ZFUlNJT04gPSAiI1RBUkdFVFNES1ZFUlNJT04jIjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEhfVEVTVEVEX1BBQ0tBR0UgPSAiI1RFU1RFRFBBQ0tBR0UjIjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEhfVEVTVF9SVU5ORVIgPSAiI1RFU1RSVU5ORVIjIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEhfSEFORExFX1BST0ZJTElORyA9ICIjSEFORExFUFJPRklMSU5HIyI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBIX0ZVTkNUSU9OQUxfVEVTVCA9ICIjRlVOQ1RJT05BTFRFU1QjIjsKIAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1PdXRwdXRGaWxlOwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlTmFtZTsKQEAgLTQwLDE5ICs0MiwyNSBAQAogICAgIHByaXZhdGUgZmluYWwgaW50IG1UYXJnZXRTZGtWZXJzaW9uOwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1UZXN0ZWRQYWNrYWdlTmFtZTsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVGVzdFJ1bm5lck5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1IYW5kbGVQcm9maWxpbmc7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1GdW5jdGlvbmFsVGVzdDsKIAogICAgIHB1YmxpYyBUZXN0TWFuaWZlc3RHZW5lcmF0b3IoQE5vbk51bGwgU3RyaW5nIG91dHB1dEZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pblNka1ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXJnZXRTZGtWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgdGVzdGVkUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyB0ZXN0UnVubmVyTmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgdGVzdFJ1bm5lck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIEJvb2xlYW4gaGFuZGxlUHJvZmlsaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBCb29sZWFuIGZ1bmN0aW9uYWxUZXN0KSB7CiAgICAgICAgIG1PdXRwdXRGaWxlID0gb3V0cHV0RmlsZTsKICAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CiAgICAgICAgIG1NaW5TZGtWZXJzaW9uID0gbWluU2RrVmVyc2lvbjsKICAgICAgICAgbVRhcmdldFNka1ZlcnNpb24gPSB0YXJnZXRTZGtWZXJzaW9uICE9IC0xID8gdGFyZ2V0U2RrVmVyc2lvbiA6IG1pblNka1ZlcnNpb247CiAgICAgICAgIG1UZXN0ZWRQYWNrYWdlTmFtZSA9IHRlc3RlZFBhY2thZ2VOYW1lOwogICAgICAgICBtVGVzdFJ1bm5lck5hbWUgPSB0ZXN0UnVubmVyTmFtZTsKKyAgICAgICAgbUhhbmRsZVByb2ZpbGluZyA9IGhhbmRsZVByb2ZpbGluZzsKKyAgICAgICAgbUZ1bmN0aW9uYWxUZXN0ID0gZnVuY3Rpb25hbFRlc3Q7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZ2VuZXJhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtNjIsNiArNzAsOCBAQAogICAgICAgICBtYXAucHV0KFBIX1RBUkdFVF9TREtfVkVSU0lPTiwgSW50ZWdlci50b1N0cmluZyhtVGFyZ2V0U2RrVmVyc2lvbikpOwogICAgICAgICBtYXAucHV0KFBIX1RFU1RFRF9QQUNLQUdFLCBtVGVzdGVkUGFja2FnZU5hbWUpOwogICAgICAgICBtYXAucHV0KFBIX1RFU1RfUlVOTkVSLCBtVGVzdFJ1bm5lck5hbWUpOworICAgICAgICBtYXAucHV0KFBIX0hBTkRMRV9QUk9GSUxJTkcsIEJvb2xlYW4udG9TdHJpbmcobUhhbmRsZVByb2ZpbGluZykpOworICAgICAgICBtYXAucHV0KFBIX0ZVTkNUSU9OQUxfVEVTVCwgQm9vbGVhbi50b1N0cmluZyhtRnVuY3Rpb25hbFRlc3QpKTsKIAogICAgICAgICBUZW1wbGF0ZVByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVtcGxhdGVQcm9jZXNzb3IoCiAgICAgICAgICAgICAgICAgVGVzdE1hbmlmZXN0R2VuZXJhdG9yLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oVEVNUExBVEUpLApkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvY29tcGlsZXIvUmVuZGVyU2NyaXB0UHJvY2Vzc29yLmphdmEgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9jb21waWxlci9SZW5kZXJTY3JpcHRQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjI4NzQzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvY29tcGlsZXIvUmVuZGVyU2NyaXB0UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwzOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGRlci5pbnRlcm5hbC5jb21waWxlcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLlNka0NvbnN0YW50czsKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5jb21tb24uaW50ZXJuYWwuQ29tbWFuZExpbmVSdW5uZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaWRlLmNvbW1vbi5pbnRlcm5hbC5Mb2dnZWRFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pZGUuY29tbW9uLmludGVybmFsLldhaXRhYmxlRXhlY3V0b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLkJ1aWxkVG9vbEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuU2RrQ29uc3RhbnRzLkVYVF9CQzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuU2RrQ29uc3RhbnRzLkZOX1JFTkRFUlNDUklQVF9WOF9KQVI7CisKKy8qKgorICogQ29tcGlsZXMgUmVuZGVyc2NyaXB0IGZpbGVzLgorICovCitwdWJsaWMgY2xhc3MgUmVuZGVyU2NyaXB0UHJvY2Vzc29yIHsKKworICAgIC8vIEFCSSBsaXN0LCBhcyBwYWlycyBvZiAoYW5kcm9pZC1BQkksIHRvb2xjaGFpbi1BQkkpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQWJpIHsKKworICAgICAgICBATm9uTnVsbAorICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGV2aWNlOworICAgICAgICBATm9uTnVsbAorICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVG9vbGNoYWluOworICAgICAgICBATm9uTnVsbAorICAgICAgICBwcml2YXRlIGZpbmFsIEJ1aWxkVG9vbEluZm8uUGF0aElkIG1MaW5rZXI7CisgICAgICAgIEBOb25OdWxsCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbUxpbmtlckFyZ3M7CisKKyAgICAgICAgQWJpKEBOb25OdWxsIFN0cmluZyBkZXZpY2UsCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgdG9vbGNoYWluLAorICAgICAgICAgICAgQE5vbk51bGwgQnVpbGRUb29sSW5mby5QYXRoSWQgbGlua2VyLAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nLi4uIGxpbmtlckFyZ3MpIHsKKworICAgICAgICAgICAgbURldmljZSA9IGRldmljZTsKKyAgICAgICAgICAgIG1Ub29sY2hhaW4gPSB0b29sY2hhaW47CisgICAgICAgICAgICBtTGlua2VyID0gbGlua2VyOworICAgICAgICAgICAgbUxpbmtlckFyZ3MgPSBsaW5rZXJBcmdzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWJpW10gQUJJUyA9IHsKKyAgICAgICAgICAgIG5ldyBBYmkoImFybWVhYmktdjdhIiwgImFybXY3LW5vbmUtbGludXgtZ251ZWFiaSIsIEJ1aWxkVG9vbEluZm8uUGF0aElkLkxEX0FSTSwKKyAgICAgICAgICAgICAgICAgICAgIi1keW5hbWljLWxpbmtlciIsICIvc3lzdGVtL2Jpbi9saW5rZXIiLCAiLVgiLCAiLW0iLCAiYXJtZWxmX2xpbnV4X2VhYmkiKSwKKyAgICAgICAgICAgIG5ldyBBYmkoIm1pcHMiLCAibWlwc2VsLXVua25vd24tbGludXgiLCBCdWlsZFRvb2xJbmZvLlBhdGhJZC5MRF9NSVBTLCAiLUVMIiksCisgICAgICAgICAgICBuZXcgQWJpKCJ4ODYiLCAiaTY4Ni11bmtub3duLWxpbnV4IiwgQnVpbGRUb29sSW5mby5QYXRoSWQuTERfWDg2LCAiLW0iLCAiZWxmX2kzODYiKSB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlNfREVQUyA9ICJyc0RlcHMiOworCisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8RmlsZT4gbVNvdXJjZUZvbGRlcnM7CisKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgTGlzdDxGaWxlPiBtSW1wb3J0Rm9sZGVyczsKKworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIG1Tb3VyY2VPdXRwdXREaXI7CisKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgRmlsZSBtUmVzT3V0cHV0RGlyOworCisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIGZpbmFsIEZpbGUgbU9iak91dHB1dERpcjsKKworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIG1MaWJPdXRwdXREaXI7CisKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgQnVpbGRUb29sSW5mbyBtQnVpbGRUb29sSW5mbzsKKworICAgIHByaXZhdGUgZmluYWwgaW50IG1UYXJnZXRBcGk7CisKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbURlYnVnQnVpbGQ7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBtT3B0aW1MZXZlbDsKKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtTmRrTW9kZTsKKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtU3VwcG9ydE1vZGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBtQWJpRmlsdGVyczsKKworICAgIHByaXZhdGUgZmluYWwgRmlsZSBtUnNMaWI7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIG1MaWJDbENvcmU7CisKKyAgICBwdWJsaWMgUmVuZGVyU2NyaXB0UHJvY2Vzc29yKAorICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxGaWxlPiBzb3VyY2VGb2xkZXJzLAorICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxGaWxlPiBpbXBvcnRGb2xkZXJzLAorICAgICAgICAgICAgQE5vbk51bGwgRmlsZSBzb3VyY2VPdXRwdXREaXIsCisgICAgICAgICAgICBATm9uTnVsbCBGaWxlIHJlc091dHB1dERpciwKKyAgICAgICAgICAgIEBOb25OdWxsIEZpbGUgb2JqT3V0cHV0RGlyLAorICAgICAgICAgICAgQE5vbk51bGwgRmlsZSBsaWJPdXRwdXREaXIsCisgICAgICAgICAgICBATm9uTnVsbCBCdWlsZFRvb2xJbmZvIGJ1aWxkVG9vbEluZm8sCisgICAgICAgICAgICBpbnQgdGFyZ2V0QXBpLAorICAgICAgICAgICAgYm9vbGVhbiBkZWJ1Z0J1aWxkLAorICAgICAgICAgICAgaW50IG9wdGltTGV2ZWwsCisgICAgICAgICAgICBib29sZWFuIG5ka01vZGUsCisgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRNb2RlLAorICAgICAgICAgICAgQE51bGxhYmxlIFNldDxTdHJpbmc+IGFiaUZpbHRlcnMpIHsKKyAgICAgICAgbVNvdXJjZUZvbGRlcnMgPSBzb3VyY2VGb2xkZXJzOworICAgICAgICBtSW1wb3J0Rm9sZGVycyA9IGltcG9ydEZvbGRlcnM7CisgICAgICAgIG1Tb3VyY2VPdXRwdXREaXIgPSBzb3VyY2VPdXRwdXREaXI7CisgICAgICAgIG1SZXNPdXRwdXREaXIgPSByZXNPdXRwdXREaXI7CisgICAgICAgIG1PYmpPdXRwdXREaXIgPSBvYmpPdXRwdXREaXI7CisgICAgICAgIG1MaWJPdXRwdXREaXIgPSBsaWJPdXRwdXREaXI7CisgICAgICAgIG1CdWlsZFRvb2xJbmZvID0gYnVpbGRUb29sSW5mbzsKKyAgICAgICAgbVRhcmdldEFwaSA9IHRhcmdldEFwaTsKKyAgICAgICAgbURlYnVnQnVpbGQgPSBkZWJ1Z0J1aWxkOworICAgICAgICBtT3B0aW1MZXZlbCA9IG9wdGltTGV2ZWw7CisgICAgICAgIG1OZGtNb2RlID0gbmRrTW9kZTsKKyAgICAgICAgbVN1cHBvcnRNb2RlID0gc3VwcG9ydE1vZGU7CisgICAgICAgIG1BYmlGaWx0ZXJzID0gYWJpRmlsdGVyczsKKworICAgICAgICBpZiAoc3VwcG9ydE1vZGUpIHsKKyAgICAgICAgICAgIEZpbGUgcnMgPSBuZXcgRmlsZShtQnVpbGRUb29sSW5mby5nZXRMb2NhdGlvbigpLCAicmVuZGVyc2NyaXB0Iik7CisgICAgICAgICAgICBtUnNMaWIgPSBuZXcgRmlsZShycywgImxpYiIpOworICAgICAgICAgICAgbUxpYkNsQ29yZSA9IG5ldyBGaWxlKG1Sc0xpYiwgImxpYmNsY29yZS5iYyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUxpYkNsQ29yZSA9IG51bGw7CisgICAgICAgICAgICBtUnNMaWIgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGaWxlIGdldFN1cHBvcnRKYXIoU3RyaW5nIGJ1aWxkVG9vbHNGb2xkZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGJ1aWxkVG9vbHNGb2xkZXIsICJyZW5kZXJzY3JpcHQvbGliLyIgKyBGTl9SRU5ERVJTQ1JJUFRfVjhfSkFSKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0U3VwcG9ydE5hdGl2ZUxpYkZvbGRlcihTdHJpbmcgYnVpbGRUb29sc0ZvbGRlcikgeworICAgICAgICBGaWxlIHJzID0gbmV3IEZpbGUoYnVpbGRUb29sc0ZvbGRlciwgInJlbmRlcnNjcmlwdCIpOworICAgICAgICBGaWxlIGxpYiA9IG5ldyBGaWxlKHJzLCAibGliIik7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShsaWIsICJwYWNrYWdlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJ1aWxkKEBOb25OdWxsIENvbW1hbmRMaW5lUnVubmVyIGxhdW5jaGVyKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgTG9nZ2VkRXJyb3JFeGNlcHRpb24geworCisgICAgICAgIC8vIGdhdGhlciB0aGUgZmlsZXMgdG8gY29tcGlsZQorICAgICAgICBGaWxlR2F0aGVyZXIgZmlsZUdhdGhlcmVyID0gbmV3IEZpbGVHYXRoZXJlcigpOworICAgICAgICBTb3VyY2VTZWFyY2hlciBzZWFyY2hlciA9IG5ldyBTb3VyY2VTZWFyY2hlcihtU291cmNlRm9sZGVycywgInJzIiwgImZzIik7CisgICAgICAgIHNlYXJjaGVyLnNldFVzZUV4ZWN1dG9yKGZhbHNlKTsKKyAgICAgICAgc2VhcmNoZXIuc2VhcmNoKGZpbGVHYXRoZXJlcik7CisKKyAgICAgICAgTGlzdDxGaWxlPiByZW5kZXJzY3JpcHRGaWxlcyA9IGZpbGVHYXRoZXJlci5nZXRGaWxlcygpOworCisgICAgICAgIGlmIChyZW5kZXJzY3JpcHRGaWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdldCB0aGUgZW52IHZhcgorICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudiA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgICAgICBpZiAoU2RrQ29uc3RhbnRzLkNVUlJFTlRfUExBVEZPUk0gPT0gU2RrQ29uc3RhbnRzLlBMQVRGT1JNX0RBUldJTikgeworICAgICAgICAgICAgZW52LnB1dCgiRFlMRF9MSUJSQVJZX1BBVEgiLCBtQnVpbGRUb29sSW5mby5nZXRMb2NhdGlvbigpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChTZGtDb25zdGFudHMuQ1VSUkVOVF9QTEFURk9STSA9PSBTZGtDb25zdGFudHMuUExBVEZPUk1fTElOVVgpIHsKKyAgICAgICAgICAgIGVudi5wdXQoIkxEX0xJQlJBUllfUEFUSCIsIG1CdWlsZFRvb2xJbmZvLmdldExvY2F0aW9uKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgZG9NYWluQ29tcGlsYXRpb24ocmVuZGVyc2NyaXB0RmlsZXMsIGxhdW5jaGVyLCBlbnYpOworCisgICAgICAgIGlmIChtU3VwcG9ydE1vZGUpIHsKKyAgICAgICAgICAgIGNyZWF0ZVN1cHBvcnRGaWxlcyhsYXVuY2hlciwgZW52KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb01haW5Db21waWxhdGlvbigKKyAgICAgICAgICAgIEBOb25OdWxsIExpc3Q8RmlsZT4gaW5wdXRGaWxlcywKKyAgICAgICAgICAgIEBOb25OdWxsIENvbW1hbmRMaW5lUnVubmVyIGxhdW5jaGVyLAorICAgICAgICAgICAgQE5vbk51bGwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnYpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBMb2dnZWRFcnJvckV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHJlbmRlcnNjcmlwdCA9IG1CdWlsZFRvb2xJbmZvLmdldFBhdGgoQnVpbGRUb29sSW5mby5QYXRoSWQuTExWTV9SU19DQyk7CisgICAgICAgIGlmIChyZW5kZXJzY3JpcHQgPT0gbnVsbCB8fCAhbmV3IEZpbGUocmVuZGVyc2NyaXB0KS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihCdWlsZFRvb2xJbmZvLlBhdGhJZC5MTFZNX1JTX0NDICsgIiBpcyBtaXNzaW5nIik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcnNQYXRoID0gbUJ1aWxkVG9vbEluZm8uZ2V0UGF0aChCdWlsZFRvb2xJbmZvLlBhdGhJZC5BTkRST0lEX1JTKTsKKyAgICAgICAgU3RyaW5nIHJzQ2xhbmdQYXRoID0gbUJ1aWxkVG9vbEluZm8uZ2V0UGF0aChCdWlsZFRvb2xJbmZvLlBhdGhJZC5BTkRST0lEX1JTX0NMQU5HKTsKKworICAgICAgICAvLyB0aGUgcmVuZGVyc2NyaXB0IGNvbXBpbGVyIGRvZXNuJ3QgZXhwZWN0IHRoZSB0b3AgcmVzIGZvbGRlciwKKyAgICAgICAgLy8gYnV0IHRoZSByYXcgZm9sZGVyIGRpcmVjdGx5LgorICAgICAgICBGaWxlIHJhd0ZvbGRlciA9IG5ldyBGaWxlKG1SZXNPdXRwdXREaXIsIFNka0NvbnN0YW50cy5GRF9SRVNfUkFXKTsKKworICAgICAgICAvLyBjb21waWxlIGFsbCB0aGUgZmlsZXMgaW4gYSBzaW5nbGUgcGFzcworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBjb21tYW5kID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aEV4cGVjdGVkU2l6ZSgyNik7CisKKyAgICAgICAgY29tbWFuZC5hZGQocmVuZGVyc2NyaXB0KTsKKworICAgICAgICAvLyBEdWUgdG8gYSBkZXZpY2Ugc2lkZSBidWcsIGxldCdzIG5vdCBlbmFibGUgdGhpcyBhdCB0aGlzIHRpbWUuCisvLyAgICAgICAgaWYgKG1EZWJ1Z0J1aWxkKSB7CisvLyAgICAgICAgICAgIGNvbW1hbmQuYWRkKCItZyIpOworLy8gICAgICAgIH0KKworICAgICAgICBjb21tYW5kLmFkZCgiLU8iKTsKKyAgICAgICAgY29tbWFuZC5hZGQoSW50ZWdlci50b1N0cmluZyhtT3B0aW1MZXZlbCkpOworCisgICAgICAgIC8vIGFkZCBhbGwgaW1wb3J0IHBhdGhzCisgICAgICAgIGNvbW1hbmQuYWRkKCItSSIpOworICAgICAgICBjb21tYW5kLmFkZChyc1BhdGgpOworICAgICAgICBjb21tYW5kLmFkZCgiLUkiKTsKKyAgICAgICAgY29tbWFuZC5hZGQocnNDbGFuZ1BhdGgpOworCisgICAgICAgIGZvciAoRmlsZSBpbXBvcnRQYXRoIDogbUltcG9ydEZvbGRlcnMpIHsKKyAgICAgICAgICAgIGlmIChpbXBvcnRQYXRoLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kLmFkZCgiLUkiKTsKKyAgICAgICAgICAgICAgICBjb21tYW5kLmFkZChpbXBvcnRQYXRoLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU3VwcG9ydE1vZGUpIHsKKyAgICAgICAgICAgIGNvbW1hbmQuYWRkKCItcnMtcGFja2FnZS1uYW1lPWFuZHJvaWQuc3VwcG9ydC52OC5yZW5kZXJzY3JpcHQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNvdXJjZSBvdXRwdXQKKyAgICAgICAgY29tbWFuZC5hZGQoIi1wIik7CisgICAgICAgIGNvbW1hbmQuYWRkKG1Tb3VyY2VPdXRwdXREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIGlmIChtTmRrTW9kZSkgeworICAgICAgICAgICAgY29tbWFuZC5hZGQoIi1yZWZsZWN0LWMrKyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVzIG91dHB1dAorICAgICAgICBjb21tYW5kLmFkZCgiLW8iKTsKKyAgICAgICAgY29tbWFuZC5hZGQocmF3Rm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICBjb21tYW5kLmFkZCgiLXRhcmdldC1hcGkiKTsKKyAgICAgICAgaW50IHRhcmdldEFwaSA9IG1UYXJnZXRBcGkgPCAxMSA/IDExIDogbVRhcmdldEFwaTsKKyAgICAgICAgdGFyZ2V0QXBpID0gKG1TdXBwb3J0TW9kZSAmJiB0YXJnZXRBcGkgPCAxOCkgPyAxOCA6IHRhcmdldEFwaTsKKyAgICAgICAgY29tbWFuZC5hZGQoSW50ZWdlci50b1N0cmluZyh0YXJnZXRBcGkpKTsKKworICAgICAgICAvLyBpbnB1dCBmaWxlcworICAgICAgICBmb3IgKEZpbGUgc291cmNlRmlsZSA6IGlucHV0RmlsZXMpIHsKKyAgICAgICAgICAgIGNvbW1hbmQuYWRkKHNvdXJjZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgbGF1bmNoZXIucnVuQ21kTGluZShjb21tYW5kLCBlbnYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTdXBwb3J0RmlsZXMoQE5vbk51bGwgZmluYWwgQ29tbWFuZExpbmVSdW5uZXIgbGF1bmNoZXIsCisgICAgICAgICAgICBATm9uTnVsbCBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIExvZ2dlZEVycm9yRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZ2V0IHRoZSBnZW5lcmF0ZWQgQkMgZmlsZXMuCisgICAgICAgIEZpbGUgcmF3Rm9sZGVyID0gbmV3IEZpbGUobVJlc091dHB1dERpciwgU2RrQ29uc3RhbnRzLkZEX1JFU19SQVcpOworCisgICAgICAgIFNvdXJjZVNlYXJjaGVyIHNlYXJjaGVyID0gbmV3IFNvdXJjZVNlYXJjaGVyKAorICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmF3Rm9sZGVyKSwgRVhUX0JDKTsKKyAgICAgICAgRmlsZUdhdGhlcmVyIGZpbGVHYXRoZXJlciA9IG5ldyBGaWxlR2F0aGVyZXIoKTsKKyAgICAgICAgc2VhcmNoZXIuc2VhcmNoKGZpbGVHYXRoZXJlcik7CisKKyAgICAgICAgV2FpdGFibGVFeGVjdXRvcjxWb2lkPiBtRXhlY3V0b3IgID0gbmV3IFdhaXRhYmxlRXhlY3V0b3I8Vm9pZD4oKTsKKworICAgICAgICBmb3IgKGZpbmFsIEZpbGUgYmNGaWxlIDogZmlsZUdhdGhlcmVyLmdldEZpbGVzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYmNGaWxlLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvYmpOYW1lID0gbmFtZS5yZXBsYWNlQWxsKCJcXC5iYyIsICIubyIpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvTmFtZSA9ICJsaWJycy4iICsgbmFtZS5yZXBsYWNlQWxsKCJcXC5iYyIsICIuc28iKTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBBYmkgYWJpIDogQUJJUykgeworICAgICAgICAgICAgICAgIGlmIChtQWJpRmlsdGVycyAhPSBudWxsICYmICFtQWJpRmlsdGVycy5jb250YWlucyhhYmkubURldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBkZXN0IGZvbGRlcnMgZXhpc3QKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIG9iakFiaUZvbGRlciA9IG5ldyBGaWxlKG1PYmpPdXRwdXREaXIsIGFiaS5tRGV2aWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9iakFiaUZvbGRlci5pc0RpcmVjdG9yeSgpICYmICFvYmpBYmlGb2xkZXIubWtkaXJzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIGRpciAiICsgb2JqQWJpRm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGxpYkFiaUZvbGRlciA9IG5ldyBGaWxlKG1MaWJPdXRwdXREaXIsIGFiaS5tRGV2aWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWxpYkFiaUZvbGRlci5pc0RpcmVjdG9yeSgpICYmICFsaWJBYmlGb2xkZXIubWtkaXJzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIGRpciAiICsgbGliQWJpRm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZShuZXcgQ2FsbGFibGU8Vm9pZD4oKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVm9pZCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIG9iakZpbGUgPSBjcmVhdGVTdXBwb3J0T2JqRmlsZShiY0ZpbGUsIGFiaSwgb2JqTmFtZSwgb2JqQWJpRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXVuY2hlciwgZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN1cHBvcnRMaWJGaWxlKG9iakZpbGUsIGFiaSwgc29OYW1lLCBsaWJBYmlGb2xkZXIsIGxhdW5jaGVyLCBlbnYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1FeGVjdXRvci53YWl0Rm9yVGFza3NXaXRoUXVpY2tGYWlsKHRydWUgLypjYW5jZWxSZW1haW5pbmcqLyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZVN1cHBvcnRPYmpGaWxlKAorICAgICAgICAgICAgQE5vbk51bGwgRmlsZSBiY0ZpbGUsCisgICAgICAgICAgICBATm9uTnVsbCBBYmkgYWJpLAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIG9iak5hbWUsCisgICAgICAgICAgICBATm9uTnVsbCBGaWxlIG9iakFiaUZvbGRlciwKKyAgICAgICAgICAgIEBOb25OdWxsIENvbW1hbmRMaW5lUnVubmVyIGxhdW5jaGVyLAorICAgICAgICAgICAgQE5vbk51bGwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnYpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBMb2dnZWRFcnJvckV4Y2VwdGlvbiB7CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IGFyZ3MgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoRXhwZWN0ZWRTaXplKDEwKTsKKworICAgICAgICBhcmdzLmFkZChtQnVpbGRUb29sSW5mby5nZXRQYXRoKEJ1aWxkVG9vbEluZm8uUGF0aElkLkJDQ19DT01QQVQpKTsKKworICAgICAgICBhcmdzLmFkZCgiLU8iICsgSW50ZWdlci50b1N0cmluZyhtT3B0aW1MZXZlbCkpOworCisgICAgICAgIEZpbGUgb3V0RmlsZSA9IG5ldyBGaWxlKG9iakFiaUZvbGRlciwgb2JqTmFtZSk7CisgICAgICAgIGFyZ3MuYWRkKCItbyIpOworICAgICAgICBhcmdzLmFkZChvdXRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICBhcmdzLmFkZCgiLWZQSUMiKTsKKyAgICAgICAgYXJncy5hZGQoIi1zaGFyZWQiKTsKKworICAgICAgICBhcmdzLmFkZCgiLXJ0LXBhdGgiKTsKKyAgICAgICAgYXJncy5hZGQobUxpYkNsQ29yZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgYXJncy5hZGQoIi1tdHJpcGxlIik7CisgICAgICAgIGFyZ3MuYWRkKGFiaS5tVG9vbGNoYWluKTsKKworICAgICAgICBhcmdzLmFkZChiY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIGxhdW5jaGVyLnJ1bkNtZExpbmUoYXJncywgZW52KTsKKworICAgICAgICByZXR1cm4gb3V0RmlsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlU3VwcG9ydExpYkZpbGUoCisgICAgICAgICAgICBATm9uTnVsbCBGaWxlIG9iakZpbGUsCisgICAgICAgICAgICBATm9uTnVsbCBBYmkgYWJpLAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHNvTmFtZSwKKyAgICAgICAgICAgIEBOb25OdWxsIEZpbGUgbGliQWJpRm9sZGVyLAorICAgICAgICAgICAgQE5vbk51bGwgQ29tbWFuZExpbmVSdW5uZXIgbGF1bmNoZXIsCisgICAgICAgICAgICBATm9uTnVsbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIExvZ2dlZEVycm9yRXhjZXB0aW9uIHsKKworICAgICAgICBGaWxlIGludGVybWVkaWF0ZXNGb2xkZXIgPSBuZXcgRmlsZShtUnNMaWIsICJpbnRlcm1lZGlhdGVzIik7CisgICAgICAgIEZpbGUgaW50ZXJtZWRpYXRlc0FiaUZvbGRlciA9IG5ldyBGaWxlKGludGVybWVkaWF0ZXNGb2xkZXIsIGFiaS5tRGV2aWNlKTsKKyAgICAgICAgRmlsZSBwYWNrYWdlZEZvbGRlciA9IG5ldyBGaWxlKG1Sc0xpYiwgInBhY2thZ2VkIik7CisgICAgICAgIEZpbGUgcGFja2FnZWRBYmlGb2xkZXIgPSBuZXcgRmlsZShwYWNrYWdlZEZvbGRlciwgYWJpLm1EZXZpY2UpOworCisgICAgICAgIExpc3Q8U3RyaW5nPiBhcmdzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aEV4cGVjdGVkU2l6ZSgyNik7CisKKyAgICAgICAgYXJncy5hZGQobUJ1aWxkVG9vbEluZm8uZ2V0UGF0aChhYmkubUxpbmtlcikpOworCisgICAgICAgIGFyZ3MuYWRkKCItLWVoLWZyYW1lLWhkciIpOworICAgICAgICBDb2xsZWN0aW9ucy5hZGRBbGwoYXJncywgYWJpLm1MaW5rZXJBcmdzKTsKKyAgICAgICAgYXJncy5hZGQoIi1zaGFyZWQiKTsKKyAgICAgICAgYXJncy5hZGQoIi1Cc3ltYm9saWMiKTsKKyAgICAgICAgYXJncy5hZGQoIi16Iik7CisgICAgICAgIGFyZ3MuYWRkKCJub2V4ZWNzdGFjayIpOworICAgICAgICBhcmdzLmFkZCgiLXoiKTsKKyAgICAgICAgYXJncy5hZGQoInJlbHJvIik7CisgICAgICAgIGFyZ3MuYWRkKCIteiIpOworICAgICAgICBhcmdzLmFkZCgibm93Iik7CisKKyAgICAgICAgRmlsZSBvdXRGaWxlID0gbmV3IEZpbGUobGliQWJpRm9sZGVyLCBzb05hbWUpOworICAgICAgICBhcmdzLmFkZCgiLW8iKTsKKyAgICAgICAgYXJncy5hZGQob3V0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgYXJncy5hZGQoIi1MIiArIGludGVybWVkaWF0ZXNBYmlGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBhcmdzLmFkZCgiLUwiICsgcGFja2FnZWRBYmlGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIGFyZ3MuYWRkKCItc29uYW1lIik7CisgICAgICAgIGFyZ3MuYWRkKHNvTmFtZSk7CisKKyAgICAgICAgYXJncy5hZGQob2JqRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIGFyZ3MuYWRkKG5ldyBGaWxlKGludGVybWVkaWF0ZXNBYmlGb2xkZXIsICJsaWJjb21waWxlcl9ydC5hIikuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIGFyZ3MuYWRkKCItbFJTU3VwcG9ydCIpOworICAgICAgICBhcmdzLmFkZCgiLWxtIik7CisgICAgICAgIGFyZ3MuYWRkKCItbGMiKTsKKworICAgICAgICBsYXVuY2hlci5ydW5DbWRMaW5lKGFyZ3MsIGVudik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvaW5jcmVtZW50YWwvQ2hhbmdlTWFuYWdlci5qYXZhIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvaW5jcmVtZW50YWwvQ2hhbmdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjM5NWZlLi4wMDAwMDAwCi0tLSBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL2luY3JlbWVudGFsL0NoYW5nZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZGVyLmludGVybmFsLmluY3JlbWVudGFsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuY29tbW9uLnJlczIuRmlsZVN0YXR1czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQ2xhc3MgaGFuZGxpbmcgY2hhbmdlcyBpbiBpbnB1dCBhbmQgb3V0cHV0LgotICoKLSAqIFRoZSBjbGFzcyBzdG9yZXMgdGhlIHN0YXRlIG9mIGlucHV0cy9vdXRwdXRzIGFmdGVyIGEgdGFzayBpcyBydW4sIGFuZCBvbiBzdWJzZXF1ZW50IHJ1bnMgY2FuCi0gKiBjb21wYXJlIHRoaXMgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgZGV0ZWN0IGV4YWN0IGZpbGUgY2hhbmdlcyBpbiB0aGUgaW5wdXRzIG9yIG91dHB1dHMuCi0gKgotICogR3JhZGxlIGFscmVhZHkgZG9lcyB0aGlzIHRvIGZpZ3VyZSBvdXQgaWYgYSB0YXNrIG5lZWRzIHRvIGJlIHJ1biwgYnV0IGRvZXMgbm90IG9mZmVyIHRoaXMKLSAqIGluZm9ybWF0aW9uIHRvIHRoZSB0YXNrLgotICogVGhpcyBzaG91bGQgYmVjb21lIGF2YWlsYWJsZSBpbiB0aGUgR3JhZGxlIHBsdWdpbiBpbiB0aGUgZnV0dXJlLCBidXQgaW4gdGhlIG1lYW50aW1lIHRoaXMKLSAqIHByb3ZpZGVzIHRoZSBzYW1lIGluZm9ybWF0aW9uLCBhbGxvd2luZyB1cyB0byBidWlsZCB0cnVseSBpbmNyZW1lbnRhbCB0YXNrcy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VNYW5hZ2VyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTl9JTlBVVFNfREFUQSA9ICJpbnB1dHMuZGF0YSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZOX09VVFBVVFNfREFUQSA9ICJvdXRwdXRzLmRhdGEiOwotCi0gICAgcHJpdmF0ZSBGaWxlTWFuYWdlciBtSW5wdXRzID0gbmV3IEZpbGVNYW5hZ2VyKCk7Ci0gICAgcHJpdmF0ZSBGaWxlTWFuYWdlciBtT3V0cHV0cyA9IG5ldyBGaWxlTWFuYWdlcigpOwotCi0gICAgcHVibGljIENoYW5nZU1hbmFnZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGtub3duIHN0YXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIGluY3JlbWVudGFsRm9sZGVyIHRoZSBmb2xkZXIgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGluY3JlbWVudGFsIGRhdGEKLSAgICAgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZSBsb2FkaW5nIGZhaWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBsb2FkKEZpbGUgaW5jcmVtZW50YWxGb2xkZXIpIHsKLSAgICAgICAgRmlsZSBpbnB1dHMgPSBuZXcgRmlsZShpbmNyZW1lbnRhbEZvbGRlciwgRk5fSU5QVVRTX0RBVEEpOwotICAgICAgICBGaWxlIG91dHB1dHMgPSBuZXcgRmlsZShpbmNyZW1lbnRhbEZvbGRlciwgRk5fT1VUUFVUU19EQVRBKTsKLSAgICAgICAgcmV0dXJuIGlucHV0cy5leGlzdHMoKSAmJiBvdXRwdXRzLmV4aXN0cygpICYmCi0gICAgICAgICAgICAgICAgbUlucHV0cy5sb2FkKGlucHV0cykgJiYgbU91dHB1dHMubG9hZChvdXRwdXRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGluY3JlbWVudGFsIGRhdGEgdG8gYSBnaXZlbiBmb2xkZXIuCi0gICAgICogQHBhcmFtIGluY3JlbWVudGFsRm9sZGVyIHRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgdG8gd3JpdGUgdG8uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGUoRmlsZSBpbmNyZW1lbnRhbEZvbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpbmNyZW1lbnRhbEZvbGRlci5pc0RpcmVjdG9yeSgpICYmICFpbmNyZW1lbnRhbEZvbGRlci5ta2RpcnMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIGRpcmVjdG9yeSAiICsgaW5jcmVtZW50YWxGb2xkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUlucHV0cy53cml0ZShuZXcgRmlsZShpbmNyZW1lbnRhbEZvbGRlciwgRk5fSU5QVVRTX0RBVEEpKTsKLSAgICAgICAgbU91dHB1dHMud3JpdGUobmV3IEZpbGUoaW5jcmVtZW50YWxGb2xkZXIsIEZOX09VVFBVVFNfREFUQSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZSB0aGUgaW5jcmVtZW50YWwgZGF0YSBmcm9tIHRoZSBnaXZlbiBmb2xkZXIuCi0gICAgICogQHBhcmFtIGluY3JlbWVudGFsRm9sZGVyIHRoZSBmb2xkZXIgdG8gZGVsZXRlIHRoZSBpbmNyZW1lbnRhbCBkYXRhIGZyb20uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIGluY3JlbWVudGFsRm9sZGVyKSB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGluY3JlbWVudGFsRm9sZGVyLCBGTl9JTlBVVFNfREFUQSk7Ci0gICAgICAgIC8vbm9pbnNwZWN0aW9uIFJlc3VsdE9mTWV0aG9kQ2FsbElnbm9yZWQKLSAgICAgICAgZmlsZS5kZWxldGUoKTsKLSAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGluY3JlbWVudGFsRm9sZGVyLCBGTl9PVVRQVVRTX0RBVEEpOwotICAgICAgICAvL25vaW5zcGVjdGlvbiBSZXN1bHRPZk1ldGhvZENhbGxJZ25vcmVkCi0gICAgICAgIGZpbGUuZGVsZXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuIGlucHV0IGZpbGUgb3IgZm9sZGVyLgotICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KEZpbGUgZmlsZSkgewotICAgICAgICBtSW5wdXRzLmFkZEZpbGUoZmlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBvdXRwdXQgZmlsZSBvciBmb2xkZXIKLSAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRPdXRwdXQoRmlsZSBmaWxlKSB7Ci0gICAgICAgIG1PdXRwdXRzLmFkZEZpbGUoZmlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IG9mIGNoYW5nZWQgaW5wdXRzLiBFbXB0eSBsaXN0IG1lYW5zIG5vIGlucHV0IGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbWFwIG9mIChGaWxlLCBGaWxlU3RhdHVzKSBmb3IgYWxsIGNoYW5nZWQgaW5wdXQuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWFwPEZpbGUsIEZpbGVTdGF0dXM+IGdldENoYW5nZWRJbnB1dHMoKSB7Ci0gICAgICAgIHJldHVybiBtSW5wdXRzLmdldENoYW5nZWRGaWxlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGNoYW5nZWQgb3V0cHV0LiBFbXB0eSBsaXN0IG1lYW5zIG5vIG91dHB1dCBjaGFuZ2VzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIG1hcCBvZiAoZmlsZSwgc3RhdHVzKSBmb3IgYWxsIGNoYW5nZWQgb3V0cHV0IGZpbGVzLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1hcDxGaWxlLCBGaWxlU3RhdHVzPiBnZXRDaGFuZ2VkT3V0cHV0cygpIHsKLSAgICAgICAgcmV0dXJuIG1PdXRwdXRzLmdldENoYW5nZWRGaWxlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgb3V0cHV0cyBiZWZvcmUgd3JpdGluZyB0aGUgZmlsZSBzdGF0ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVPdXRwdXRzKENvbGxlY3Rpb248RmlsZT4gb3V0cHV0cykgewotICAgICAgICBtT3V0cHV0cy51cGRhdGUob3V0cHV0cyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvaW5jcmVtZW50YWwvRGVwZW5kZW5jeURhdGEuamF2YSBiL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL2luY3JlbWVudGFsL0RlcGVuZGVuY3lEYXRhLmphdmEKaW5kZXggMjIwMzVmZC4uNTc1ZTUwYyAxMDA2NDQKLS0tIGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvaW5jcmVtZW50YWwvRGVwZW5kZW5jeURhdGEuamF2YQorKysgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9pbmNyZW1lbnRhbC9EZXBlbmRlbmN5RGF0YS5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkZXIuaW50ZXJuYWwuaW5jcmVtZW50YWw7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKQEAgLTc0LDYgKzc1LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBkZXBlbmRlbmN5RmlsZSB0aGUgZGVwZW5kZW5jeSBmaWxlCiAgICAgICovCisgICAgQE51bGxhYmxlCiAgICAgcHVibGljIHN0YXRpYyBEZXBlbmRlbmN5RGF0YSBwYXJzZURlcGVuZGVuY3lGaWxlKEBOb25OdWxsIEZpbGUgZGVwZW5kZW5jeUZpbGUpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiB0aGUgZGVwZW5kZW5jeSBmaWxlIGlzIGhlcmUuCkBAIC05MSw2ICs5Myw3IEBACiAgICAgfQogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgQE51bGxhYmxlCiAgICAgc3RhdGljIERlcGVuZGVuY3lEYXRhIHByb2Nlc3NEZXBlbmRlbmN5RGF0YShATm9uTnVsbCBMaXN0PFN0cmluZz4gY29udGVudCkgewogICAgICAgICAvLyBUaGUgZm9ybWF0IGlzIHRlY2huaWNhbGx5OgogICAgICAgICAvLyBvdXRwdXQxIG91dHB1dDIgWy4uLl06IGRlcDEgZGVwMiBbLi4uXQpAQCAtMTQyLDYgKzE0NSwxMCBAQAogICAgICAgICAgICAgcGFyc2VNb2RlID0gbmV4dE1vZGU7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoZGF0YS5nZXRNYWluRmlsZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgfQogCmRpZmYgLS1naXQgYS9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9pbmNyZW1lbnRhbC9GaWxlRW50aXR5LmphdmEgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9pbmNyZW1lbnRhbC9GaWxlRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODFkOGUuLjAwMDAwMDAKLS0tIGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvaW5jcmVtZW50YWwvRmlsZUVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkZXIuaW50ZXJuYWwuaW5jcmVtZW50YWw7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5oYXNoLkhhc2hDb2RlOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmhhc2guSGFzaGluZzsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5CeXRlU3RyZWFtczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5GaWxlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBBIHtAbGluayBGaWxlfSBhbmQgaXRzIGFzc29jaWF0ZWQgZGF0YSBuZWVkZWQgdG8gZmlndXJlIG91dCBpZiBhIGZpbGUgY2hhbmdlZCBvciBub3QuCi0gKi8KLWNsYXNzIEZpbGVFbnRpdHkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIHNCdWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKLQotICAgIHByaXZhdGUgZmluYWwgRmlsZSBtRmlsZTsKLSAgICBwcml2YXRlIGZpbmFsIGxvbmcgbUxhc3RNb2RpZmllZDsKLSAgICBwcml2YXRlIGxvbmcgbUxlbmd0aDsKLSAgICBwcml2YXRlIFN0cmluZyBtU2hhMTsKLQotICAgIC8qKgotICAgICAqIEV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIGZhaWx1cmUgdG8gY2hlY2sgYSBqYXIgZmlsZSdzIGNvbnRlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2hhMUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgICAgICBwcml2YXRlIGZpbmFsIEZpbGUgZmlsZTsKLQotICAgICAgICBwdWJsaWMgU2hhMUV4Y2VwdGlvbihGaWxlIGphckZpbGUsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgICAgICAgICAgZmlsZSA9IGphckZpbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRmlsZSBnZXRKYXJGaWxlKCkgewotICAgICAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVudGl0eSBmcm9tIGNhY2hlZCBkYXRhLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUKLSAgICAgKiBAcGFyYW0gbGFzdE1vZGlmaWVkIHdoZW4gaXQgd2FzIGxhc3QgbW9kaWZpZWQKLSAgICAgKiBAcGFyYW0gbGVuZ3RoIGl0cyBsZW5ndGgKLSAgICAgKiBAcGFyYW0gc2hhMSBpdHMgc2hhMQotICAgICAqLwotICAgIEZpbGVFbnRpdHkoRmlsZSBmaWxlLCBsb25nIGxhc3RNb2RpZmllZCwgbG9uZyBsZW5ndGgsIFN0cmluZyBzaGExKSB7Ci0gICAgICAgIG1GaWxlID0gZmlsZTsKLSAgICAgICAgbUxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKLSAgICAgICAgbUxlbmd0aCA9IGxlbmd0aDsKLSAgICAgICAgbVNoYTEgPSBzaGExOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZW50aXR5IGZyb20gYSB7QGxpbmsgRmlsZX0uCi0gICAgICoKLSAgICAgKiBUaGUgc2hhMSBpcyBub3QgY29tcHV0ZWQgeWV0LCBpdCdsbCBiZSBkb25lIG9uIGRlbWFuZCB3aGVuIHtAbGluayAjZ2V0U2hhMSgpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZS4KLSAgICAgKi8KLSAgICBGaWxlRW50aXR5KEZpbGUgZmlsZSkgewotICAgICAgICBtRmlsZSA9IGZpbGU7Ci0gICAgICAgIG1MYXN0TW9kaWZpZWQgPSBmaWxlLmxhc3RNb2RpZmllZCgpOwotICAgICAgICBtTGVuZ3RoID0gZmlsZS5sZW5ndGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlJ3MgbGFzdCBtb2RpZmllZCBpbmZvLgotICAgICAqIEByZXR1cm4gdGhlIGZpbGUncyBsYXN0IG1vZGlmaWVkIGluZm8uCi0gICAgICovCi0gICAgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7Ci0gICAgICAgIHJldHVybiBtTGFzdE1vZGlmaWVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZmlsZSBsZW5ndGguCi0gICAgICogQHJldHVybiB0aGUgZmlsZSBsZW5ndGguCi0gICAgICovCi0gICAgbG9uZyBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiBtTGVuZ3RoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGUgdGhpcyBlbnRpdHkgcmVwcmVzZW50cy4KLSAgICAgKiBAcmV0dXJuIHRoZSBmaWxlLgotICAgICAqLwotICAgIEZpbGUgZ2V0RmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1GaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGUncyBzaGExLCBjb21wdXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZmhhMSBvciBudWxsIGlmIGl0IGNvdWxkbid0IGJlIGNvbXB1dGVkLgotICAgICAqLwotICAgIFN0cmluZyBnZXRTaGExKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVBbmRSZXR1cm5TaGExKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNoYTFFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUge0BsaW5rIEZpbGUjbGFzdE1vZGlmaWVkKCl9IG1hdGNoZXMgdGhlIGNhY2hlZCB2YWx1ZS4gSWYgbm90LCBsZW5ndGgKLSAgICAgKiBpcyB1cGRhdGVkIGFuZCB0aGUgc2hhMSBpcyByZXNldCAoYnV0IG5vdCByZWNvbXB1dGVkLCB0aGlzIGlzIGRvbmUgb24gZGVtYW5kKS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcmV0dXJuIHdoZXRoZXIgdGhlIGZpbGUgd2FzIGNoYW5nZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrVmFsaWRpdHkoKSB7Ci0gICAgICAgIGlmIChtTGFzdE1vZGlmaWVkICE9IG1GaWxlLmxhc3RNb2RpZmllZCgpKSB7Ci0gICAgICAgICAgICBtTGVuZ3RoID0gbUZpbGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICBtU2hhMSA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHR3byBlbnRpdHkgYXJlIGRpZmZlcmVudCBmaWxlcy4KLSAgICAgKgotICAgICAqIFRoaXMgd2lsbCBjb21wdXRlIHRoZSBmaWxlcycgc2hhMSBpZiB0aGV5IGFyZSBub3QgeWV0IGNvbXB1dGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVFbnRpdHkgdGhlIGZpbGUgdG8gY29tcGFyZSB0by4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbGVzIGFyZSB0aGUgc2FtZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGlmZmVyZW50VGhhbihGaWxlRW50aXR5IGZpbGVFbnRpdHkpIHsKLSAgICAgICAgYXNzZXJ0IGZpbGVFbnRpdHkubUZpbGUuZXF1YWxzKG1GaWxlKTsKLQotICAgICAgICAvLyBzYW1lIGRhdGUsIHNhbWUgZmlsZXMuCi0gICAgICAgIGlmIChtTGFzdE1vZGlmaWVkID09IGZpbGVFbnRpdHkubUxhc3RNb2RpZmllZCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGRpZmZlcmVudCBkYXRlIGRvZXNuJ3QgbmVjZXNzYXJpbHkgbWVhbiBkaWZmZXJlbnQgZmlsZS4KLSAgICAgICAgICAgIC8vIHN0YXJ0IHdpdGggc2l6ZSwgbGVzcyBjb21wdXRpbmcgaW50ZW5zaXZlIHRoYW4gc2hhMS4KLSAgICAgICAgICAgIHJldHVybiBtTGVuZ3RoICE9IGZpbGVFbnRpdHkubUxlbmd0aCB8fAotICAgICAgICAgICAgICAgICAgICAhY29tcHV0ZUFuZFJldHVyblNoYTEoKS5lcXVhbHMoZmlsZUVudGl0eS5jb21wdXRlQW5kUmV0dXJuU2hhMSgpKTsKLSAgICAgICAgfSBjYXRjaCAoU2hhMUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBjYW4ndCBjb21wdXRlIHRoZSBzaGExLCB3ZSBjb25zaWRlciB0aGUgZmlsZXMgZGlmZmVyZW50LgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlJ3Mgc2hhMSwgY29tcHV0aW5nIGl0IGlmIG5lY2Vzc2FyeS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHNoYTEKLSAgICAgKiBAdGhyb3dzIFNoYTFFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjb21wdXRlQW5kUmV0dXJuU2hhMSgpIHRocm93cyBTaGExRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1TaGExID09IG51bGwpIHsKLSAgICAgICAgICAgIG1TaGExID0gZ2V0U2hhMShtRmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1TaGExOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGVzIHRoZSBzaGExIG9mIGEgZmlsZSBhbmQgcmV0dXJucyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmIHRoZSBmaWxlIHRvIGNvbXB1dGUgdGhlIHNoYTEgZm9yLgotICAgICAqIEByZXR1cm4gdGhlIHNoYTEgdmFsdWUKLSAgICAgKiBAdGhyb3dzIFNoYTFFeGNlcHRpb24gaWYgdGhlIHNoYTEgdmFsdWUgY2Fubm90IGJlIGNvbXB1dGVkLgotICAgICAqLwotICAgIHN0YXRpYyBTdHJpbmcgZ2V0U2hhMShGaWxlIGYpIHRocm93cyBTaGExRXhjZXB0aW9uIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzQnVmZmVyKSB7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSGFzaENvZGUgdmFsdWUgPSBCeXRlU3RyZWFtcy5oYXNoKEZpbGVzLm5ld0lucHV0U3RyZWFtU3VwcGxpZXIoZiksIEhhc2hpbmcuc2hhMSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNoYTFFeGNlcHRpb24oZiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkZpbGVFbnRpdHl7IiArCi0gICAgICAgICAgICAgICAgIm1GaWxlPSIgKyBtRmlsZSArCi0gICAgICAgICAgICAgICAgIiwgbUxhc3RNb2RpZmllZD0iICsgbUxhc3RNb2RpZmllZCArCi0gICAgICAgICAgICAgICAgIiwgbUxlbmd0aD0iICsgbUxlbmd0aCArCi0gICAgICAgICAgICAgICAgIiwgbVNoYTE9JyIgKyBtU2hhMSArICdcJycgKwotICAgICAgICAgICAgICAgICd9JzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9pbmNyZW1lbnRhbC9GaWxlTWFuYWdlci5qYXZhIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvaW5jcmVtZW50YWwvRmlsZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQwOGMyNi4uMDAwMDAwMAotLS0gYS9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9pbmNyZW1lbnRhbC9GaWxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkZXIuaW50ZXJuYWwuaW5jcmVtZW50YWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5jb21tb24ucmVzMi5GaWxlU3RhdHVzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkNsb3NlYWJsZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBDbGFzcyBoYW5kbGluZyBjaGFuZ2VzIGluIGEgc2V0IG9mIGZpbGVzLgotICoKLSAqIFRoZSBjbGFzcyBjYW4gc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBmaWxlcywgYW5kIGxhdGVyIHJlbG9hZCBpdCBhbmQgY29tcGFyZSBpdCB0byB0aGUKLSAqIHByZXZpb3VzIGtub3duIHN0YXRlLgotICoKLSAqLwotY2xhc3MgRmlsZU1hbmFnZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBSRUFEX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiXihcXGQrKVxccysoXFxkKylcXHMrKFswLTlhLWZdKylcXHMrKC4rKSQiKTsKLQotICAgIHByaXZhdGUgTWFwPEZpbGUsIEZpbGVFbnRpdHk+IG1Mb2FkZWRGaWxlcyA9IE1hcHMubmV3SGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwPEZpbGUsIEZpbGVFbnRpdHk+IG1Qcm9jZXNzZWRGaWxlcyA9IE1hcHMubmV3SGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwPEZpbGUsIEZpbGVTdGF0dXM+IG1SZXN1bHRzID0gTWFwcy5uZXdIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXA8RmlsZSwgRmlsZVN0YXR1cz4gbVJldHVybmVkTWFwID0gbnVsbDsKLQotICAgIHB1YmxpYyBGaWxlTWFuYWdlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUga25vd24gc3RhdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhdGVGaWxlIHRoZSBmaWxlIHRvIGxvYWQgdGhlIHN0YXRlIGZyb20uCi0gICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgbG9hZGluZyBmYWlsZWQuCi0gICAgICoKLSAgICAgKiBAc2VlICN3cml0ZShqYXZhLmlvLkZpbGUpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbG9hZChGaWxlIHN0YXRlRmlsZSkgewotICAgICAgICBpZiAoIXN0YXRlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0oc3RhdGVGaWxlKSwgQ2hhcnNldHMuVVRGXzgpKTsKLQotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOwotICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBza2lwIGNvbW1lbnRzCi0gICAgICAgICAgICAgICAgaWYgKGxpbmUuY2hhckF0KDApID09ICcjJykgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGRhdGEgd2l0aCBhIHJlZ2V4cAotICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IFJFQURfUEFUVEVSTi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG0uZ3JvdXAoNCk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOwotCi0gICAgICAgICAgICAgICAgICAgIEZpbGVFbnRpdHkgZW50aXR5ID0gbmV3IEZpbGVFbnRpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLnBhcnNlTG9uZyhtLmdyb3VwKDEpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLnBhcnNlTG9uZyhtLmdyb3VwKDIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmdyb3VwKDMpKTsKLQotICAgICAgICAgICAgICAgICAgICBtTG9hZGVkRmlsZXMucHV0KGYsIGVudGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgIC8vIHdvbid0IGhhcHBlbiwgd2UgY2hlY2sgdXAgZnJvbnQuCi0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbiwgYnV0IGlmIGl0IGRvZXMsIHdlIGp1c3Qgd29uJ3QgaGF2ZSBhIGNhY2hlLgotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgaWYgaXQgZG9lcywgd2UganVzdCB3b24ndCBoYXZlIGEgY2FjaGUuCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBDbG9zZWFibGVzLmNsb3NlUXVpZXRseShyZWFkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgc3RhdGUgdG8gYSBmaWxlCi0gICAgICogQHBhcmFtIHN0YXRlRmlsZSB0aGUgZmlsZSB0byB3cml0ZSB0aGUgc3RhdGUgdG8uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKiBAc2VlICNsb2FkKGphdmEuaW8uRmlsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShGaWxlIHN0YXRlRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCBtYWtlIHN1cmUgdGhlIGZvbGRlcnMgZXhpc3QhCi0gICAgICAgICAgICBGaWxlIHBhcmVudEZvbGRlciA9IHN0YXRlRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICBpZiAoIXBhcmVudEZvbGRlci5pc0RpcmVjdG9yeSgpICYmICFwYXJlbnRGb2xkZXIubWtkaXJzKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5ICIgKyBwYXJlbnRGb2xkZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0aGVuIHdyaXRlIHRoZSBmaWxlLgotICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShzdGF0ZUZpbGUpLCBDaGFyc2V0cy5VVEZfOCk7Ci0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIyBpbmNyZW1lbnRhbCBkYXRhLiBETyBOT1QgRURJVC5cbiIpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIjIGZvcm1hdCBpcyA8bGFzdE1vZGlmaWVkPiA8bGVuZ3RoPiA8U0hBLTE+IDxwYXRoPlxuIik7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoIiMgRW5jb2RpbmcgaXMgVVRGLThcbiIpOwotCi0gICAgICAgICAgICBmb3IgKEZpbGVFbnRpdHkgZW50aXR5IDogbVByb2Nlc3NlZEZpbGVzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNoYTEgPSBlbnRpdHkuZ2V0U2hhMSgpOwotICAgICAgICAgICAgICAgIGlmIChzaGExID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2hhMSA9ICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IjsgLy8gVE9ETzogZmluZCBhIGJldHRlciB3YXkgdG8gZGV0ZWN0IG1pc3Npbmcgc2hhMQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShTdHJpbmcuZm9ybWF0KCIlZCAlZCAlcyAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS5nZXRMYXN0TW9kaWZpZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS5nZXRMZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoYTEsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkuZ2V0RmlsZSgpLmdldEFic29sdXRlUGF0aCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBDbG9zZWFibGVzLmNsb3NlUXVpZXRseSh3cml0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAvKioKLSAgICAgKiBBZGQgYW4gaW5wdXQgZmlsZSBvciBmb2xkZXIuCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZShGaWxlIGZpbGUpIHsKLSAgICAgICAgcHJvY2Vzc0ZpbGUoZmlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IG9mIGNoYW5nZWQgaW5wdXRzLiBFbXB0eSBsaXN0IG1lYW5zIG5vIGlucHV0IGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbWFwIG9mIChGaWxlLCBGaWxlU3RhdHVzKSBmb3IgYWxsIGNoYW5nZWQgaW5wdXQuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWFwPEZpbGUsIEZpbGVTdGF0dXM+IGdldENoYW5nZWRGaWxlcygpIHsKLSAgICAgICAgaWYgKG1SZXR1cm5lZE1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSBtYXAgd2l0aCB0aGUgY29udGVudCBvZiB0aGUgcmVzdWx0IG1hcC4KLSAgICAgICAgICAgIG1SZXR1cm5lZE1hcCA9IE1hcHMubmV3SGFzaE1hcChtUmVzdWx0cyk7Ci0KLSAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZmlsZXMgdGhhdCBuZWVkZWQgcHJvY2Vzc2luZyBoYXZlIGJlZW4gcHJvY2Vzc2VkLAotICAgICAgICAgICAgLy8gYnV0IHRoZXJlIG1heSBiZSByZW1vdmVkIGZpbGVzIHJlbWFpbmluZyBpbiB0aGUgbG9hZGVkIGZpbGUgbWFwLgotICAgICAgICAgICAgZm9yIChGaWxlIGYgOiBtTG9hZGVkRmlsZXMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBtUmV0dXJuZWRNYXAucHV0KGYsIEZpbGVTdGF0dXMuUkVNT1ZFRCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdyYXAgdGhpcwotICAgICAgICAgICAgbVJldHVybmVkTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG1SZXR1cm5lZE1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVJldHVybmVkTWFwOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmlsZShGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKGZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS5zdGFydHNXaXRoKCIuIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgRmlsZUVudGl0eSBmb3IgdGhlIG5ldyg/KSB2ZXJzaW9uLgotICAgICAgICAgICAgRmlsZUVudGl0eSBuZXdGaWxlRW50aXR5ID0gbmV3IEZpbGVFbnRpdHkoZmlsZSk7Ci0KLSAgICAgICAgICAgIC8vIHNlZSBpZiBpdCBleGlzdGVkIGJlZm9yZS4KLSAgICAgICAgICAgIEZpbGVFbnRpdHkgZmlsZUVudGl0eSA9IG1Mb2FkZWRGaWxlcy5nZXQoZmlsZSk7Ci0KLSAgICAgICAgICAgIGlmIChmaWxlRW50aXR5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBuZXcgZmlsZSEKLSAgICAgICAgICAgICAgICBtUmVzdWx0cy5wdXQoZmlsZSwgRmlsZVN0YXR1cy5ORVcpOwotCi0gICAgICAgICAgICAgICAgLy8gYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHByb2Nlc3NlZCBmaWxlcwotICAgICAgICAgICAgICAgIG1Qcm9jZXNzZWRGaWxlcy5wdXQoZmlsZSwgbmV3RmlsZUVudGl0eSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpdCBmcm9tIHRoZSBsb2FkZWQgZmlsZXMuCi0gICAgICAgICAgICAgICAgbUxvYWRlZEZpbGVzLnJlbW92ZShmaWxlKTsKLQotICAgICAgICAgICAgICAgIGlmIChuZXdGaWxlRW50aXR5LmlzRGlmZmVyZW50VGhhbihmaWxlRW50aXR5KSkgewotICAgICAgICAgICAgICAgICAgICBtUmVzdWx0cy5wdXQoZmlsZSwgRmlsZVN0YXR1cy5DSEFOR0VEKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBwdXQgdGhlIG5ld0ZpbGVFbnRpdHkgaW4gdGhlIHByb2Nlc3NlZCBmaWxlcy4KLSAgICAgICAgICAgICAgICAgICAgbVByb2Nlc3NlZEZpbGVzLnB1dChmaWxlLCBuZXdGaWxlRW50aXR5KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IG1vdmUgdGhlIG9yaWdpbmFsIGVudGl0eSBzbyBhdm9pZCByZWNvbXB1dGluZyB0aGUgc2hhMS4KLSAgICAgICAgICAgICAgICAgICAgLy8gRmlsZUVudGl0eS5pc0RpZmZlcmVudFRoYW4gZG9lc24ndCBuZWNlc3NhcmlseSBjb21wdXRlIGl0LgotICAgICAgICAgICAgICAgICAgIG1Qcm9jZXNzZWRGaWxlcy5wdXQoZmlsZSwgZmlsZUVudGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLSAgICAgICAgICAgIGlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKEZpbGUgZiA6IGZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKGYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBleGlzdGluZyBmaWxlcyB3aXRoIHRoZSBnaXZlbiBmaWxlcy9mb2xkZXJzLgotICAgICAqIEBwYXJhbSBmaWxlcyB0aGUgbmV3IGZvbGRlcnMvZmlsZXMgdG8gcHJvY2Vzcy4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZShDb2xsZWN0aW9uPEZpbGU+IGZpbGVzKSB7Ci0gICAgICAgIG1Mb2FkZWRGaWxlcy5jbGVhcigpOwotICAgICAgICBtTG9hZGVkRmlsZXMucHV0QWxsKG1Qcm9jZXNzZWRGaWxlcyk7Ci0gICAgICAgIG1SZXN1bHRzLmNsZWFyKCk7Ci0gICAgICAgIG1Qcm9jZXNzZWRGaWxlcy5jbGVhcigpOwotICAgICAgICBmb3IgKEZpbGUgZiA6IGZpbGVzKSB7Ci0gICAgICAgICAgICBwcm9jZXNzRmlsZShmKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL3BhY2thZ2luZy9QYWNrYWdlci5qYXZhIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvcGFja2FnaW5nL1BhY2thZ2VyLmphdmEKaW5kZXggNDQ1ZDYwNy4uOGMzNzBkMCAxMDA2NDQKLS0tIGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvcGFja2FnaW5nL1BhY2thZ2VyLmphdmEKKysrIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvaW50ZXJuYWwvcGFja2FnaW5nL1BhY2thZ2VyLmphdmEKQEAgLTM5LDYgKzM5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOwogaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CkBAIC00MDIsNyArNDAzLDcgQEAKICAgICAgKgogICAgICAqIFRoaXMgbWF5IG9yIG1heSBub3QgY29weSBnZGJzZXJ2ZXIgaW50byB0aGUgYXBrIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGRlYnVnIG1vZGUgaXMgc2V0LgogICAgICAqCi0gICAgICogQHBhcmFtIGpuaUxpYkxvY2F0aW9uIHRoZSByb290IGZvbGRlciBjb250YWluaW5nIHRoZSBhYmkgZm9sZGVycyB3aGljaCBjb250YWluIHRoZSAuc28KKyAgICAgKiBAcGFyYW0gbmF0aXZlRm9sZGVyIHRoZSByb290IGZvbGRlciBjb250YWluaW5nIHRoZSBhYmkgZm9sZGVycyB3aGljaCBjb250YWluIHRoZSAuc28KICAgICAgKgogICAgICAqIEB0aHJvd3MgUGFja2FnZXJFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQKICAgICAgKiBAdGhyb3dzIFNlYWxlZFBhY2thZ2VFeGNlcHRpb24gaWYgdGhlIEFQSyBpcyBhbHJlYWR5IHNlYWxlZC4KQEAgLTQxMSwxNCArNDEyLDEyIEBACiAgICAgICoKICAgICAgKiBAc2VlICNzZXRKbmlEZWJ1Z01vZGUoYm9vbGVhbikKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGROYXRpdmVMaWJyYXJpZXMoU3RyaW5nIGpuaUxpYkxvY2F0aW9uKQorICAgIHB1YmxpYyB2b2lkIGFkZE5hdGl2ZUxpYnJhcmllcyhATm9uTnVsbCBGaWxlIG5hdGl2ZUZvbGRlciwgQE51bGxhYmxlIFNldDxTdHJpbmc+IGFiaUZpbHRlcnMpCiAgICAgICAgICAgICB0aHJvd3MgUGFja2FnZXJFeGNlcHRpb24sIFNlYWxlZFBhY2thZ2VFeGNlcHRpb24sIER1cGxpY2F0ZUZpbGVFeGNlcHRpb24gewogICAgICAgICBpZiAobUlzU2VhbGVkKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgU2VhbGVkUGFja2FnZUV4Y2VwdGlvbigiQVBLIGlzIGFscmVhZHkgc2VhbGVkIik7CiAgICAgICAgIH0KIAotICAgICAgICBGaWxlIG5hdGl2ZUZvbGRlciA9IG5ldyBGaWxlKGpuaUxpYkxvY2F0aW9uKTsKLQogICAgICAgICBpZiAoIW5hdGl2ZUZvbGRlci5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3Rvcnk/IGNoZWNrIGlmIGl0J3MgYSBmaWxlIG9yIGRvZXNuJ3QgZXhpc3QKICAgICAgICAgICAgIGlmIChuYXRpdmVGb2xkZXIuZXhpc3RzKCkpIHsKQEAgLTQzNCw2ICs0MzMsMTAgQEAKIAogICAgICAgICBpZiAoYWJpTGlzdCAhPSBudWxsKSB7CiAgICAgICAgICAgICBmb3IgKEZpbGUgYWJpIDogYWJpTGlzdCkgeworICAgICAgICAgICAgICAgIGlmIChhYmlGaWx0ZXJzICE9IG51bGwgJiYgIWFiaUZpbHRlcnMuY29udGFpbnMoYWJpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaWYgKGFiaS5pc0RpcmVjdG9yeSgpKSB7IC8vIGlnbm9yZSBmaWxlcwogCiAgICAgICAgICAgICAgICAgICAgIEZpbGVbXSBsaWJzID0gYWJpLmxpc3RGaWxlcygpOwpAQCAtNDQxLDE0ICs0NDQsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRmlsZSBsaWIgOiBsaWJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBjb25zaWRlciBmaWxlcyB0aGF0IGFyZSAuc28gb3IsIGlmIGluIGRlYnVnIG1vZGUsIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgZ2Ric2VydmVyIGV4ZWN1dGFibGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpYk5hbWUgPSBsaWIuZ2V0TmFtZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaWIuaXNGaWxlKCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQQVRURVJOX05BVElWRUxJQl9FWFQubWF0Y2hlcihsaWIuZ2V0TmFtZSgpKS5tYXRjaGVzKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1KbmlEZWJ1Z01vZGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZGtDb25zdGFudHMuRk5fR0RCU0VSVkVSLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYi5nZXROYW1lKCkpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUpuaURlYnVnTW9kZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2RrQ29uc3RhbnRzLkZOX0dEQlNFUlZFUi5lcXVhbHMobGliTmFtZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNka0NvbnN0YW50cy5GTl9HREJfU0VUVVAuZXF1YWxzKGxpYk5hbWUpKSkpKSB7CisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2RrQ29uc3RhbnRzLkZEX0FQS19OQVRJVkVfTElCUyArICIvIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYmkuZ2V0TmFtZSgpICsgIi8iICsgbGliLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiaS5nZXROYW1lKCkgKyAiLyIgKyBsaWJOYW1lOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0FkZEZpbGUobGliLCBwYXRoKTsKZGlmZiAtLWdpdCBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL3Rlc3RpbmcvQ29ubmVjdGVkRGV2aWNlLmphdmEgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci90ZXN0aW5nL0Nvbm5lY3RlZERldmljZS5qYXZhCmluZGV4IDhhMWFhNjQuLjdlNmFlNzcgMTAwNjQ0Ci0tLSBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL3Rlc3RpbmcvQ29ubmVjdGVkRGV2aWNlLmphdmEKKysrIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvdGVzdGluZy9Db25uZWN0ZWREZXZpY2UuamF2YQpAQCAtMjUsOSArMjUsMTEgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuU2hlbGxDb21tYW5kVW5yZXNwb25zaXZlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5UaW1lb3V0RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLnV0aWxzLklMb2dnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCiAvKioKQEAgLTExNSw4ICsxMTcsMTkgQEAKIAogICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRBYmkoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBpbXBsZW1lbnRlZCBtZXRob2RzIHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEFiaXMoKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBhYmlzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aEV4cGVjdGVkU2l6ZSgyKTsKKyAgICAgICAgU3RyaW5nIGFiaSA9IGlEZXZpY2UuZ2V0UHJvcGVydHkoSURldmljZS5QUk9QX0RFVklDRV9DUFVfQUJJKTsKKyAgICAgICAgaWYgKGFiaSAhPSBudWxsKSB7CisgICAgICAgICAgICBhYmlzLmFkZChhYmkpOworICAgICAgICB9CisKKyAgICAgICAgYWJpID0gaURldmljZS5nZXRQcm9wZXJ0eShJRGV2aWNlLlBST1BfREVWSUNFX0NQVV9BQkkyKTsKKyAgICAgICAgaWYgKGFiaSAhPSBudWxsKSB7CisgICAgICAgICAgICBhYmlzLmFkZChhYmkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFiaXM7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci90ZXN0aW5nL1NpbXBsZVRlc3RSdW5uZXIuamF2YSBiL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL3Rlc3RpbmcvU2ltcGxlVGVzdFJ1bm5lci5qYXZhCmluZGV4IDg1MTE0ZDQuLjIzN2Q4NzEgMTAwNjQ0Ci0tLSBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL3Rlc3RpbmcvU2ltcGxlVGVzdFJ1bm5lci5qYXZhCisrKyBiL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL3Rlc3RpbmcvU2ltcGxlVGVzdFJ1bm5lci5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCiAgKiBCYXNpYyB7QGxpbmsgVGVzdFJ1bm5lcn0gcnVubmluZyB0ZXN0cyBvbiBhbGwgZGV2aWNlcy4KQEAgLTQ3LDIxICs0OCwxMSBAQAogCiAgICAgICAgIFdhaXRhYmxlRXhlY3V0b3I8Qm9vbGVhbj4gZXhlY3V0b3IgPSBuZXcgV2FpdGFibGVFeGVjdXRvcjxCb29sZWFuPihtYXhUaHJlYWRzKTsKIAotICAgICAgICBpbnQgbWluU2RrVmVyc2lvbiA9IHRlc3REYXRhLmdldE1pblNka1ZlcnNpb24oKTsKICAgICAgICAgZm9yIChEZXZpY2VDb25uZWN0b3IgZGV2aWNlIDogZGV2aWNlTGlzdCkgewotICAgICAgICAgICAgaW50IGRldmljZUFwaUxldmVsID0gZGV2aWNlLmdldEFwaUxldmVsKCk7Ci0gICAgICAgICAgICBpZiAobWluU2RrVmVyc2lvbiA8PSBkZXZpY2VBcGlMZXZlbCkgeworICAgICAgICAgICAgaWYgKGZpbHRlck91dERldmljZShkZXZpY2UsIHRlc3REYXRhLCBsb2dnZXIsIHByb2plY3ROYW1lLCB2YXJpYW50TmFtZSkpIHsKICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKG5ldyBTaW1wbGVUZXN0Q2FsbGFibGUoZGV2aWNlLCBwcm9qZWN0TmFtZSwgdmFyaWFudE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0QXBrLCB0ZXN0ZWRBcGssIHRlc3REYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c0RpciwgdGltZW91dCwgbG9nZ2VyKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VBcGlMZXZlbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTa2lwcGluZyBkZXZpY2UgJyVzJyBmb3IgJyVzOiVzJzogVW5rbm93biBBUEkgTGV2ZWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXROYW1lKCksIHByb2plY3ROYW1lLCB2YXJpYW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlNraXBwaW5nIGRldmljZSAnJXMnIGZvciAnJXM6JXMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0TmFtZSgpLCBwcm9qZWN0TmFtZSwgdmFyaWFudE5hbWUpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC04Miw0ICs3Myw0NSBAQAogCiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJPdXREZXZpY2UoQE5vbk51bGwgRGV2aWNlQ29ubmVjdG9yIGRldmljZSwgQE5vbk51bGwgVGVzdERhdGEgdGVzdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBJTG9nZ2VyIGxvZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBwcm9qZWN0TmFtZSwgQE5vbk51bGwgU3RyaW5nIHZhcmlhbnROYW1lKSB7CisgICAgICAgIGludCBkZXZpY2VBcGlMZXZlbCA9IGRldmljZS5nZXRBcGlMZXZlbCgpOworICAgICAgICBpZiAoZGV2aWNlQXBpTGV2ZWwgPT0gMCkgeworICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlNraXBwaW5nIGRldmljZSAnJXMnIGZvciAnJXM6JXMnOiBVbmtub3duIEFQSSBMZXZlbCIsCisgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXROYW1lKCksIHByb2plY3ROYW1lLCB2YXJpYW50TmFtZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGVzdERhdGEuZ2V0TWluU2RrVmVyc2lvbigpID4gZGV2aWNlQXBpTGV2ZWwpIHsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTa2lwcGluZyBkZXZpY2UgJyVzJyBmb3IgJyVzOiVzJyIsCisgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXROYW1lKCksIHByb2plY3ROYW1lLCB2YXJpYW50TmFtZSk7CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIFNldDxTdHJpbmc+IGFwcEFiaXMgPSB0ZXN0RGF0YS5nZXRTdXBwb3J0ZWRBYmlzKCk7CisgICAgICAgIGlmIChhcHBBYmlzICE9IG51bGwpIHsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBkZXZpY2VBYmlzID0gZGV2aWNlLmdldEFiaXMoKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VBYmlzID09IG51bGwgfHwgZGV2aWNlQWJpcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiU2tpcHBpbmcgZGV2aWNlICclcycgZm9yICclczolcyc6IFVua25vd24gQUJJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXROYW1lKCksIHByb2plY3ROYW1lLCB2YXJpYW50TmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIGNvbXBhdGlibGVBYmkgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGRldmljZUFiaSA6IGRldmljZUFiaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXBwQWJpcy5jb250YWlucyhkZXZpY2VBYmkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGVBYmkgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFjb21wYXRpYmxlQWJpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvdGVzdGluZy9UZXN0RGF0YS5qYXZhIGIvYnVpbGRlci9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvdGVzdGluZy9UZXN0RGF0YS5qYXZhCmluZGV4IDI0OTU2NTkuLmE3MzYwMjYgMTAwNjQ0Ci0tLSBhL2J1aWxkZXIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL3Rlc3RpbmcvVGVzdERhdGEuamF2YQorKysgYi9idWlsZGVyL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci90ZXN0aW5nL1Rlc3REYXRhLmphdmEKQEAgLTQ0LDggKzQ0LDE4IEBACiAgICAgQE5vbk51bGwKICAgICBTdHJpbmcgZ2V0SW5zdHJ1bWVudGF0aW9uUnVubmVyKCk7CiAKKyAgICBATm9uTnVsbAorICAgIEJvb2xlYW4gZ2V0SGFuZGxlUHJvZmlsaW5nKCk7CisKKyAgICBATm9uTnVsbAorICAgIEJvb2xlYW4gZ2V0RnVuY3Rpb25hbFRlc3QoKTsKKwogICAgIGludCBnZXRNaW5TZGtWZXJzaW9uKCk7CiAKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIHN1cHBvcnRlZCBBQklzLiBOdWxsIG1lYW5zIGFsbC4KKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBhYmkgb3IgbnVsbCBmb3IgYWxsCisgICAgICovCiAgICAgQE51bGxhYmxlCiAgICAgU2V0PFN0cmluZz4gZ2V0U3VwcG9ydGVkQWJpcygpOwogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9BbmRyb2lkTWFuaWZlc3QudGVtcGxhdGUgYi9idWlsZGVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL0FuZHJvaWRNYW5pZmVzdC50ZW1wbGF0ZQppbmRleCAyNTdlNzlkLi5lZDUwMjMzIDEwMDY0NAotLS0gYS9idWlsZGVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL0FuZHJvaWRNYW5pZmVzdC50ZW1wbGF0ZQorKysgYi9idWlsZGVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL0FuZHJvaWRNYW5pZmVzdC50ZW1wbGF0ZQpAQCAtMTAsNSArMTAsNyBAQAogCiAgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9IiNURVNUUlVOTkVSIyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iI1RFU1RFRFBBQ0tBR0UjIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpoYW5kbGVQcm9maWxpbmc9IiNIQU5ETEVQUk9GSUxJTkcjIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpmdW5jdGlvbmFsVGVzdD0iI0ZVTkNUSU9OQUxURVNUIyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3RzIGZvciAjVEVTVEVEUEFDS0FHRSMiLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9idWlsZGVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL0J1aWxkQ29uZmlnLnRlbXBsYXRlIGIvYnVpbGRlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9CdWlsZENvbmZpZy50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4YzAxMy4uMDAwMDAwMAotLS0gYS9idWlsZGVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL0J1aWxkQ29uZmlnLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vKiogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZS4gRE8gTk9UIE1PRElGWSAqLwotcGFja2FnZSAjUEFDS0FHRSM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBCdWlsZENvbmZpZyB7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIERFQlVHID0gI0RFQlVHIzsKLQotI0FERElUSU9OQUxfTElORVMjfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1aWxkZXIvc3JjL3Rlc3QvamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL0RlZmF1bHRQcm9kdWN0Rmxhdm9yVGVzdC5qYXZhIGIvYnVpbGRlci9zcmMvdGVzdC9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvRGVmYXVsdFByb2R1Y3RGbGF2b3JUZXN0LmphdmEKaW5kZXggMWUwOTgyOC4uZjYxODA4NSAxMDA2NDQKLS0tIGEvYnVpbGRlci9zcmMvdGVzdC9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvRGVmYXVsdFByb2R1Y3RGbGF2b3JUZXN0LmphdmEKKysrIGIvYnVpbGRlci9zcmMvdGVzdC9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvRGVmYXVsdFByb2R1Y3RGbGF2b3JUZXN0LmphdmEKQEAgLTM5LDYgKzM5LDggQEAKICAgICAgICAgbUN1c3RvbS5zZXRQYWNrYWdlTmFtZSgiY29tLmZvcnR5LnR3byIpOwogICAgICAgICBtQ3VzdG9tLnNldFRlc3RQYWNrYWdlTmFtZSgiY29tLmZvcnR5LnR3by50ZXN0Iik7CiAgICAgICAgIG1DdXN0b20uc2V0VGVzdEluc3RydW1lbnRhdGlvblJ1bm5lcigiY29tLmZvcnR5LnR3by50ZXN0LlJ1bm5lciIpOworICAgICAgICBtQ3VzdG9tLnNldFRlc3RIYW5kbGVQcm9maWxpbmcodHJ1ZSk7CisgICAgICAgIG1DdXN0b20uc2V0VGVzdEZ1bmN0aW9uYWxUZXN0KHRydWUpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZU9uRGVmYXVsdCgpIHsKQEAgLTUyLDYgKzU0LDggQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZm9ydHkudHdvIiwgZmxhdm9yLmdldFBhY2thZ2VOYW1lKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5mb3J0eS50d28udGVzdCIsIGZsYXZvci5nZXRUZXN0UGFja2FnZU5hbWUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiY29tLmZvcnR5LnR3by50ZXN0LlJ1bm5lciIsIGZsYXZvci5nZXRUZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBmbGF2b3IuZ2V0VGVzdEhhbmRsZVByb2ZpbGluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZmxhdm9yLmdldFRlc3RGdW5jdGlvbmFsVGVzdCgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VPbkN1c3RvbSgpIHsKQEAgLTY1LDYgKzY5LDggQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZm9ydHkudHdvIiwgZmxhdm9yLmdldFBhY2thZ2VOYW1lKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5mb3J0eS50d28udGVzdCIsIGZsYXZvci5nZXRUZXN0UGFja2FnZU5hbWUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiY29tLmZvcnR5LnR3by50ZXN0LlJ1bm5lciIsIGZsYXZvci5nZXRUZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBmbGF2b3IuZ2V0VGVzdEhhbmRsZVByb2ZpbGluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZmxhdm9yLmdldFRlc3RGdW5jdGlvbmFsVGVzdCgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VEZWZhdWx0T25EZWZhdWx0KCkgewpAQCAtNzgsNSArODQsNyBAQAogICAgICAgICBhc3NlcnROdWxsKGZsYXZvci5nZXRQYWNrYWdlTmFtZSgpKTsKICAgICAgICAgYXNzZXJ0TnVsbChmbGF2b3IuZ2V0VGVzdFBhY2thZ2VOYW1lKCkpOwogICAgICAgICBhc3NlcnROdWxsKGZsYXZvci5nZXRUZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyKCkpOworICAgICAgICBhc3NlcnROdWxsKGZsYXZvci5nZXRUZXN0SGFuZGxlUHJvZmlsaW5nKCkpOworICAgICAgICBhc3NlcnROdWxsKGZsYXZvci5nZXRUZXN0RnVuY3Rpb25hbFRlc3QoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvdGVzdC9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvVmFyaWFudENvbmZpZ3VyYXRpb25UZXN0LmphdmEgYi9idWlsZGVyL3NyYy90ZXN0L2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9WYXJpYW50Q29uZmlndXJhdGlvblRlc3QuamF2YQppbmRleCA2ZDI0NGFjLi5lMWZmYzNkIDEwMDY0NAotLS0gYS9idWlsZGVyL3NyYy90ZXN0L2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9WYXJpYW50Q29uZmlndXJhdGlvblRlc3QuamF2YQorKysgYi9idWlsZGVyL3NyYy90ZXN0L2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9WYXJpYW50Q29uZmlndXJhdGlvblRlc3QuamF2YQpAQCAtNTcsNiArNTcsMTEgQEAKICAgICAgICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uTmFtZShATm9uTnVsbCBGaWxlIG1hbmlmZXN0RmlsZSkgewogICAgICAgICAgICAgcmV0dXJuICIxLjAiOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbkNvZGUoQE5vbk51bGwgRmlsZSBtYW5pZmVzdEZpbGUpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMjgsNyArMTMzLDcgQEAKICAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24gdmFyaWFudCA9IG5ldyBWYXJpYW50Q29uZmlndXJhdGlvbigKICAgICAgICAgICAgICAgICBtRGVmYXVsdENvbmZpZywgbmV3IE1vY2tTb3VyY2VQcm92aWRlcigibWFpbiIpLAogICAgICAgICAgICAgICAgIG1CdWlsZFR5cGUsIG5ldyBNb2NrU291cmNlUHJvdmlkZXIoImRlYnVnIiksCi0gICAgICAgICAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24uVHlwZS5ERUZBVUxULCAidGVzdCIpIHsKKyAgICAgICAgICAgICAgICBWYXJpYW50Q29uZmlndXJhdGlvbi5UeXBlLkRFRkFVTFQpIHsKICAgICAgICAgICAgIC8vIGRvbid0IGRvIHZhbGlkYXRpb24uCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewpAQCAtMTM2LDcgKzE0MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAKLSAgICAgICAgdmFyaWFudC5hZGRQcm9kdWN0Rmxhdm9yKG1GbGF2b3JDb25maWcsIG5ldyBNb2NrU291cmNlUHJvdmlkZXIoImN1c3RvbSIpKTsKKyAgICAgICAgdmFyaWFudC5hZGRQcm9kdWN0Rmxhdm9yKG1GbGF2b3JDb25maWcsIG5ldyBNb2NrU291cmNlUHJvdmlkZXIoImN1c3RvbSIpLCAiIik7CiAKICAgICAgICAgcmV0dXJuIHZhcmlhbnQ7CiAgICAgfQpAQCAtMTQ1LDcgKzE1MCw3IEBACiAgICAgICAgIFZhcmlhbnRDb25maWd1cmF0aW9uIHZhcmlhbnQgPSBuZXcgVmFyaWFudENvbmZpZ3VyYXRpb24oCiAgICAgICAgICAgICAgICAgbURlZmF1bHRDb25maWcsIG5ldyBNb2NrU291cmNlUHJvdmlkZXIoIm1haW4iKSwKICAgICAgICAgICAgICAgICBtQnVpbGRUeXBlLCBuZXcgTW9ja1NvdXJjZVByb3ZpZGVyKCJkZWJ1ZyIpLAotICAgICAgICAgICAgICAgIFZhcmlhbnRDb25maWd1cmF0aW9uLlR5cGUuREVGQVVMVCwgInRlc3QiKSB7CisgICAgICAgICAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24uVHlwZS5ERUZBVUxUKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZUZyb21NYW5pZmVzdCgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZU5hbWU7CkBAIC0xNTcsNyArMTYyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKIAotICAgICAgICB2YXJpYW50LmFkZFByb2R1Y3RGbGF2b3IobUZsYXZvckNvbmZpZywgbmV3IE1vY2tTb3VyY2VQcm92aWRlcigiY3VzdG9tIikpOworICAgICAgICB2YXJpYW50LmFkZFByb2R1Y3RGbGF2b3IobUZsYXZvckNvbmZpZywgbmV3IE1vY2tTb3VyY2VQcm92aWRlcigiY3VzdG9tIiksICIiKTsKICAgICAgICAgcmV0dXJuIHZhcmlhbnQ7CiAgICAgfQogCkBAIC0xNjUsNyArMTcwLDcgQEAKICAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24gdmFyaWFudCA9IG5ldyBWYXJpYW50Q29uZmlndXJhdGlvbigKICAgICAgICAgICAgICAgICBtRGVmYXVsdENvbmZpZywgbmV3IE1vY2tTb3VyY2VQcm92aWRlcigibWFpbiIpLAogICAgICAgICAgICAgICAgIG1CdWlsZFR5cGUsIG5ldyBNb2NrU291cmNlUHJvdmlkZXIoImRlYnVnIiksCi0gICAgICAgICAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24uVHlwZS5ERUZBVUxULCAidGVzdCIpIHsKKyAgICAgICAgICAgICAgICBWYXJpYW50Q29uZmlndXJhdGlvbi5UeXBlLkRFRkFVTFQpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uTmFtZUZyb21NYW5pZmVzdCgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdmVyc2lvbk5hbWU7CkBAIC0xNzcsNyArMTgyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKIAotICAgICAgICB2YXJpYW50LmFkZFByb2R1Y3RGbGF2b3IobUZsYXZvckNvbmZpZywgbmV3IE1vY2tTb3VyY2VQcm92aWRlcigiY3VzdG9tIikpOworICAgICAgICB2YXJpYW50LmFkZFByb2R1Y3RGbGF2b3IobUZsYXZvckNvbmZpZywgbmV3IE1vY2tTb3VyY2VQcm92aWRlcigiY3VzdG9tIiksICIiKTsKICAgICAgICAgcmV0dXJuIHZhcmlhbnQ7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvYnVpbGRlci9zcmMvdGVzdC9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvY29tcGlsaW5nL0J1aWxkQ29uZmlnR2VuZXJhdG9yVGVzdC5qYXZhIGIvYnVpbGRlci9zcmMvdGVzdC9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkZXIvY29tcGlsaW5nL0J1aWxkQ29uZmlnR2VuZXJhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjIyMDAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZGVyL3NyYy90ZXN0L2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9jb21waWxpbmcvQnVpbGRDb25maWdHZW5lcmF0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkZXIuY29tcGlsaW5nOworCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5BbmRyb2lkQnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uRmlsZXM7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitAU3VwcHJlc3NXYXJuaW5ncygiUmVzdWx0T2ZNZXRob2RDYWxsSWdub3JlZCIpCitwdWJsaWMgY2xhc3MgQnVpbGRDb25maWdHZW5lcmF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3RGYWxzZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlIHRlbXBEaXIgPSBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisgICAgICAgIEJ1aWxkQ29uZmlnR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBCdWlsZENvbmZpZ0dlbmVyYXRvcih0ZW1wRGlyLmdldFBhdGgoKSwKKyAgICAgICAgICAgICAgICAibXkuYXBwLnBrZyIpOworCisgICAgICAgIGdlbmVyYXRvci5hZGRGaWVsZCgiYm9vbGVhbiIsICJERUJVRyIsICJmYWxzZSIpLmdlbmVyYXRlKCk7CisKKyAgICAgICAgRmlsZSBmaWxlID0gZ2VuZXJhdG9yLmdldEJ1aWxkQ29uZmlnRmlsZSgpOworICAgICAgICBhc3NlcnRUcnVlKGZpbGUuZXhpc3RzKCkpOworICAgICAgICBTdHJpbmcgYWN0dWFsID0gRmlsZXMudG9TdHJpbmcoZmlsZSwgQ2hhcnNldHMuVVRGXzgpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi8qKlxuIiArCisgICAgICAgICAgICAgICAgIiAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGUuIERPIE5PVCBNT0RJRllcbiIgKworICAgICAgICAgICAgICAgICIgKi9cbiIgKworICAgICAgICAgICAgICAgICJwYWNrYWdlIG15LmFwcC5wa2c7XG4iICsKKyAgICAgICAgICAgICAgICAiXG4iICsKKyAgICAgICAgICAgICAgICAicHVibGljIGZpbmFsIGNsYXNzIEJ1aWxkQ29uZmlnIHtcbiIgKworICAgICAgICAgICAgICAgICIgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlO1xuIiArCisgICAgICAgICAgICAgICAgIn1cbiIsIGFjdHVhbCk7CisgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgIHRlbXBEaXIuZGVsZXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSB0ZW1wRGlyID0gRmlsZXMuY3JlYXRlVGVtcERpcigpOworICAgICAgICBCdWlsZENvbmZpZ0dlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQnVpbGRDb25maWdHZW5lcmF0b3IodGVtcERpci5nZXRQYXRoKCksCisgICAgICAgICAgICAgICAgIm15LmFwcC5wa2ciKTsKKyAgICAgICAgZ2VuZXJhdG9yLmFkZEZpZWxkKCJib29sZWFuIiwgIkRFQlVHIiwgIkJvb2xlYW4ucGFyc2VCb29sZWFuKFwidHJ1ZVwiKSIpLmdlbmVyYXRlKCk7CisKKyAgICAgICAgRmlsZSBmaWxlID0gZ2VuZXJhdG9yLmdldEJ1aWxkQ29uZmlnRmlsZSgpOworICAgICAgICBhc3NlcnRUcnVlKGZpbGUuZXhpc3RzKCkpOworICAgICAgICBTdHJpbmcgYWN0dWFsID0gRmlsZXMudG9TdHJpbmcoZmlsZSwgQ2hhcnNldHMuVVRGXzgpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi8qKlxuIiArCisgICAgICAgICAgICAgICAgIiAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGUuIERPIE5PVCBNT0RJRllcbiIgKworICAgICAgICAgICAgICAgICIgKi9cbiIgKworICAgICAgICAgICAgICAgICJwYWNrYWdlIG15LmFwcC5wa2c7XG4iICsKKyAgICAgICAgICAgICAgICAiXG4iICsKKyAgICAgICAgICAgICAgICAicHVibGljIGZpbmFsIGNsYXNzIEJ1aWxkQ29uZmlnIHtcbiIgKworICAgICAgICAgICAgICAgICIgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKFwidHJ1ZVwiKTtcbiIgKworICAgICAgICAgICAgICAgICJ9XG4iLCBhY3R1YWwpOworICAgICAgICBmaWxlLmRlbGV0ZSgpOworICAgICAgICB0ZW1wRGlyLmRlbGV0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlIHRlbXBEaXIgPSBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisgICAgICAgIEJ1aWxkQ29uZmlnR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBCdWlsZENvbmZpZ0dlbmVyYXRvcih0ZW1wRGlyLmdldFBhdGgoKSwKKyAgICAgICAgICAgICAgICAibXkuYXBwLnBrZyIpOworCisgICAgICAgIExpc3Q8T2JqZWN0PiBpdGVtcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICBpdGVtcy5hZGQoIkV4dHJhIGxpbmUiKTsKKyAgICAgICAgaXRlbXMuYWRkKEFuZHJvaWRCdWlsZGVyLmNyZWF0ZUNsYXNzRmllbGQoImludCIsICJFWFRSQSIsICI0MiIpKTsKKworICAgICAgICBnZW5lcmF0b3IuYWRkSXRlbXMoaXRlbXMpLmdlbmVyYXRlKCk7CisKKyAgICAgICAgRmlsZSBmaWxlID0gZ2VuZXJhdG9yLmdldEJ1aWxkQ29uZmlnRmlsZSgpOworICAgICAgICBhc3NlcnRUcnVlKGZpbGUuZXhpc3RzKCkpOworICAgICAgICBTdHJpbmcgYWN0dWFsID0gRmlsZXMudG9TdHJpbmcoZmlsZSwgQ2hhcnNldHMuVVRGXzgpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi8qKlxuIiArCisgICAgICAgICAgICAgICAgIiAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGUuIERPIE5PVCBNT0RJRllcbiIgKworICAgICAgICAgICAgICAgICIgKi9cbiIgKworICAgICAgICAgICAgICAgICJwYWNrYWdlIG15LmFwcC5wa2c7XG4iICsKKyAgICAgICAgICAgICAgICAiXG4iICsKKyAgICAgICAgICAgICAgICAicHVibGljIGZpbmFsIGNsYXNzIEJ1aWxkQ29uZmlnIHtcbiIgKworICAgICAgICAgICAgICAgICIgIC8vIEV4dHJhIGxpbmVcbiIgKworICAgICAgICAgICAgICAgICIgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVFJBID0gNDI7XG4iICsKKyAgICAgICAgICAgICAgICAifVxuIiwgYWN0dWFsKTsKKyAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgdGVtcERpci5kZWxldGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9idWlsZGVyL3NyYy90ZXN0L2phdmEvY29tL2FuZHJvaWQvYnVpbGRlci9pbnRlcm5hbC9pbmNyZW1lbnRhbC9GaWxlTWFuYWdlclRlc3QuamF2YSBiL2J1aWxkZXIvc3JjL3Rlc3QvamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL2luY3JlbWVudGFsL0ZpbGVNYW5hZ2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWM2YmIzLi4wMDAwMDAwCi0tLSBhL2J1aWxkZXIvc3JjL3Rlc3QvamF2YS9jb20vYW5kcm9pZC9idWlsZGVyL2ludGVybmFsL2luY3JlbWVudGFsL0ZpbGVNYW5hZ2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkZXIuaW50ZXJuYWwuaW5jcmVtZW50YWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuY29tbW9uLnJlczIuRmlsZVN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC50ZXN0dXRpbHMuVGVzdFV0aWxzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlTWFuYWdlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlTWFuYWdlciBzRmlsZU1hbmFnZXIgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIEZpbGUgc0ZpbGVzRm9sZGVyID0gbnVsbDsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbnRvdWNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZU1hbmFnZXIgZmlsZU1hbmFnZXIgPSBnZXRGaWxlTWFuYWdlcigpOwotICAgICAgICBNYXA8RmlsZSwgRmlsZVN0YXR1cz4gY2hhbmdlZEZpbGVzID0gZmlsZU1hbmFnZXIuZ2V0Q2hhbmdlZEZpbGVzKCk7Ci0KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoc0ZpbGVzRm9sZGVyLCAidW50b3VjaGVkLnBuZyIpOwotICAgICAgICBGaWxlU3RhdHVzIHN0YXR1cyA9IGNoYW5nZWRGaWxlcy5nZXQoZmlsZSk7Ci0gICAgICAgIGFzc2VydE51bGwoc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW50b3VjaGVkRGF0ZUJlZm9yZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlTWFuYWdlciBmaWxlTWFuYWdlciA9IGdldEZpbGVNYW5hZ2VyKCk7Ci0gICAgICAgIE1hcDxGaWxlLCBGaWxlU3RhdHVzPiBjaGFuZ2VkRmlsZXMgPSBmaWxlTWFuYWdlci5nZXRDaGFuZ2VkRmlsZXMoKTsKLQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShzRmlsZXNGb2xkZXIsICJ1bnRvdWNoZWRfZGF0ZV9iZWZvcmUucG5nIik7Ci0gICAgICAgIEZpbGVTdGF0dXMgc3RhdHVzID0gY2hhbmdlZEZpbGVzLmdldChmaWxlKTsKLSAgICAgICAgLy8gbm8gY2hhbmdlCi0gICAgICAgIGFzc2VydE51bGwoc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW50b3VjaGVkRGF0ZUFmdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVNYW5hZ2VyIGZpbGVNYW5hZ2VyID0gZ2V0RmlsZU1hbmFnZXIoKTsKLSAgICAgICAgTWFwPEZpbGUsIEZpbGVTdGF0dXM+IGNoYW5nZWRGaWxlcyA9IGZpbGVNYW5hZ2VyLmdldENoYW5nZWRGaWxlcygpOwotCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHNGaWxlc0ZvbGRlciwgInVudG91Y2hlZF9kYXRlX2FmdGVyLnBuZyIpOwotICAgICAgICBGaWxlU3RhdHVzIHN0YXR1cyA9IGNoYW5nZWRGaWxlcy5nZXQoZmlsZSk7Ci0gICAgICAgIC8vIG5vIGNoYW5nZQotICAgICAgICBhc3NlcnROdWxsKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnRDaGFuZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVNYW5hZ2VyIGZpbGVNYW5hZ2VyID0gZ2V0RmlsZU1hbmFnZXIoKTsKLSAgICAgICAgTWFwPEZpbGUsIEZpbGVTdGF0dXM+IGNoYW5nZWRGaWxlcyA9IGZpbGVNYW5hZ2VyLmdldENoYW5nZWRGaWxlcygpOwotCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHNGaWxlc0ZvbGRlciwgImNvbnRlbnRfY2hhbmdlZC5wbmciKTsKLSAgICAgICAgRmlsZVN0YXR1cyBzdGF0dXMgPSBjaGFuZ2VkRmlsZXMuZ2V0KGZpbGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRmlsZVN0YXR1cy5DSEFOR0VELCBzdGF0dXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaXplQ2hhbmdlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlTWFuYWdlciBmaWxlTWFuYWdlciA9IGdldEZpbGVNYW5hZ2VyKCk7Ci0gICAgICAgIE1hcDxGaWxlLCBGaWxlU3RhdHVzPiBjaGFuZ2VkRmlsZXMgPSBmaWxlTWFuYWdlci5nZXRDaGFuZ2VkRmlsZXMoKTsKLQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShzRmlsZXNGb2xkZXIsICJzaXplX2NoYW5nZWQucG5nIik7Ci0gICAgICAgIEZpbGVTdGF0dXMgc3RhdHVzID0gY2hhbmdlZEZpbGVzLmdldChmaWxlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGVTdGF0dXMuQ0hBTkdFRCwgc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlTWFuYWdlciBmaWxlTWFuYWdlciA9IGdldEZpbGVNYW5hZ2VyKCk7Ci0gICAgICAgIE1hcDxGaWxlLCBGaWxlU3RhdHVzPiBjaGFuZ2VkRmlsZXMgPSBmaWxlTWFuYWdlci5nZXRDaGFuZ2VkRmlsZXMoKTsKLQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShzRmlsZXNGb2xkZXIsICJyZW1vdmVkLnBuZyIpOwotICAgICAgICBGaWxlU3RhdHVzIHN0YXR1cyA9IGNoYW5nZWRGaWxlcy5nZXQoZmlsZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhGaWxlU3RhdHVzLlJFTU9WRUQsIHN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5ldygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlTWFuYWdlciBmaWxlTWFuYWdlciA9IGdldEZpbGVNYW5hZ2VyKCk7Ci0gICAgICAgIE1hcDxGaWxlLCBGaWxlU3RhdHVzPiBjaGFuZ2VkRmlsZXMgPSBmaWxlTWFuYWdlci5nZXRDaGFuZ2VkRmlsZXMoKTsKLQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShzRmlsZXNGb2xkZXIsICJuZXcucG5nIik7Ci0gICAgICAgIEZpbGVTdGF0dXMgc3RhdHVzID0gY2hhbmdlZEZpbGVzLmdldChmaWxlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGVTdGF0dXMuTkVXLCBzdGF0dXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZU1hbmFnZXIgZ2V0RmlsZU1hbmFnZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoc0ZpbGVNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGUgcm9vdCA9IFRlc3RVdGlscy5nZXRDYW5vbmljYWxSb290KCJjaGFuZ2VNYW5hZ2VyIik7Ci0gICAgICAgICAgICBGaWxlIGRhdGFGaWxlID0gbmV3IEZpbGUocm9vdCwgImZpbGVzLmRhdGEiKTsKLSAgICAgICAgICAgIHNGaWxlc0ZvbGRlciA9IG5ldyBGaWxlKHJvb3QsICJmaWxlcyIpOwotCi0gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGxhc3QgbW9kaWZpZWQgb24gc29tZSBvZiB0aGUgZmlsZXMuCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBsYWNlSG9sZGVyTWFwID0gTWFwcy5uZXdIYXNoTWFwKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbXSB7ICJ1bnRvdWNoZWQiIH07Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlbmFtZSA6IGZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoc0ZpbGVzRm9sZGVyLCBmaWxlbmFtZSArICIucG5nIik7Ci0gICAgICAgICAgICAgICAgcGxhY2VIb2xkZXJNYXAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiXFwkbG1fJXNcXCQiLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlZCIsIGZpbGUubGFzdE1vZGlmaWVkKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmlsZSB0cnVlRGF0YUZpbGUgPSBnZXREYXRhRmlsZShkYXRhRmlsZSwgc0ZpbGVzRm9sZGVyLCBwbGFjZUhvbGRlck1hcCk7Ci0KLSAgICAgICAgICAgIHNGaWxlTWFuYWdlciA9IG5ldyBGaWxlTWFuYWdlcigpOwotICAgICAgICAgICAgc0ZpbGVNYW5hZ2VyLmxvYWQodHJ1ZURhdGFGaWxlKTsKLQotICAgICAgICAgICAgc0ZpbGVNYW5hZ2VyLmFkZEZpbGUoc0ZpbGVzRm9sZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzRmlsZU1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGRhdGEgZmlsZSB3aGVyZSB0aGUgcGxhY2Vob2xkZXJzIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggdGhlIHJlYWwgZm9sZGVyIGJhc2VkCi0gICAgICogb24gd2hlcmUgdGhlIHRlc3RzIGFyZSBydW4gZnJvbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIHRoZSBkYXRhIGZvbGRlci4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0Rm9sZGVyIHRoZSB0YXJnZXRGb2xkZXIKLSAgICAgKiBAcGFyYW0gcGxhY2Vob2xkZXJzIGFkZGl0aW9uYWwgcGxhY2Vob2xkZXJzIGFuZCB2YWx1ZXMgdG8gcmVwbGFjZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBuZXcgZGF0YSBmaWxlIHRoYXQncyBiZWVuIHVwZGF0ZWQgd2l0aCB0aGUgdGFyZ2V0Rm9sZGVyCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEZpbGUgZ2V0RGF0YUZpbGUoRmlsZSBmaWxlLCBGaWxlIHRhcmdldEZvbGRlciwgTWFwPFN0cmluZywgU3RyaW5nPiBwbGFjZWhvbGRlcnMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBjb250ZW50ID0gRmlsZXMudG9TdHJpbmcoZmlsZSwgQ2hhcnNldHMuVVRGXzgpOwotCi0gICAgICAgIC8vIHNlYXJjaCBhbmQgcmVwbGFjZSAkVE9QJCB3aXRoIHRoZSByb290IGFuZCAkU0VQJCB3aXRoIHRoZSBwbGF0Zm9ybSBzZXBhcmF0b3IuCi0gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoIlxcJFRPUFxcJCIsICBNYXRjaGVyLnF1b3RlUmVwbGFjZW1lbnQodGFyZ2V0Rm9sZGVyLmdldEFic29sdXRlUGF0aCgpKSkKLSAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgiXFwkU0VQXFwkIiwgTWF0Y2hlci5xdW90ZVJlcGxhY2VtZW50KEZpbGUuc2VwYXJhdG9yKSk7Ci0KLSAgICAgICAgLy8gbm93IHJlcGxhY2UgdGhlIGFkZGl0aW9uYWwgcGxhY2Vob2xkZXJzCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHBsYWNlaG9sZGVycy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKGVudHJ5LmdldEtleSgpLCBNYXRjaGVyLnF1b3RlUmVwbGFjZW1lbnQoZW50cnkuZ2V0VmFsdWUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSB0bXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJhbmRyb2lkIiwgImdldERhdGFGaWxlIik7Ci0gICAgICAgIEZpbGVzLndyaXRlKGNvbnRlbnQsIHRtcCwgQ2hhcnNldHMuVVRGXzgpOwotCi0gICAgICAgIHJldHVybiB0bXA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY2hhbmdlbG9nLnR4dCBiL2NoYW5nZWxvZy50eHQKaW5kZXggYjljODI2OC4uNzkyY2FjMCAxMDA2NDQKLS0tIGEvY2hhbmdlbG9nLnR4dAorKysgYi9jaGFuZ2Vsb2cudHh0CkBAIC0xLDYgKzEsODAgQEAKKzAuNy4wCistIFJlcXVpcmVzIEdyYWRsZSAxLjkKKy0gWW91IGNhbiBub3cgaGF2ZSBhIHZhcmlhbnQgc3BlY2lmaWMgc291cmNlIGZvbGRlciBpZiB5b3UgaGF2ZSBmbGF2b3JzLgorICBPbmx5IGZvciBhcHAgKG5vdCBsaWJyYXJ5IG9yIHRlc3QpLiBOYW1lIGlzIHNyYy9mbGF2b3JEZWJ1Zy8uLi4gb3Igc3JjL2ZsYXZvcjFGbGF2b3IyRGVidWcvCisgIChub3RlIHRoZSBjYW1lbGNhc2UgbmFtaW5nLCB3aXRoIGxvd2VyIGNhc2UgZm9yIGZpcnN0IGxldHRlcikuCisgIEl0cyBjb21wb25lbnRzIChyZXMsIG1hbmlmZXN0LCBldGMuLi4pIGhhdmUgaGlnaGVyIHByaW9yaXR5IHRoYW4gY29tcG9uZW50cyBmcm9tIGJ1aWxkIHR5cGUKKyAgb3IgZmxhdm9ycy4KKyAgVGhlcmUgaXMgYWxzbyBhICJmbGF2b3IgY29tYmluYXRpb24iIHNvdXJjZSBmb2xkZXIgYXZhaWxhYmxlIHdoZW4gbW9yZSB0aGFuIG9uZQorICBmbGF2b3IgZGltZW5zaW9uIGlzIHVzZWQuCisgIEZvciBpbnN0YW5jZSBzcmMvZmxhdm9yMUZsYXZvcjIvCisgIE5vdGUgdGhhdCB0aGlzIGlzIGZvciBhbGwgY29tYmluYXRpb25zIG9mICphbGwqIGRpbWVuc2lvbnMuCistIEJ1aWxkIGNvbmZpZyBpbXByb3ZlbWVudHMgYW5kIERTTCBjaGFuZ2VzLgorICBUaGUgcHJldmlvdXMgRFNMIHByb3ByZXR5OgorICAgIGJ1aWxkQ29uZmlnTGluZSAiPHZhbHVlPiIKKyAgaGFzIGNoYW5nZWQgdG8KKyAgICBidWlsZENvbmZpZ0ZpZWxkICI8dHlwZT4iLCAiPG5hbWU+IiwgIjx2YWx1ZT4iCisgIFRoaXMgYWxsb3dzIG92ZXJyaWRlIGEgZmllbGQgKHNlZSAnYmFzaWMnIHNhbXBsZSkKKyAgQWxzbywgQnVpbGRDb25maWcgbm93IGF1dG9tYXRpY2FsbHkgY29udGFpbnMgY29uc3RhbnRzIGZvcgorICBQQUNLQUdFX05BTUUsIFZFUlNJT05fQ09ERSwgVkVSU0lPTl9OQU1FLCBCVUlMRF9UWVBFLCBGTEFWT1IgYXMgd2VsbCBhcyBGTEFWT1JfPGdyb3VwPiwgRkxBVk9SXzxncm91cD4sIGV0Yy4uLiBpZiB0aGVyZSBhcmUgc2V2ZXJhbCBmbGF2b3IgZGltZW5zaW9ucy4KKy0gU3dpdGNoIHRvIFByb0d1YXJkIDQuMTAKKyAgIC0gQWRkZWQgYWJpbGl0eSB0byB0ZXN0IHByb2d1YXJkZWQgKG9iZnVzY2F0ZWQpIGFwcHMuCistIE5ldyBvcHRpb24gb24gcHJvZHVjdCBGbGF2b3IgKGFuZCBkZWZhdWx0Q29uZmlnKSBhbGxvdyBmaWx0ZXJpbmcgb2YgcmVzb3VyY2VzIHRocm91Z2ggdGhlIC1jIG9wdGlvbiBvZiBhYXB0CisgIFlvdSBjYW4gcGFzcyBzaW5nbGUgb3IgbXVsdGlwbGUgdmFsdWVzIHRocm91Z2ggdGhlIERTTC4gQWxsIHZhbHVlcyBmcm9tIHRoZSBkZWZhdWx0IGNvbmZpZyBhbmQgZmxhdm9ycworICBnZXQgY29tYmluZWQgYW5kIHBhc3NlZCB0byBhYXB0LgorICAgICByZXNDb25maWcgImVuIgorICBvciAKKyAgICAgcmVzQ29uZmlnICJub2RwaSIsImhkcGkiCisKKy0gSmFyIGZpbGVzIGFyZSBub3cgcHJlLWRleGVkIGZvciBmYXN0ZXIgZGV4aW5nLgorLSBGaXJzdCBwYXNzIGF0IE5ESyBpbnRlZ3JhdGlvbgorLSBBUEkgdG8gYWRkIG5ldyBnZW5lcmF0ZWQgc291cmNlIGZvbGRlcnM6CisgICAgIHZhcmlhbnQuYWRkSmF2YVNvdXJjZUZvbGRlcnNUb01vZGVsKHNvdXJjZUZvbGRlcjEsIHNvdXJjZUZvbGRlcnMyLC4uLikKKyAgVGhpcyBhZGRzIHRoZSBzb3VyY2UgZm9sZGVyIHRvIHRoZSBtb2RlbCAoZm9yIElERSBzdXBwb3J0KS4KKyAgQW5vdGhlciBBUEk6CisgICAgIHZhcmlhbnQucmVnaXN0ZXJKYXZhR2VuZXJhdGluZ1Rhc2sodGFzaywgc291cmNlRm9sZGVyMSwgc291cmNlRm9sZGVyczIsLi4uKQorICBUaGlzIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGUgZGVwZW5kZW5jeSBvbiB0aGUgdGFzaywgc2V0cyB1cCB0aGUgSmF2YUNvbXBpbGUgdGFzayBpbnB1dHMgYW5kIHByb3BhZ2F0ZXMKKyAgdGhlIGZvbGRlcnMgdG8gdGhlIG1vZGVsIGZvciBJREUgaW50ZWdyYXRpb24uCistIEFQSSB0byBhZGQgZXh0cmEgYXJ0aWZhY3RzIG9uIHZhcmlhbnRzLiBUaGlzIHdpbGwgYWxsb3cgdG8gcmVnaXN0ZXIgSmF2YSBvciBBbmRyb2lkIGFydGlmYWN0cywgZm9yIGluc3RhbmNlCisgIGZvciBhbHRlcm5hdGl2ZSB0ZXN0IGFydGlmYWN0cy4KKworMC42LjMKKy0gRml4ZWQgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjpNZXJnaW5nRXhjZXB0aW9uIGludHJvZHVjZWQgaW4gMC42LjIKKworMC42LjIKKy0gTGludCBub3cgcGlja3MgdXAgdGhlIFNESyBob21lIGZyb20gc2RrLmRpciBpbiBsb2NhbC5wcm9wZXJ0aWVzCistIEVycm9yIG1lc3NhZ2Ugc2hvd24gd2hlbiB1c2luZyBhbiB1bnN1cHBvcnRlZCB2ZXJzaW9uIG9mIEdyYWRsZSBub3cgZXhwbGFpbnMgaG93IHRvIHVwZGF0ZSB0aGUgR3JhZGxlIHdyYXBwZXIKKy0gTWVyZ2VkIHJlc291cmNlIGZpbGVzIG5vIGxvbmdlciBwbGFjZSB0aGVpciBzb3VyY2UgbWFya2VycyBpbnRvIHRoZSBSIGZpbGUgYXMgY29tbWVudHMKKy0gUHJvamVjdCBwYXRoIGNhbiBjb250YWluICctLScgKHR3byBkYXNoZXMpCistIEludGVybmFsIGNoYW5nZXMgdG8gaW1wcm92ZSBpbnRlZ3JhdGlvbiB3aXRoIEFuZHJvaWQgU3R1ZGlvCisKKzAuNi4xCisKKy0gRml4ZWQgaXNzdWVzIHdpdGggbGludCB0YXNrIGZvdW5kIGluIDAuNi4wCisKKzAuNi4wCisKKy0gRW5hYmxlZCBzdXBwb3J0IGZvciBHcmFkbGUgMS44CistIEdyYWRsZSAxLjggaXMgbm93IHRoZSBtaW5pbXVtIHN1cHBvcnRlZCB2ZXJzaW9uCistIERlZmF1bHQgZW5jb2RpbmcgZm9yIGNvbXBpbGluZyBKYXZhIGNvZGUgaXMgVVRGLTgKKy0gVXNlcnMgY2FuIG5vdyBzcGVjaWZ5IHRoZSBlbmNvZGluZyB0byB1c2UgdG8gY29tcGlsZSBKYXZhIGNvZGUKKy0gRml4ZWQgR3JhZGxlIDEuOC1zcGVjaWZpYyBidWdzCisgIC0gSW1wb3J0aW5nIHByb2plY3RzIHdpdGggbWlzc2luZyBkZXBlbmRlbmNpZXMgd2FzIGJyb2tlbgorICAtIENvbXBpbGluZyBwcm9qZWN0cyB3aXRoIEFJREwgZmlsZXMgd2FzIGJyb2tlbgorCiswLjUuNworCistIFByb2d1YXJkIHN1cHBvcnQgZm9yIGxpYnJhcmllcy4KKyAgTm90ZSB0aGUgY3VycmVudCBEU0wgcHJvcGVydHkgJ3Byb2d1YXJkRmlsZXMnIGZvciBsaWJyYXJ5IG5vdyBzZXRzIHRoZSBwcm9ndWFyZCBydWxlIGZpbGUgdXNlZCB3aGVuIHByb2d1YXJkaW5nIHRoZSBsaWJyYXJ5IGNvZGUuCisgIFRoZSBuZXcgcHJvcGVydHkgJ2NvbnN1bWVyUHJvZ3VhcmRGaWxlcycgaXMgdXNlZCB0byBwYWNrYWdlIGEgcnVsZSBmaWxlIGluc2lkZSBhbiBhYXIuCistIEltcHJvdmVkIElERSBzdXBwb3J0LCBpbmNsdWRpbmcgbG9hZGluZyBwcm9qZWN0IHdpdGggYnJva2VuIGRlcGVuZGVuY2llcyBhbmQgYW5jaG9yIHRhc2sgdG8gZ2VuZXJhdGUgSmF2YSBjb2RlCistIE5ldyBob29rIHRhc2tzOiBwcmVCdWlsZCBhbmQgcHJlYnVpbGQ8VmFyaWFudE5hbWU+CistIEZpcnN0IGxpbnQgaW50ZWdyYXRpb24uIFRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzIGFuZCB0aGVyZWZvcmUgdGhlIGxpbnQgdGFzayBpcyBub3QgYWRkZWQgdG8gdGhlIGNoZWNrIHRhc2suCistIEVuYWJsZSBjb21wYXRpYmlsaXR5IHdpdGggMS44CisKIDAuNS42CiAKLS0gRW5hYmxlIHN1cHBvcnQgZm9yIDEuNworLSBFbmFibGVkIHN1cHBvcnQgZm9yIDEuNwogCiAwLjUuNQogCkBAIC0xOCwxNyArOTIsMTcgQEAKIAogMC41LjMKIAotLSBGaXggYSBjcmFzaGluZyBidWcgaW4gUHJlcGFyZURlcGVuZGVuY2llc1Rhc2sKKy0gRml4ZWQgYSBjcmFzaGluZyBidWcgaW4gUHJlcGFyZURlcGVuZGVuY2llc1Rhc2sKIAogMC41LjIKIAogLSBCZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGZvciBjbWQgbGluZSB0b29scywgZXNwZWNpYWxseQogICBpZiBydW4gaW4gcGFyYWxsZWwgaW4gc3Bhd25lZCB0aHJlYWRzCi0tIEZpeCBhbiBpc3N1ZSBkdWUgdG8gd2luZG93cyBwYXRoIGluIG1lcmdlZCByZXNvdXJjZSBmaWxlcy4KKy0gRml4ZWQgYW4gaXNzdWUgZHVlIHRvIHdpbmRvd3MgcGF0aCBpbiBtZXJnZWQgcmVzb3VyY2UgZmlsZXMuCiAKIDAuNS4xCiAKLS0gRml4IGlzc3VlIGluIHRoZSBkZXBlbmRlbmN5IGNoZWNrZXIuCistIEZpeGVkIGlzc3VlIGluIHRoZSBkZXBlbmRlbmN5IGNoZWNrZXIuCiAKIDAuNS4wOgogCkBAIC00NywxMCArMTIxLDEwIEBACiAKIDAuNC4zOgogCi0tIGVuYWJsZSBjcnVuY2hpbmcgZm9yIGFsbCBwbmcgZmlsZXMsIG5vdCBqdXN0IC45LnBuZwotLSBmaXggZGVhbGluZyB3aXRoIG5vbiByZXNvdXJjZSBmaWxlcyBpbiByZXMvIGFuZCBhc3NldHMvCi0tIGZpeCBjcmFzaCB3aGVuIGRvaW5nIGluY3JlbWVudGFsIGFpZGwgY29tcGlsYXRpb24gZHVlIHRvIGJyb2tlbiBtZXRob2QgbmFtZSAoYWggdGhlIGpveSBvZiBHcm9vdnkuLi4pCi0tIGNsZWFuIG9sZGVyIFIgY2xhc3NlcyB3aGVuIHRoZSBhcHAgcGFja2FnZSBuYW1lIGhhcyBjaGFuZ2VkLgorLSBFbmFibGVkIGNydW5jaGluZyBmb3IgYWxsIHBuZyBmaWxlcywgbm90IGp1c3QgLjkucG5nCistIEZpeGVkIGRlYWxpbmcgd2l0aCBub24gcmVzb3VyY2UgZmlsZXMgaW4gcmVzLyBhbmQgYXNzZXRzLworLSBGaXhlZCBjcmFzaCB3aGVuIGRvaW5nIGluY3JlbWVudGFsIGFpZGwgY29tcGlsYXRpb24gZHVlIHRvIGJyb2tlbiBtZXRob2QgbmFtZSAoYWggdGhlIGpveSBvZiBHcm9vdnkuLi4pCistIENsZWFuZWQgb2xkZXIgUiBjbGFzc2VzIHdoZW4gdGhlIGFwcCBwYWNrYWdlIG5hbWUgaGFzIGNoYW5nZWQuCiAKIDAuNC4yCiAKZGlmZiAtLWdpdCBhL2dyYWRsZS1tb2RlbC9idWlsZC5ncmFkbGUgYi9ncmFkbGUtbW9kZWwvYnVpbGQuZ3JhZGxlCmluZGV4IGY0YTg0NTguLjkyOWVhZWIgMTAwNjQ0Ci0tLSBhL2dyYWRsZS1tb2RlbC9idWlsZC5ncmFkbGUKKysrIGIvZ3JhZGxlLW1vZGVsL2J1aWxkLmdyYWRsZQpAQCAtMzAsMTQgKzMwLDYgQEAKIHNvdXJjZVNldHMudGVzdC5jb21waWxlQ2xhc3NwYXRoICs9IGNvbmZpZ3VyYXRpb25zLmdyYWRsZVJlcG8KIHNvdXJjZVNldHMudGVzdC5ydW50aW1lQ2xhc3NwYXRoICs9IGNvbmZpZ3VyYXRpb25zLmdyYWRsZVJlcG8KIAotZGVmIGdldFZlcnNpb24oKSB7Ci0gICAgaWYgKHByb2plY3QuaGFzKCJyZWxlYXNlIikpIHsKLSAgICAgICAgcmV0dXJuIHByb2plY3QuZXh0LmJhc2VWZXJzaW9uCi0gICAgfQotCi0gICAgcmV0dXJuIHByb2plY3QuZXh0LmJhc2VWZXJzaW9uICsgJy1TTkFQU0hPVCcKLX0KLQogdGVzdC5kZXBlbmRzT24gJzpncmFkbGU6cHVibGlzaExvY2FsJwogCiBpZGVhIHsKZGlmZiAtLWdpdCBhL2dyYWRsZS1tb2RlbC9zcmMvdGVzdC9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9tb2RlbC9BbmRyb2lkUHJvamVjdFRlc3QuamF2YSBiL2dyYWRsZS1tb2RlbC9zcmMvdGVzdC9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9tb2RlbC9BbmRyb2lkUHJvamVjdFRlc3QuamF2YQppbmRleCA2ZWYxNGZmLi5kYzQ0ZGM4IDEwMDY0NAotLS0gYS9ncmFkbGUtbW9kZWwvc3JjL3Rlc3QvamF2YS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvbW9kZWwvQW5kcm9pZFByb2plY3RUZXN0LmphdmEKKysrIGIvZ3JhZGxlLW1vZGVsL3NyYy90ZXN0L2phdmEvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL21vZGVsL0FuZHJvaWRQcm9qZWN0VGVzdC5qYXZhCkBAIC0xNywxNSArMTcsMjEgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLm1vZGVsOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLmludGVybmFsLlN0cmluZ0hlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkFuZHJvaWRBcnRpZmFjdDsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkFuZHJvaWRMaWJyYXJ5OwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQW5kcm9pZFByb2plY3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5BcnRpZmFjdEluZm87CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5BcnRpZmFjdE1ldGFEYXRhOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQnVpbGRUeXBlQ29udGFpbmVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuRGVwZW5kZW5jaWVzOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuSmF2YUFydGlmYWN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuSmF2YUNvbXBpbGVPcHRpb25zOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuUHJvZHVjdEZsYXZvcjsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLlByb2R1Y3RGbGF2b3JDb250YWluZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5TaWduaW5nQ29uZmlnOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuU291cmNlUHJvdmlkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Tb3VyY2VQcm92aWRlckNvbnRhaW5lcjsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLlZhcmlhbnQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5zaWduaW5nLktleXN0b3JlSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnByZWZzLkFuZHJvaWRMb2NhdGlvbjsKQEAgLTQxLDE0ICs0NywxNSBAQAogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2U7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkFuZHJvaWRQcm9qZWN0LkFSVElGQUNUX0lOU1RSVU1FTlRfVEVTVDsKIAogcHVibGljIGNsYXNzIEFuZHJvaWRQcm9qZWN0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNT0RFTF9WRVJTSU9OID0gIjAuNS4wLVNOQVBTSE9UIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTU9ERUxfVkVSU0lPTiA9ICIwLjcuMC1TTkFQU0hPVCI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBQcm9qZWN0RGF0YT4gc1Byb2plY3RNb2RlbE1hcCA9IE1hcHMubmV3SGFzaE1hcCgpOwogCkBAIC0xNTQsNiArMTYxLDEwIEBACiAgICAgICAgIGFzc2VydEZhbHNlKCJMaWJyYXJ5IFByb2plY3QiLCBtb2RlbC5pc0xpYnJhcnkoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiQ29tcGlsZSBUYXJnZXQiLCAiYW5kcm9pZC0xNSIsIG1vZGVsLmdldENvbXBpbGVUYXJnZXQoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKCJOb24gZW1wdHkgYm9vdGNsYXNzcGF0aCIsIG1vZGVsLmdldEJvb3RDbGFzc3BhdGgoKS5pc0VtcHR5KCkpOworCisgICAgICAgIEphdmFDb21waWxlT3B0aW9ucyBqYXZhQ29tcGlsZU9wdGlvbnMgPSBtb2RlbC5nZXRKYXZhQ29tcGlsZU9wdGlvbnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLjYiLCBqYXZhQ29tcGlsZU9wdGlvbnMuZ2V0U291cmNlQ29tcGF0aWJpbGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLjYiLCBqYXZhQ29tcGlsZU9wdGlvbnMuZ2V0VGFyZ2V0Q29tcGF0aWJpbGl0eSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNTb3VyY2VQcm92aWRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE2MywxNyArMTc0LDkwIEBACiAgICAgICAgIEFuZHJvaWRQcm9qZWN0IG1vZGVsID0gcHJvamVjdERhdGEubW9kZWw7CiAgICAgICAgIEZpbGUgcHJvamVjdERpciA9IHByb2plY3REYXRhLnByb2plY3REaXI7CiAKKyAgICAgICAgdGVzdERlZmF1bHRTb3VyY2VTZXRzKG1vZGVsLCBwcm9qZWN0RGlyKTsKKworICAgICAgICAvLyB0ZXN0IHRoZSBzb3VyY2UgcHJvdmlkZXIgZm9yIHRoZSBhcnRpZmFjdHMKKyAgICAgICAgZm9yIChWYXJpYW50IHZhcmlhbnQgOiBtb2RlbC5nZXRWYXJpYW50cygpKSB7CisgICAgICAgICAgICBBbmRyb2lkQXJ0aWZhY3QgYXJ0aWZhY3QgPSB2YXJpYW50LmdldE1haW5BcnRpZmFjdCgpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChhcnRpZmFjdC5nZXRWYXJpYW50U291cmNlUHJvdmlkZXIoKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGFydGlmYWN0LmdldE11bHRpRmxhdm9yU291cmNlUHJvdmlkZXIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNdWx0aUZsYXZvcnNTb3VyY2VQcm92aWRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTG9hZCB0aGUgY3VzdG9tIG1vZGVsIGZvciB0aGUgcHJvamVjdAorICAgICAgICBQcm9qZWN0RGF0YSBwcm9qZWN0RGF0YSA9IGdldE1vZGVsRm9yUHJvamVjdCgiYmFzaWNNdWx0aUZsYXZvcnMiKTsKKworICAgICAgICBBbmRyb2lkUHJvamVjdCBtb2RlbCA9IHByb2plY3REYXRhLm1vZGVsOworICAgICAgICBGaWxlIHByb2plY3REaXIgPSBwcm9qZWN0RGF0YS5wcm9qZWN0RGlyOworCisgICAgICAgIHRlc3REZWZhdWx0U291cmNlU2V0cyhtb2RlbCwgcHJvamVjdERpcik7CisKKyAgICAgICAgLy8gdGVzdCB0aGUgc291cmNlIHByb3ZpZGVyIGZvciB0aGUgZmxhdm9yCisgICAgICAgIENvbGxlY3Rpb248UHJvZHVjdEZsYXZvckNvbnRhaW5lcj4gcHJvZHVjdEZsYXZvcnMgPSBtb2RlbC5nZXRQcm9kdWN0Rmxhdm9ycygpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlByb2R1Y3QgRmxhdm9yIENvdW50IiwgNCwgcHJvZHVjdEZsYXZvcnMuc2l6ZSgpKTsKKworICAgICAgICBmb3IgKFByb2R1Y3RGbGF2b3JDb250YWluZXIgcGZDb250YWluZXIgOiBwcm9kdWN0Rmxhdm9ycykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwZkNvbnRhaW5lci5nZXRQcm9kdWN0Rmxhdm9yKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgbmV3IFNvdXJjZVByb3ZpZGVyVGVzdGVyKAorICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIHByb2plY3REaXIsCisgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIHBmQ29udGFpbmVyLmdldFNvdXJjZVByb3ZpZGVyKCkpCisgICAgICAgICAgICAgICAgLnRlc3QoKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBmQ29udGFpbmVyLmdldEV4dHJhU291cmNlUHJvdmlkZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyKAorICAgICAgICAgICAgICAgICAgICBwZkNvbnRhaW5lci5nZXRFeHRyYVNvdXJjZVByb3ZpZGVycygpLCBBUlRJRkFDVF9JTlNUUlVNRU5UX1RFU1QpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb250YWluZXIpOworCisgICAgICAgICAgICBuZXcgU291cmNlUHJvdmlkZXJUZXN0ZXIoCisgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdERpciwKKyAgICAgICAgICAgICAgICAgICAgImluc3RydW1lbnRUZXN0IiArIFN0cmluZ0hlbHBlci5jYXBpdGFsaXplKG5hbWUpLAorICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0U291cmNlUHJvdmlkZXIoKSkKKyAgICAgICAgICAgICAgICAudGVzdCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGVzdCB0aGUgc291cmNlIHByb3ZpZGVyIGZvciB0aGUgYXJ0aWZhY3RzCisgICAgICAgIGZvciAoVmFyaWFudCB2YXJpYW50IDogbW9kZWwuZ2V0VmFyaWFudHMoKSkgeworICAgICAgICAgICAgQW5kcm9pZEFydGlmYWN0IGFydGlmYWN0ID0gdmFyaWFudC5nZXRNYWluQXJ0aWZhY3QoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYXJ0aWZhY3QuZ2V0VmFyaWFudFNvdXJjZVByb3ZpZGVyKCkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhcnRpZmFjdC5nZXRNdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3REZWZhdWx0U291cmNlU2V0cyhATm9uTnVsbCBBbmRyb2lkUHJvamVjdCBtb2RlbCwgQE5vbk51bGwgRmlsZSBwcm9qZWN0RGlyKSB7CiAgICAgICAgIFByb2R1Y3RGbGF2b3JDb250YWluZXIgZGVmYXVsdENvbmZpZyA9IG1vZGVsLmdldERlZmF1bHRDb25maWcoKTsKIAorICAgICAgICAvLyB0ZXN0IHRoZSBtYWluIHNvdXJjZSBwcm92aWRlcgogICAgICAgICBuZXcgU291cmNlUHJvdmlkZXJUZXN0ZXIobW9kZWwuZ2V0TmFtZSgpLCBwcm9qZWN0RGlyLAogICAgICAgICAgICAgICAgICJtYWluIiwgZGVmYXVsdENvbmZpZy5nZXRTb3VyY2VQcm92aWRlcigpKQogICAgICAgICAgICAgICAgIC50ZXN0KCk7CisKKyAgICAgICAgLy8gdGVzdCB0aGUgbWFpbiBpbnN0cnVtZW50VGVzdCBzb3VyY2UgcHJvdmlkZXIKKyAgICAgICAgU291cmNlUHJvdmlkZXJDb250YWluZXIgdGVzdFNvdXJjZVByb3ZpZGVycyA9IGdldFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyKAorICAgICAgICAgICAgICAgIGRlZmF1bHRDb25maWcuZ2V0RXh0cmFTb3VyY2VQcm92aWRlcnMoKSwgQVJUSUZBQ1RfSU5TVFJVTUVOVF9URVNUKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSW5zdHJ1bWVudFRlc3Qgc291cmNlIFByb3ZpZGVycyBudWxsLWNoZWNrIiwgdGVzdFNvdXJjZVByb3ZpZGVycyk7CisKICAgICAgICAgbmV3IFNvdXJjZVByb3ZpZGVyVGVzdGVyKG1vZGVsLmdldE5hbWUoKSwgcHJvamVjdERpciwKLSAgICAgICAgICAgICAgICAiaW5zdHJ1bWVudFRlc3QiLCBkZWZhdWx0Q29uZmlnLmdldFRlc3RTb3VyY2VQcm92aWRlcigpKQorICAgICAgICAgICAgICAgICJpbnN0cnVtZW50VGVzdCIsIHRlc3RTb3VyY2VQcm92aWRlcnMuZ2V0U291cmNlUHJvdmlkZXIoKSkKKyAgICAgICAgICAgIC50ZXN0KCk7CisKKyAgICAgICAgLy8gdGVzdCB0aGUgc291cmNlIHByb3ZpZGVyIGZvciB0aGUgYnVpbGQgdHlwZXMKKyAgICAgICAgQ29sbGVjdGlvbjxCdWlsZFR5cGVDb250YWluZXI+IGJ1aWxkVHlwZXMgPSBtb2RlbC5nZXRCdWlsZFR5cGVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQnVpbGQgVHlwZSBDb3VudCIsIDIsIGJ1aWxkVHlwZXMuc2l6ZSgpKTsKKworICAgICAgICBmb3IgKEJ1aWxkVHlwZUNvbnRhaW5lciBidENvbnRhaW5lciA6IG1vZGVsLmdldEJ1aWxkVHlwZXMoKSkgeworICAgICAgICAgICAgbmV3IFNvdXJjZVByb3ZpZGVyVGVzdGVyKAorICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIHByb2plY3REaXIsCisgICAgICAgICAgICAgICAgICAgIGJ0Q29udGFpbmVyLmdldEJ1aWxkVHlwZSgpLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgYnRDb250YWluZXIuZ2V0U291cmNlUHJvdmlkZXIoKSkKICAgICAgICAgICAgICAgICAudGVzdCgpOwogCi0gICAgICAgIE1hcDxTdHJpbmcsIEJ1aWxkVHlwZUNvbnRhaW5lcj4gYnVpbGRUeXBlcyA9IG1vZGVsLmdldEJ1aWxkVHlwZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJCdWlsZCBUeXBlIENvdW50IiwgMiwgYnVpbGRUeXBlcy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGJ0Q29udGFpbmVyLmdldEV4dHJhU291cmNlUHJvdmlkZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1ZhcmlhbnREZXRhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xODIsNDcgKzI2Niw2MSBAQAogCiAgICAgICAgIEFuZHJvaWRQcm9qZWN0IG1vZGVsID0gcHJvamVjdERhdGEubW9kZWw7CiAKLSAgICAgICAgTWFwPFN0cmluZywgVmFyaWFudD4gdmFyaWFudHMgPSBtb2RlbC5nZXRWYXJpYW50cygpOworICAgICAgICBDb2xsZWN0aW9uPFZhcmlhbnQ+IHZhcmlhbnRzID0gbW9kZWwuZ2V0VmFyaWFudHMoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJWYXJpYW50IENvdW50IiwgMiAsIHZhcmlhbnRzLnNpemUoKSk7CiAKICAgICAgICAgLy8gZGVidWcgdmFyaWFudAotICAgICAgICBWYXJpYW50IGRlYnVnVmFyaWFudCA9IHZhcmlhbnRzLmdldCgiRGVidWciKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRGVidWcgVmFyaWFudCBudWxsLWNoZWNrIiwgZGVidWdWYXJpYW50KTsKKyAgICAgICAgVmFyaWFudCBkZWJ1Z1ZhcmlhbnQgPSBnZXRWYXJpYW50KHZhcmlhbnRzLCAiZGVidWciKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGVidWcgVmFyaWFudCBudWxsLWNoZWNrIiwgZGVidWdWYXJpYW50KTsKICAgICAgICAgbmV3IFByb2R1Y3RGbGF2b3JUZXN0ZXIoZGVidWdWYXJpYW50LmdldE1lcmdlZEZsYXZvcigpLCAiRGVidWcgTWVyZ2VkIEZsYXZvciIpCiAgICAgICAgICAgICAgICAgLnNldFZlcnNpb25Db2RlKDEyKQogICAgICAgICAgICAgICAgIC5zZXRWZXJzaW9uTmFtZSgiMi4wIikKICAgICAgICAgICAgICAgICAuc2V0TWluU2RrVmVyc2lvbigxNikKICAgICAgICAgICAgICAgICAuc2V0VGFyZ2V0U2RrVmVyc2lvbigxNikKLSAgICAgICAgICAgICAgICAudGVzdCgpOworICAgICAgICAgICAgICAgIC5zZXRUZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyKCJhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIpCisgICAgICAgICAgICAgICAgLnNldFRlc3RIYW5kbGVQcm9maWxpbmcoQm9vbGVhbi5GQUxTRSkKKyAgICAgICAgICAgICAgICAuc2V0VGVzdEZ1bmN0aW9uYWxUZXN0KG51bGwpCisgICAgICAgICAgICAudGVzdCgpOwogCi0gICAgICAgIEFydGlmYWN0SW5mbyBkZWJ1Z01haW5JbmZvID0gZGVidWdWYXJpYW50LmdldE1haW5BcnRpZmFjdEluZm8oKTsKKyAgICAgICAgQW5kcm9pZEFydGlmYWN0IGRlYnVnTWFpbkluZm8gPSBkZWJ1Z1ZhcmlhbnQuZ2V0TWFpbkFydGlmYWN0KCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoIkRlYnVnIG1haW4gaW5mbyBudWxsLWNoZWNrIiwgZGVidWdNYWluSW5mbyk7CiAgICAgICAgIGFzc2VydEVxdWFscygiRGVidWcgcGFja2FnZSBuYW1lIiwgImNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljLmRlYnVnIiwKICAgICAgICAgICAgICAgICBkZWJ1Z01haW5JbmZvLmdldFBhY2thZ2VOYW1lKCkpOwogICAgICAgICBhc3NlcnRUcnVlKCJEZWJ1ZyBzaWduZWQgY2hlY2siLCBkZWJ1Z01haW5JbmZvLmlzU2lnbmVkKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkRlYnVnIHNpZ25pbmdDb25maWcgbmFtZSIsICJteUNvbmZpZyIsIGRlYnVnTWFpbkluZm8uZ2V0U2lnbmluZ0NvbmZpZ05hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRGVidWcgc291cmNlR2VuVGFzayIsICJnZW5lcmF0ZURlYnVnU291cmNlcyIsIGRlYnVnTWFpbkluZm8uZ2V0U291cmNlR2VuVGFza05hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRGVidWcgamF2YUNvbXBpbGVUYXNrIiwgImNvbXBpbGVEZWJ1Z0phdmEiLCBkZWJ1Z01haW5JbmZvLmdldEphdmFDb21waWxlVGFza05hbWUoKSk7CisKKyAgICAgICAgQ29sbGVjdGlvbjxBbmRyb2lkQXJ0aWZhY3Q+IGRlYnVnRXh0cmFBbmRyb2lkQXJ0aWZhY3RzID0gZGVidWdWYXJpYW50LmdldEV4dHJhQW5kcm9pZEFydGlmYWN0cygpOworCiAKICAgICAgICAgLy8gdGhpcyB2YXJpYW50IGlzIHRlc3RlZC4KLSAgICAgICAgQXJ0aWZhY3RJbmZvIGRlYnVnVGVzdEluZm8gPSBkZWJ1Z1ZhcmlhbnQuZ2V0VGVzdEFydGlmYWN0SW5mbygpOworICAgICAgICBBbmRyb2lkQXJ0aWZhY3QgZGVidWdUZXN0SW5mbyA9IGdldEFuZHJvaWRBcnRpZmFjdChkZWJ1Z0V4dHJhQW5kcm9pZEFydGlmYWN0cywKKyAgICAgICAgICAgICAgICBBUlRJRkFDVF9JTlNUUlVNRU5UX1RFU1QpOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJUZXN0IGluZm8gbnVsbC1jaGVjayIsIGRlYnVnVGVzdEluZm8pOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlRlc3QgcGFja2FnZSBuYW1lIiwgImNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljLmRlYnVnLnRlc3QiLAogICAgICAgICAgICAgICAgIGRlYnVnVGVzdEluZm8uZ2V0UGFja2FnZU5hbWUoKSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoIlRlc3Qgb3V0cHV0IGZpbGUgbnVsbC1jaGVjayIsIGRlYnVnVGVzdEluZm8uZ2V0T3V0cHV0RmlsZSgpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCBzaWduZWQgY2hlY2siLCBkZWJ1Z1Rlc3RJbmZvLmlzU2lnbmVkKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlRlc3Qgc2lnbmluZ0NvbmZpZyBuYW1lIiwgIm15Q29uZmlnIiwgZGVidWdUZXN0SW5mby5nZXRTaWduaW5nQ29uZmlnTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0IHNvdXJjZUdlblRhc2siLCAiZ2VuZXJhdGVEZWJ1Z1Rlc3RTb3VyY2VzIiwgZGVidWdUZXN0SW5mby5nZXRTb3VyY2VHZW5UYXNrTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0IGphdmFDb21waWxlVGFzayIsICJjb21waWxlRGVidWdUZXN0SmF2YSIsIGRlYnVnVGVzdEluZm8uZ2V0SmF2YUNvbXBpbGVUYXNrTmFtZSgpKTsKIAogICAgICAgICAvLyByZWxlYXNlIHZhcmlhbnQsIG5vdCB0ZXN0ZWQuCi0gICAgICAgIFZhcmlhbnQgcmVsZWFzZVZhcmlhbnQgPSB2YXJpYW50cy5nZXQoIlJlbGVhc2UiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUmVsZWFzZSBWYXJpYW50IG51bGwtY2hlY2siLCByZWxlYXNlVmFyaWFudCk7CisgICAgICAgIFZhcmlhbnQgcmVsZWFzZVZhcmlhbnQgPSBnZXRWYXJpYW50KHZhcmlhbnRzLCAicmVsZWFzZSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJyZWxlYXNlIFZhcmlhbnQgbnVsbC1jaGVjayIsIHJlbGVhc2VWYXJpYW50KTsKIAotICAgICAgICBBcnRpZmFjdEluZm8gcmVsTWFpbkluZm8gPSByZWxlYXNlVmFyaWFudC5nZXRNYWluQXJ0aWZhY3RJbmZvKCk7CisgICAgICAgIEFuZHJvaWRBcnRpZmFjdCByZWxNYWluSW5mbyA9IHJlbGVhc2VWYXJpYW50LmdldE1haW5BcnRpZmFjdCgpOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJSZWxlYXNlIG1haW4gaW5mbyBudWxsLWNoZWNrIiwgcmVsTWFpbkluZm8pOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlJlbGVhc2UgcGFja2FnZSBuYW1lIiwgImNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljIiwKICAgICAgICAgICAgICAgICByZWxNYWluSW5mby5nZXRQYWNrYWdlTmFtZSgpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIlJlbGVhc2Ugc2lnbmVkIGNoZWNrIiwgcmVsTWFpbkluZm8uaXNTaWduZWQoKSk7CiAgICAgICAgIGFzc2VydE51bGwoIlJlbGVhc2Ugc2lnbmluZ0NvbmZpZyBuYW1lIiwgcmVsTWFpbkluZm8uZ2V0U2lnbmluZ0NvbmZpZ05hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUmVsZWFzZSBzb3VyY2VHZW5UYXNrIiwgImdlbmVyYXRlUmVsZWFzZVNvdXJjZXMiLCByZWxNYWluSW5mby5nZXRTb3VyY2VHZW5UYXNrTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZWxlYXNlIGphdmFDb21waWxlVGFzayIsICJjb21waWxlUmVsZWFzZUphdmEiLCByZWxNYWluSW5mby5nZXRKYXZhQ29tcGlsZVRhc2tOYW1lKCkpOwogCi0gICAgICAgIEFydGlmYWN0SW5mbyByZWxUZXN0SW5mbyA9IHJlbGVhc2VWYXJpYW50LmdldFRlc3RBcnRpZmFjdEluZm8oKTsKKyAgICAgICAgQ29sbGVjdGlvbjxBbmRyb2lkQXJ0aWZhY3Q+IHJlbGVhc2VFeHRyYUFuZHJvaWRBcnRpZmFjdHMgPSByZWxlYXNlVmFyaWFudC5nZXRFeHRyYUFuZHJvaWRBcnRpZmFjdHMoKTsKKyAgICAgICAgQW5kcm9pZEFydGlmYWN0IHJlbFRlc3RJbmZvID0gZ2V0QW5kcm9pZEFydGlmYWN0KHJlbGVhc2VFeHRyYUFuZHJvaWRBcnRpZmFjdHMsIEFSVElGQUNUX0lOU1RSVU1FTlRfVEVTVCk7CiAgICAgICAgIGFzc2VydE51bGwoIlJlbGVhc2UgdGVzdCBpbmZvIG51bGwtY2hlY2siLCByZWxUZXN0SW5mbyk7CiAKICAgICAgICAgLy8gY2hlY2sgZGVidWcgZGVwZW5kZW5jaWVzCkBAIC0yMzEsNyArMzI5LDcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGRlcGVuZGVuY2llcy5nZXRKYXJzKCkuc2l6ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGRlcGVuZGVuY2llcy5nZXRMaWJyYXJpZXMoKS5zaXplKCkpOwogCi0gICAgICAgIEFuZHJvaWRMaWJyYXJ5IGxpYiA9IGRlcGVuZGVuY2llcy5nZXRMaWJyYXJpZXMoKS5nZXQoMCk7CisgICAgICAgIEFuZHJvaWRMaWJyYXJ5IGxpYiA9IGRlcGVuZGVuY2llcy5nZXRMaWJyYXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChsaWIpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGxpYi5nZXRCdW5kbGUoKSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwobGliLmdldEZvbGRlcigpKTsKQEAgLTI0NSwxMiArMzQzLDE2IEBACiAKICAgICAgICAgQW5kcm9pZFByb2plY3QgbW9kZWwgPSBwcm9qZWN0RGF0YS5tb2RlbDsKIAotICAgICAgICBhc3NlcnRFcXVhbHMoIk51bWJlciBvZiBzaWduaW5nQ29uZmlnIiwgMiwgbW9kZWwuZ2V0U2lnbmluZ0NvbmZpZ3MoKS5zaXplKCkpOworICAgICAgICBDb2xsZWN0aW9uPFNpZ25pbmdDb25maWc+IHNpZ25pbmdDb25maWdzID0gbW9kZWwuZ2V0U2lnbmluZ0NvbmZpZ3MoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2lnbmluZ0NvbmZpZ3MgbnVsbC1jaGVjayIsIHNpZ25pbmdDb25maWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOdW1iZXIgb2Ygc2lnbmluZ0NvbmZpZyIsIDIsIHNpZ25pbmdDb25maWdzLnNpemUoKSk7CiAKLSAgICAgICAgU2lnbmluZ0NvbmZpZyBkZWJ1Z1NpZ25pbmdDb25maWcgPSBtb2RlbC5nZXRTaWduaW5nQ29uZmlncygpLmdldCgiZGVidWciKTsKKyAgICAgICAgU2lnbmluZ0NvbmZpZyBkZWJ1Z1NpZ25pbmdDb25maWcgPSBnZXRTaWduaW5nQ29uZmlnKHNpZ25pbmdDb25maWdzLCAiZGVidWciKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGVidWcgc2lnbmluZyBjb25maWcgbnVsbC1jaGVjayIsIGRlYnVnU2lnbmluZ0NvbmZpZyk7CiAgICAgICAgIG5ldyBTaWduaW5nQ29uZmlnVGVzdGVyKGRlYnVnU2lnbmluZ0NvbmZpZywgImRlYnVnIiwgdHJ1ZSkudGVzdCgpOwogCi0gICAgICAgIFNpZ25pbmdDb25maWcgbXlTaWduaW5nQ29uZmlnID0gbW9kZWwuZ2V0U2lnbmluZ0NvbmZpZ3MoKS5nZXQoIm15Q29uZmlnIik7CisgICAgICAgIFNpZ25pbmdDb25maWcgbXlTaWduaW5nQ29uZmlnID0gZ2V0U2lnbmluZ0NvbmZpZyhzaWduaW5nQ29uZmlncywgIm15Q29uZmlnIik7CisgICAgICAgIGFzc2VydE5vdE51bGwoIm15Q29uZmlnIHNpZ25pbmcgY29uZmlnIG51bGwtY2hlY2siLCBteVNpZ25pbmdDb25maWcpOwogICAgICAgICBuZXcgU2lnbmluZ0NvbmZpZ1Rlc3RlcihteVNpZ25pbmdDb25maWcsICJteUNvbmZpZyIsIHRydWUpCiAgICAgICAgICAgICAgICAgLnNldFN0b3JlRmlsZShuZXcgRmlsZShwcm9qZWN0RGF0YS5wcm9qZWN0RGlyLCAiZGVidWcua2V5c3RvcmUiKSkKICAgICAgICAgICAgICAgICAudGVzdCgpOwpAQCAtMjgwLDggKzM4MiwxMiBAQAogICAgICAgICAgICAgICAgIC5zZXRNYW5pZmVzdEZpbGUoIkFuZHJvaWRNYW5pZmVzdC54bWwiKQogICAgICAgICAgICAgICAgIC50ZXN0KCk7CiAKKyAgICAgICAgU291cmNlUHJvdmlkZXJDb250YWluZXIgdGVzdFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyID0gZ2V0U291cmNlUHJvdmlkZXJDb250YWluZXIoCisgICAgICAgICAgICAgICAgZGVmYXVsdENvbmZpZy5nZXRFeHRyYVNvdXJjZVByb3ZpZGVycygpLCBBUlRJRkFDVF9JTlNUUlVNRU5UX1RFU1QpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJJbnN0cnVtZW50VGVzdCBzb3VyY2UgUHJvdmlkZXJzIG51bGwtY2hlY2siLCB0ZXN0U291cmNlUHJvdmlkZXJDb250YWluZXIpOworCiAgICAgICAgIG5ldyBTb3VyY2VQcm92aWRlclRlc3Rlcihtb2RlbC5nZXROYW1lKCksIHByb2plY3REaXIsCi0gICAgICAgICAgICAgICAgImluc3RydW1lbnRUZXN0IiwgZGVmYXVsdENvbmZpZy5nZXRUZXN0U291cmNlUHJvdmlkZXIoKSkKKyAgICAgICAgICAgICAgICAiaW5zdHJ1bWVudFRlc3QiLCB0ZXN0U291cmNlUHJvdmlkZXJDb250YWluZXIuZ2V0U291cmNlUHJvdmlkZXIoKSkKICAgICAgICAgICAgICAgICAuc2V0SmF2YURpcigidGVzdHMvamF2YSIpCiAgICAgICAgICAgICAgICAgLnNldFJlc291cmNlc0RpcigidGVzdHMvcmVzb3VyY2VzIikKICAgICAgICAgICAgICAgICAuc2V0QWlkbERpcigidGVzdHMvYWlkbCIpCkBAIC0zMDMsMTMgKzQwOSwxMyBAQAogICAgICAgICBhc3NlcnROb3ROdWxsKCJNb2RlbCBPYmplY3QgbnVsbC1jaGVjayIsIG1vZGVsKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJNb2RlbCBOYW1lIiwgInJlbmFtZWRBcGsiLCBtb2RlbC5nZXROYW1lKCkpOwogCi0gICAgICAgIE1hcDxTdHJpbmcsIFZhcmlhbnQ+IHZhcmlhbnRzID0gbW9kZWwuZ2V0VmFyaWFudHMoKTsKKyAgICAgICAgQ29sbGVjdGlvbjxWYXJpYW50PiB2YXJpYW50cyA9IG1vZGVsLmdldFZhcmlhbnRzKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiVmFyaWFudCBDb3VudCIsIDIgLCB2YXJpYW50cy5zaXplKCkpOwogCiAgICAgICAgIEZpbGUgYnVpbGREaXIgPSBuZXcgRmlsZShwcm9qZWN0RGlyLCAiYnVpbGQiKTsKIAotICAgICAgICBmb3IgKFZhcmlhbnQgdmFyaWFudCA6IHZhcmlhbnRzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBBcnRpZmFjdEluZm8gbWFpbkluZm8gPSB2YXJpYW50LmdldE1haW5BcnRpZmFjdEluZm8oKTsKKyAgICAgICAgZm9yIChWYXJpYW50IHZhcmlhbnQgOiB2YXJpYW50cykgeworICAgICAgICAgICAgQW5kcm9pZEFydGlmYWN0IG1haW5JbmZvID0gdmFyaWFudC5nZXRNYWluQXJ0aWZhY3QoKTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoCiAgICAgICAgICAgICAgICAgICAgICJOdWxsLWNoZWNrIG9uIG1haW5BcnRpZmFjdEluZm8gZm9yICIgKyB2YXJpYW50LmdldERpc3BsYXlOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgIG1haW5JbmZvKTsKQEAgLTMzNiwyMSArNDQyLDI2IEBACiAgICAgICAgIG5ldyBTb3VyY2VQcm92aWRlclRlc3Rlcihtb2RlbC5nZXROYW1lKCksIHByb2plY3REaXIsCiAgICAgICAgICAgICAgICAgIm1haW4iLCBkZWZhdWx0Q29uZmlnLmdldFNvdXJjZVByb3ZpZGVyKCkpCiAgICAgICAgICAgICAgICAgLnRlc3QoKTsKKworICAgICAgICBTb3VyY2VQcm92aWRlckNvbnRhaW5lciB0ZXN0U291cmNlUHJvdmlkZXJDb250YWluZXIgPSBnZXRTb3VyY2VQcm92aWRlckNvbnRhaW5lcigKKyAgICAgICAgICAgICAgICBkZWZhdWx0Q29uZmlnLmdldEV4dHJhU291cmNlUHJvdmlkZXJzKCksIEFSVElGQUNUX0lOU1RSVU1FTlRfVEVTVCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkluc3RydW1lbnRUZXN0IHNvdXJjZSBQcm92aWRlcnMgbnVsbC1jaGVjayIsIHRlc3RTb3VyY2VQcm92aWRlckNvbnRhaW5lcik7CisKICAgICAgICAgbmV3IFNvdXJjZVByb3ZpZGVyVGVzdGVyKG1vZGVsLmdldE5hbWUoKSwgcHJvamVjdERpciwKLSAgICAgICAgICAgICAgICAiaW5zdHJ1bWVudFRlc3QiLCBkZWZhdWx0Q29uZmlnLmdldFRlc3RTb3VyY2VQcm92aWRlcigpKQorICAgICAgICAgICAgICAgICJpbnN0cnVtZW50VGVzdCIsIHRlc3RTb3VyY2VQcm92aWRlckNvbnRhaW5lci5nZXRTb3VyY2VQcm92aWRlcigpKQogICAgICAgICAgICAgICAgIC50ZXN0KCk7CiAKLSAgICAgICAgTWFwPFN0cmluZywgQnVpbGRUeXBlQ29udGFpbmVyPiBidWlsZFR5cGVzID0gbW9kZWwuZ2V0QnVpbGRUeXBlcygpOworICAgICAgICBDb2xsZWN0aW9uPEJ1aWxkVHlwZUNvbnRhaW5lcj4gYnVpbGRUeXBlcyA9IG1vZGVsLmdldEJ1aWxkVHlwZXMoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJCdWlsZCBUeXBlIENvdW50IiwgMiwgYnVpbGRUeXBlcy5zaXplKCkpOwogCi0gICAgICAgIE1hcDxTdHJpbmcsIFZhcmlhbnQ+IHZhcmlhbnRzID0gbW9kZWwuZ2V0VmFyaWFudHMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJWYXJpYW50IENvdW50IiwgOCAsIHZhcmlhbnRzLnNpemUoKSk7CisgICAgICAgIENvbGxlY3Rpb248VmFyaWFudD4gdmFyaWFudHMgPSBtb2RlbC5nZXRWYXJpYW50cygpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlZhcmlhbnQgQ291bnQiLCA4LCB2YXJpYW50cy5zaXplKCkpOwogCi0gICAgICAgIFZhcmlhbnQgZjFmYURlYnVnVmFyaWFudCA9IHZhcmlhbnRzLmdldCgiRjFGYURlYnVnIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkYxZmFEZWJ1ZyBWYXJpYW50IG51bGwtY2hlY2siLCBmMWZhRGVidWdWYXJpYW50KTsKKyAgICAgICAgVmFyaWFudCBmMWZhRGVidWdWYXJpYW50ID0gZ2V0VmFyaWFudCh2YXJpYW50cywgImYxRmFEZWJ1ZyIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJmMWZhRGVidWcgVmFyaWFudCBudWxsLWNoZWNrIiwgZjFmYURlYnVnVmFyaWFudCk7CiAgICAgICAgIG5ldyBQcm9kdWN0Rmxhdm9yVGVzdGVyKGYxZmFEZWJ1Z1ZhcmlhbnQuZ2V0TWVyZ2VkRmxhdm9yKCksICJGMWZhRGVidWcgTWVyZ2VkIEZsYXZvciIpCiAgICAgICAgICAgICAgICAgLnRlc3QoKTsKLSAgICAgICAgbmV3IFZhcmlhbnRUZXN0ZXIoZjFmYURlYnVnVmFyaWFudCwgcHJvamVjdERpciwgImZsYXZvcnMtZjFmYS1kZWJ1Zy11bmFsaWduZWQuYXBrIikudGVzdCgpOworICAgICAgICBuZXcgVmFyaWFudFRlc3RlcihmMWZhRGVidWdWYXJpYW50LCBwcm9qZWN0RGlyLCAiZmxhdm9ycy1mMS1mYS1kZWJ1Zy11bmFsaWduZWQuYXBrIikudGVzdCgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RUaWNUYWNUb2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTM2MywxNCArNDc0LDE4IEBACiAgICAgICAgIFByb2plY3REYXRhIGFwcE1vZGVsRGF0YSA9IG1hcC5nZXQoIjphcHAiKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiYXBwIG1vZHVsZSBtb2RlbCBudWxsLWNoZWNrIiwgYXBwTW9kZWxEYXRhKTsKIAotICAgICAgICBEZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzID0gYXBwTW9kZWxEYXRhLm1vZGVsLmdldFZhcmlhbnRzKCkuZ2V0KCJEZWJ1ZyIpLmdldE1haW5BcnRpZmFjdEluZm8oKS5nZXREZXBlbmRlbmNpZXMoKTsKKyAgICAgICAgQ29sbGVjdGlvbjxWYXJpYW50PiB2YXJpYW50cyA9IGFwcE1vZGVsRGF0YS5tb2RlbC5nZXRWYXJpYW50cygpOworICAgICAgICBWYXJpYW50IGRlYnVnVmFyaWFudCA9IGdldFZhcmlhbnQodmFyaWFudHMsICJkZWJ1ZyIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJkZWJ1ZyB2YXJpYW50IG51bGwtY2hlY2siLCBkZWJ1Z1ZhcmlhbnQpOworCisgICAgICAgIERlcGVuZGVuY2llcyBkZXBlbmRlbmNpZXMgPSBkZWJ1Z1ZhcmlhbnQuZ2V0TWFpbkFydGlmYWN0KCkuZ2V0RGVwZW5kZW5jaWVzKCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoZGVwZW5kZW5jaWVzKTsKIAotICAgICAgICBMaXN0PEFuZHJvaWRMaWJyYXJ5PiBsaWJzID0gZGVwZW5kZW5jaWVzLmdldExpYnJhcmllcygpOworICAgICAgICBDb2xsZWN0aW9uPEFuZHJvaWRMaWJyYXJ5PiBsaWJzID0gZGVwZW5kZW5jaWVzLmdldExpYnJhcmllcygpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGxpYnMpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbGlicy5zaXplKCkpOwogCi0gICAgICAgIEFuZHJvaWRMaWJyYXJ5IGFuZHJvaWRMaWJyYXJ5ID0gbGlicy5nZXQoMCk7CisgICAgICAgIEFuZHJvaWRMaWJyYXJ5IGFuZHJvaWRMaWJyYXJ5ID0gbGlicy5pdGVyYXRvcigpLm5leHQoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbmRyb2lkTGlicmFyeSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZXBlbmRlbmN5IHByb2plY3QgcGF0aCIsICI6bGliIiwgYW5kcm9pZExpYnJhcnkuZ2V0UHJvamVjdCgpKTsKQEAgLTM4OCwzNiArNTAzLDM3IEBACiAKICAgICAgICAgYXNzZXJ0RmFsc2UoIkxpYnJhcnkgUHJvamVjdCIsIG1vZGVsLmlzTGlicmFyeSgpKTsKIAotICAgICAgICBNYXA8U3RyaW5nLCBWYXJpYW50PiB2YXJpYW50cyA9IG1vZGVsLmdldFZhcmlhbnRzKCk7CisgICAgICAgIENvbGxlY3Rpb248VmFyaWFudD4gdmFyaWFudHMgPSBtb2RlbC5nZXRWYXJpYW50cygpOworICAgICAgICBDb2xsZWN0aW9uPFByb2R1Y3RGbGF2b3JDb250YWluZXI+IHByb2R1Y3RGbGF2b3JzID0gbW9kZWwuZ2V0UHJvZHVjdEZsYXZvcnMoKTsKIAotICAgICAgICBQcm9kdWN0Rmxhdm9yQ29udGFpbmVyIGZsYXZvcjEgPSBtb2RlbC5nZXRQcm9kdWN0Rmxhdm9ycygpLmdldCgiZmxhdm9yMSIpOworICAgICAgICBQcm9kdWN0Rmxhdm9yQ29udGFpbmVyIGZsYXZvcjEgPSBnZXRQcm9kdWN0Rmxhdm9yKHByb2R1Y3RGbGF2b3JzLCAiZmxhdm9yMSIpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGZsYXZvcjEpOwogCi0gICAgICAgIFZhcmlhbnQgZmxhdm9yMURlYnVnID0gdmFyaWFudHMuZ2V0KCJGbGF2b3IxRGVidWciKTsKKyAgICAgICAgVmFyaWFudCBmbGF2b3IxRGVidWcgPSBnZXRWYXJpYW50KHZhcmlhbnRzLCAiZmxhdm9yMURlYnVnIik7CiAgICAgICAgIGFzc2VydE5vdE51bGwoZmxhdm9yMURlYnVnKTsKIAotICAgICAgICBEZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzID0gZmxhdm9yMURlYnVnLmdldE1haW5BcnRpZmFjdEluZm8oKS5nZXREZXBlbmRlbmNpZXMoKTsKKyAgICAgICAgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcyA9IGZsYXZvcjFEZWJ1Zy5nZXRNYWluQXJ0aWZhY3QoKS5nZXREZXBlbmRlbmNpZXMoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXBlbmRlbmNpZXMpOwotICAgICAgICBMaXN0PEFuZHJvaWRMaWJyYXJ5PiBsaWJzID0gZGVwZW5kZW5jaWVzLmdldExpYnJhcmllcygpOworICAgICAgICBDb2xsZWN0aW9uPEFuZHJvaWRMaWJyYXJ5PiBsaWJzID0gZGVwZW5kZW5jaWVzLmdldExpYnJhcmllcygpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGxpYnMpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbGlicy5zaXplKCkpOwotICAgICAgICBBbmRyb2lkTGlicmFyeSBhbmRyb2lkTGlicmFyeSA9IGxpYnMuZ2V0KDApOworICAgICAgICBBbmRyb2lkTGlicmFyeSBhbmRyb2lkTGlicmFyeSA9IGxpYnMuaXRlcmF0b3IoKS5uZXh0KCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoYW5kcm9pZExpYnJhcnkpOwogICAgICAgICAvLyBUT0RPOiByaWdodCBub3cgd2UgY2FuIG9ubHkgdGVzdCB0aGUgZm9sZGVyIG5hbWUgZWZmaWNpZW50bHkKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGbGF2b3JsaWJMaWIxVW5zcGVjaWZpZWQuYWFyIiwgYW5kcm9pZExpYnJhcnkuZ2V0Rm9sZGVyKCkuZ2V0TmFtZSgpKTsKIAotICAgICAgICBQcm9kdWN0Rmxhdm9yQ29udGFpbmVyIGZsYXZvcjIgPSBtb2RlbC5nZXRQcm9kdWN0Rmxhdm9ycygpLmdldCgiZmxhdm9yMiIpOworICAgICAgICBQcm9kdWN0Rmxhdm9yQ29udGFpbmVyIGZsYXZvcjIgPSBnZXRQcm9kdWN0Rmxhdm9yKHByb2R1Y3RGbGF2b3JzLCAiZmxhdm9yMiIpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGZsYXZvcjIpOwogCi0gICAgICAgIFZhcmlhbnQgZmxhdm9yMkRlYnVnID0gdmFyaWFudHMuZ2V0KCJGbGF2b3IyRGVidWciKTsKKyAgICAgICAgVmFyaWFudCBmbGF2b3IyRGVidWcgPSBnZXRWYXJpYW50KHZhcmlhbnRzLCAiZmxhdm9yMkRlYnVnIik7CiAgICAgICAgIGFzc2VydE5vdE51bGwoZmxhdm9yMkRlYnVnKTsKIAotICAgICAgICBkZXBlbmRlbmNpZXMgPSBmbGF2b3IyRGVidWcuZ2V0TWFpbkFydGlmYWN0SW5mbygpLmdldERlcGVuZGVuY2llcygpOworICAgICAgICBkZXBlbmRlbmNpZXMgPSBmbGF2b3IyRGVidWcuZ2V0TWFpbkFydGlmYWN0KCkuZ2V0RGVwZW5kZW5jaWVzKCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoZGVwZW5kZW5jaWVzKTsKICAgICAgICAgbGlicyA9IGRlcGVuZGVuY2llcy5nZXRMaWJyYXJpZXMoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChsaWJzKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGxpYnMuc2l6ZSgpKTsKLSAgICAgICAgYW5kcm9pZExpYnJhcnkgPSBsaWJzLmdldCgwKTsKKyAgICAgICAgYW5kcm9pZExpYnJhcnkgPSBsaWJzLml0ZXJhdG9yKCkubmV4dCgpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGFuZHJvaWRMaWJyYXJ5KTsKICAgICAgICAgLy8gVE9ETzogcmlnaHQgbm93IHdlIGNhbiBvbmx5IHRlc3QgdGhlIGZvbGRlciBuYW1lIGVmZmljaWVudGx5CiAgICAgICAgIGFzc2VydEVxdWFscygiRmxhdm9ybGliTGliMlVuc3BlY2lmaWVkLmFhciIsIGFuZHJvaWRMaWJyYXJ5LmdldEZvbGRlcigpLmdldE5hbWUoKSk7CkBAIC00MzAsMjkgKzU0NiwxNjEgQEAKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTW9kdWxlIGFwcCBudWxsLWNoZWNrIiwgYmFzZUxpYk1vZGVsRGF0YSk7CiAgICAgICAgIEFuZHJvaWRQcm9qZWN0IG1vZGVsID0gYmFzZUxpYk1vZGVsRGF0YS5tb2RlbDsKIAotICAgICAgICBNYXA8U3RyaW5nLCBWYXJpYW50PiB2YXJpYW50cyA9IG1vZGVsLmdldFZhcmlhbnRzKCk7CisgICAgICAgIENvbGxlY3Rpb248VmFyaWFudD4gdmFyaWFudHMgPSBtb2RlbC5nZXRWYXJpYW50cygpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlZhcmlhbnQgY291bnQiLCAyLCB2YXJpYW50cy5zaXplKCkpOwogCi0gICAgICAgIFZhcmlhbnQgdmFyaWFudCA9IHZhcmlhbnRzLmdldCgiUmVsZWFzZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJSZWxlYXNlIHZhcmlhbnQgbnVsbC1jaGVjayIsIHZhcmlhbnQpOworICAgICAgICBWYXJpYW50IHZhcmlhbnQgPSBnZXRWYXJpYW50KHZhcmlhbnRzLCAicmVsZWFzZSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJyZWxlYXNlIHZhcmlhbnQgbnVsbC1jaGVjayIsIHZhcmlhbnQpOwogCi0gICAgICAgIEFydGlmYWN0SW5mbyBtYWluSW5mbyA9IHZhcmlhbnQuZ2V0TWFpbkFydGlmYWN0SW5mbygpOworICAgICAgICBBbmRyb2lkQXJ0aWZhY3QgbWFpbkluZm8gPSB2YXJpYW50LmdldE1haW5BcnRpZmFjdCgpOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJNYWluIEFydGlmYWN0IG51bGwtY2hlY2siLCBtYWluSW5mbyk7CiAKICAgICAgICAgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcyA9IG1haW5JbmZvLmdldERlcGVuZGVuY2llcygpOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJEZXBlbmRlbmNpZXMgbnVsbC1jaGVjayIsIGRlcGVuZGVuY2llcyk7CiAKLSAgICAgICAgTGlzdDxTdHJpbmc+IHByb2plY3RzID0gZGVwZW5kZW5jaWVzLmdldFByb2plY3RzKCk7CisgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBwcm9qZWN0cyA9IGRlcGVuZGVuY2llcy5nZXRQcm9qZWN0cygpOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJwcm9qZWN0IGRlcCBsaXN0IG51bGwtY2hlY2siLCBwcm9qZWN0cyk7CiAgICAgICAgIGFzc2VydEVxdWFscygicHJvamVjdCBkZXAgY291bnQiLCAxLCBwcm9qZWN0cy5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRlcCBvbiA6dXRpbCBjaGVjayIsICI6dXRpbCIsIHByb2plY3RzLmdldCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVwIG9uIDp1dGlsIGNoZWNrIiwgIjp1dGlsIiwgcHJvamVjdHMuaXRlcmF0b3IoKS5uZXh0KCkpOwogCi0gICAgICAgIExpc3Q8RmlsZT4gamFycyA9IGRlcGVuZGVuY2llcy5nZXRKYXJzKCk7CisgICAgICAgIENvbGxlY3Rpb248RmlsZT4gamFycyA9IGRlcGVuZGVuY2llcy5nZXRKYXJzKCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoImphciBkZXAgbGlzdCBudWxsLWNoZWNrIiwgamFycyk7CiAgICAgICAgIC8vIFRPRE8gdGhlc2UgYXJlIGphcnMgY29taW5nIGZyb20gJzp1dGlsJyBUaGV5IHNob3VsZG4ndCBiZSB0aGVyZS4KICAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXIgZGVwIGNvdW50IiwgMiwgamFycy5zaXplKCkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5Gb2xkZXJBcGkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTG9hZCB0aGUgY3VzdG9tIG1vZGVsIGZvciB0aGUgcHJvamVjdAorICAgICAgICBQcm9qZWN0RGF0YSBwcm9qZWN0RGF0YSA9IGdldE1vZGVsRm9yUHJvamVjdCgiZ2VuRm9sZGVyQXBpIik7CisKKyAgICAgICAgQW5kcm9pZFByb2plY3QgbW9kZWwgPSBwcm9qZWN0RGF0YS5tb2RlbDsKKyAgICAgICAgRmlsZSBwcm9qZWN0RGlyID0gcHJvamVjdERhdGEucHJvamVjdERpcjsKKworICAgICAgICBGaWxlIGJ1aWxkRGlyID0gbmV3IEZpbGUocHJvamVjdERpciwgImJ1aWxkIik7CisKKyAgICAgICAgZm9yIChWYXJpYW50IHZhcmlhbnQgOiBtb2RlbC5nZXRWYXJpYW50cygpKSB7CisKKyAgICAgICAgICAgIEFuZHJvaWRBcnRpZmFjdCBtYWluSW5mbyA9IHZhcmlhbnQuZ2V0TWFpbkFydGlmYWN0KCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKAorICAgICAgICAgICAgICAgICAgICAiTnVsbC1jaGVjayBvbiBtYWluQXJ0aWZhY3RJbmZvIGZvciAiICsgdmFyaWFudC5nZXREaXNwbGF5TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBtYWluSW5mbyk7CisKKyAgICAgICAgICAgIC8vIGdldCB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmb2xkZXJzLgorICAgICAgICAgICAgQ29sbGVjdGlvbjxGaWxlPiBnZW5Gb2xkZXIgPSBtYWluSW5mby5nZXRHZW5lcmF0ZWRTb3VyY2VGb2xkZXJzKCk7CisKKyAgICAgICAgICAgIC8vIFdlJ3JlIGxvb2tpbmcgZm9yIGEgY3VzdG9tIGZvbGRlcgorICAgICAgICAgICAgU3RyaW5nIGZvbGRlclN0YXJ0ID0gbmV3IEZpbGUoYnVpbGREaXIsICJjdXN0b21Db2RlIikuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvckNoYXI7CisgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKEZpbGUgZiA6IGdlbkZvbGRlcikgeworICAgICAgICAgICAgICAgIGlmIChmLmdldEFic29sdXRlUGF0aCgpLnN0YXJ0c1dpdGgoZm9sZGVyU3RhcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJjdXN0b20gZ2VuZXJhdGVkIHNvdXJjZSBmb2xkZXIgY2hlY2siLCBmb3VuZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXJ0aWZhY3RBcGkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTG9hZCB0aGUgY3VzdG9tIG1vZGVsIGZvciB0aGUgcHJvamVjdAorICAgICAgICBQcm9qZWN0RGF0YSBwcm9qZWN0RGF0YSA9IGdldE1vZGVsRm9yUHJvamVjdCgiYXJ0aWZhY3RBcGkiKTsKKworICAgICAgICBBbmRyb2lkUHJvamVjdCBtb2RlbCA9IHByb2plY3REYXRhLm1vZGVsOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBBcnRpZmFjdCBNZXRhIERhdGEKKyAgICAgICAgQ29sbGVjdGlvbjxBcnRpZmFjdE1ldGFEYXRhPiBleHRyYUFydGlmYWN0cyA9IG1vZGVsLmdldEV4dHJhQXJ0aWZhY3RzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkV4dHJhIGFydGlmYWN0IGNvbGxlY3Rpb24gbnVsbC1jaGVjayIsIGV4dHJhQXJ0aWZhY3RzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHRyYSBhcnRpZmFjdCBzaXplIGNoZWNrIiwgMiwgZXh0cmFBcnRpZmFjdHMuc2l6ZSgpKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKCJpbnN0cnVtZW50IHRlc3QgbWV0YWRhdGEgbnVsbC1jaGVjayIsCisgICAgICAgICAgICAgICAgZ2V0QXJ0aWZhY3RNZXRhRGF0YShleHRyYUFydGlmYWN0cywgQVJUSUZBQ1RfSU5TVFJVTUVOVF9URVNUKSk7CisKKyAgICAgICAgLy8gZ2V0IHRoZSBjdXN0b20gb25lLgorICAgICAgICBBcnRpZmFjdE1ldGFEYXRhIGV4dHJhQXJ0aWZhY3RNZXRhRGF0YSA9IGdldEFydGlmYWN0TWV0YURhdGEoZXh0cmFBcnRpZmFjdHMsICJfX3Rlc3RfXyIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJjdXN0b20gZXh0cmEgbWV0YWRhdGEgbnVsbC1jaGVjayIsIGV4dHJhQXJ0aWZhY3RNZXRhRGF0YSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJjdXN0b20gZXh0cmEgbWV0YSBkYXRhIGlzIFRlc3QgY2hlY2siLCBleHRyYUFydGlmYWN0TWV0YURhdGEuaXNUZXN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImN1c3RvbSBleHRyYSBtZXRhIGRhdGEgdHlwZSBjaGVjayIsIEFydGlmYWN0TWV0YURhdGEuVFlQRV9KQVZBLCBleHRyYUFydGlmYWN0TWV0YURhdGEuZ2V0VHlwZSgpKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZXh0cmEgc291cmNlIHByb3ZpZGVyIG9uIHRoZSBidWlsZCBUeXBlcy4KKyAgICAgICAgZm9yIChCdWlsZFR5cGVDb250YWluZXIgYnRDb250YWluZXIgOiBtb2RlbC5nZXRCdWlsZFR5cGVzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYnRDb250YWluZXIuZ2V0QnVpbGRUeXBlKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgQ29sbGVjdGlvbjxTb3VyY2VQcm92aWRlckNvbnRhaW5lcj4gZXh0cmFTb3VyY2VQcm92aWRlckNvbnRhaW5lcnMgPSBidENvbnRhaW5lci5nZXRFeHRyYVNvdXJjZVByb3ZpZGVycygpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgKKyAgICAgICAgICAgICAgICAgICAgIkV4dHJhIHNvdXJjZSBwcm92aWRlciBjb250YWluZXJzIGZvciBidWlsZCB0eXBlICciICsgbmFtZSArICInIG51bGwtY2hlY2siLAorICAgICAgICAgICAgICAgICAgICBleHRyYVNvdXJjZVByb3ZpZGVyQ29udGFpbmVycyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICJFeHRyYSBzb3VyY2UgcHJvdmlkZXIgY29udGFpbmVycyBmb3IgYnVpbGQgdHlwZSBzaXplICciICsgbmFtZSArICInIGNoZWNrIiwKKyAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFTb3VyY2VQcm92aWRlckNvbnRhaW5lcnMuc2l6ZSgpKTsKKworICAgICAgICAgICAgU291cmNlUHJvdmlkZXJDb250YWluZXIgc291cmNlUHJvdmlkZXJDb250YWluZXIgPSBleHRyYVNvdXJjZVByb3ZpZGVyQ29udGFpbmVycy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoCisgICAgICAgICAgICAgICAgICAgICJFeHRyYSBhcnRpZmFjdCBzb3VyY2UgcHJvdmlkZXIgZm9yICIgKyBuYW1lICsgIiBudWxsIGNoZWNrIiwKKyAgICAgICAgICAgICAgICAgICAgc291cmNlUHJvdmlkZXJDb250YWluZXIpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICJFeHRyYSBhcnRpZmFjdCBzb3VyY2UgcHJvdmlkZXIgZm9yICIgKyBuYW1lICsgIiBuYW1lIGNoZWNrIiwKKyAgICAgICAgICAgICAgICAgICAgIl9fdGVzdF9fIiwKKyAgICAgICAgICAgICAgICAgICAgc291cmNlUHJvdmlkZXJDb250YWluZXIuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICJFeHRyYSBhcnRpZmFjdCBzb3VyY2UgcHJvdmlkZXIgZm9yICIgKyBuYW1lICsgIiB2YWx1ZSBjaGVjayIsCisgICAgICAgICAgICAgICAgICAgICJidWlsZFR5cGU6IiArIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZVByb3ZpZGVyQ29udGFpbmVyLmdldFNvdXJjZVByb3ZpZGVyKCkuZ2V0TWFuaWZlc3RGaWxlKCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIHRoZSBleHRyYSBzb3VyY2UgcHJvdmlkZXIgb24gdGhlIHByb2R1Y3QgZmxhdm9ycy4KKyAgICAgICAgZm9yIChQcm9kdWN0Rmxhdm9yQ29udGFpbmVyIHBmQ29udGFpbmVyIDogbW9kZWwuZ2V0UHJvZHVjdEZsYXZvcnMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwZkNvbnRhaW5lci5nZXRQcm9kdWN0Rmxhdm9yKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgQ29sbGVjdGlvbjxTb3VyY2VQcm92aWRlckNvbnRhaW5lcj4gZXh0cmFTb3VyY2VQcm92aWRlckNvbnRhaW5lcnMgPSBwZkNvbnRhaW5lci5nZXRFeHRyYVNvdXJjZVByb3ZpZGVycygpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgKKyAgICAgICAgICAgICAgICAgICAgIkV4dHJhIHNvdXJjZSBwcm92aWRlciBjb250YWluZXIgZm9yIHByb2R1Y3QgZmxhdm9yICciICsgbmFtZSArICInIG51bGwtY2hlY2siLAorICAgICAgICAgICAgICAgICAgICBleHRyYVNvdXJjZVByb3ZpZGVyQ29udGFpbmVycyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICJFeHRyYSBhcnRpZmFjdCBzb3VyY2UgcHJvdmlkZXIgY29udGFpbmVyIGZvciBwcm9kdWN0IGZsYXZvciBzaXplICciICsgbmFtZSArICInIGNoZWNrIiwKKyAgICAgICAgICAgICAgICAgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFTb3VyY2VQcm92aWRlckNvbnRhaW5lcnMuc2l6ZSgpKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgKKyAgICAgICAgICAgICAgICAgICAgIkV4dHJhIHNvdXJjZSBwcm92aWRlciBjb250YWluZXIgZm9yIHByb2R1Y3QgZmxhdm9yICciICsgbmFtZSArICInOiBpbnN0VGVzdCBjaGVjayIsCisgICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyKGV4dHJhU291cmNlUHJvdmlkZXJDb250YWluZXJzLCBBUlRJRkFDVF9JTlNUUlVNRU5UX1RFU1QpKTsKKworCisgICAgICAgICAgICBTb3VyY2VQcm92aWRlckNvbnRhaW5lciBzb3VyY2VQcm92aWRlckNvbnRhaW5lciA9IGdldFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyKAorICAgICAgICAgICAgICAgICAgICBleHRyYVNvdXJjZVByb3ZpZGVyQ29udGFpbmVycywgIl9fdGVzdF9fIik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKAorICAgICAgICAgICAgICAgICAgICAiQ3VzdG9tIHNvdXJjZSBwcm92aWRlciBjb250YWluZXIgZm9yICIgKyBuYW1lICsgIiBudWxsIGNoZWNrIiwKKyAgICAgICAgICAgICAgICAgICAgc291cmNlUHJvdmlkZXJDb250YWluZXIpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICJDdXN0b20gYXJ0aWZhY3Qgc291cmNlIHByb3ZpZGVyIGZvciAiICsgbmFtZSArICIgbmFtZSBjaGVjayIsCisgICAgICAgICAgICAgICAgICAgICJfX3Rlc3RfXyIsCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZVByb3ZpZGVyQ29udGFpbmVyLmdldEFydGlmYWN0TmFtZSgpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAiRXh0cmEgYXJ0aWZhY3Qgc291cmNlIHByb3ZpZGVyIGZvciAiICsgbmFtZSArICIgdmFsdWUgY2hlY2siLAorICAgICAgICAgICAgICAgICAgICAicHJvZHVjdEZsYXZvcjoiICsgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgc291cmNlUHJvdmlkZXJDb250YWluZXIuZ2V0U291cmNlUHJvdmlkZXIoKS5nZXRNYW5pZmVzdEZpbGUoKS5nZXRQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIGV4dHJhIGFydGlmYWN0cyBvbiB0aGUgdmFyaWFudHMKKyAgICAgICAgZm9yIChWYXJpYW50IHZhcmlhbnQgOiBtb2RlbC5nZXRWYXJpYW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHZhcmlhbnQuZ2V0TmFtZSgpOworICAgICAgICAgICAgQ29sbGVjdGlvbjxKYXZhQXJ0aWZhY3Q+IGphdmFBcnRpZmFjdHMgPSB2YXJpYW50LmdldEV4dHJhSmF2YUFydGlmYWN0cygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGphdmFBcnRpZmFjdHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEphdmFBcnRpZmFjdCBqYXZhQXJ0aWZhY3QgPSBqYXZhQXJ0aWZhY3RzLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJfX3Rlc3RfXyIsIGphdmFBcnRpZmFjdC5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhc3NlbWJsZToiICsgbmFtZSwgamF2YUFydGlmYWN0LmdldEFzc2VtYmxlVGFza05hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNvbXBpbGU6IiArIG5hbWUsIGphdmFBcnRpZmFjdC5nZXRKYXZhQ29tcGlsZVRhc2tOYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCJjbGFzc2VzRm9sZGVyOiIgKyBuYW1lKSwgamF2YUFydGlmYWN0LmdldENsYXNzZXNGb2xkZXIoKSk7CisKKyAgICAgICAgICAgIFNvdXJjZVByb3ZpZGVyIHZhcmlhbnRTb3VyY2VQcm92aWRlciA9IGphdmFBcnRpZmFjdC5nZXRWYXJpYW50U291cmNlUHJvdmlkZXIoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwodmFyaWFudFNvdXJjZVByb3ZpZGVyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicHJvdmlkZXI6IiArIG5hbWUsIHZhcmlhbnRTb3VyY2VQcm92aWRlci5nZXRNYW5pZmVzdEZpbGUoKS5nZXRQYXRoKCkpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgU0RLIGZvbGRlciBhcyBidWlsdCBmcm9tIHRoZSBBbmRyb2lkIHNvdXJjZSB0cmVlLgogICAgICAqIEByZXR1cm4gdGhlIFNESwpAQCAtNTA1LDYgKzc1Myw5NSBAQAogICAgICAgICByZXR1cm4gbmV3IEZpbGUocm9vdERpciwgInRlc3RzIik7CiAgICAgfQogCisgICAgQE51bGxhYmxlCisgICAgcHJpdmF0ZSBzdGF0aWMgVmFyaWFudCBnZXRWYXJpYW50KAorICAgICAgICAgICAgQE5vbk51bGwgQ29sbGVjdGlvbjxWYXJpYW50PiBpdGVtcywKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZvciAoVmFyaWFudCBpdGVtIDogaXRlbXMpIHsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhpdGVtLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBOdWxsYWJsZQorICAgIHByaXZhdGUgc3RhdGljIFByb2R1Y3RGbGF2b3JDb250YWluZXIgZ2V0UHJvZHVjdEZsYXZvcigKKyAgICAgICAgICAgIEBOb25OdWxsIENvbGxlY3Rpb248UHJvZHVjdEZsYXZvckNvbnRhaW5lcj4gaXRlbXMsCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBmb3IgKFByb2R1Y3RGbGF2b3JDb250YWluZXIgaXRlbSA6IGl0ZW1zKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJQcm9kdWN0Rmxhdm9yQ29udGFpbmVyIGxpc3QgaXRlbSBudWxsLWNoZWNrOiIgKyBuYW1lLCBpdGVtKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlByb2R1Y3RGbGF2b3JDb250YWluZXIuZ2V0UHJvZHVjdEZsYXZvcigpIGxpc3QgaXRlbSBudWxsLWNoZWNrOiAiICsgbmFtZSwgaXRlbS5nZXRQcm9kdWN0Rmxhdm9yKCkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUHJvZHVjdEZsYXZvckNvbnRhaW5lci5nZXRQcm9kdWN0Rmxhdm9yKCkuZ2V0TmFtZSgpIGxpc3QgaXRlbSBudWxsLWNoZWNrOiAiICsgbmFtZSwgaXRlbS5nZXRQcm9kdWN0Rmxhdm9yKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhpdGVtLmdldFByb2R1Y3RGbGF2b3IoKS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIHN0YXRpYyBBcnRpZmFjdE1ldGFEYXRhIGdldEFydGlmYWN0TWV0YURhdGEoCisgICAgICAgICAgICBATm9uTnVsbCBDb2xsZWN0aW9uPEFydGlmYWN0TWV0YURhdGE+IGl0ZW1zLAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZm9yIChBcnRpZmFjdE1ldGFEYXRhIGl0ZW0gOiBpdGVtcykgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQXJ0aWZhY3RNZXRhRGF0YSBsaXN0IGl0ZW0gbnVsbC1jaGVjazoiICsgbmFtZSwgaXRlbSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJBcnRpZmFjdE1ldGFEYXRhLmdldE5hbWUoKSBsaXN0IGl0ZW0gbnVsbC1jaGVjazogIiArIG5hbWUsIGl0ZW0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhpdGVtLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBOdWxsYWJsZQorICAgIHByaXZhdGUgc3RhdGljIEFuZHJvaWRBcnRpZmFjdCBnZXRBbmRyb2lkQXJ0aWZhY3QoCisgICAgICAgICAgICBATm9uTnVsbCBDb2xsZWN0aW9uPEFuZHJvaWRBcnRpZmFjdD4gaXRlbXMsCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBmb3IgKEFuZHJvaWRBcnRpZmFjdCBpdGVtIDogaXRlbXMpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkFuZHJvaWRBcnRpZmFjdCBsaXN0IGl0ZW0gbnVsbC1jaGVjazoiICsgbmFtZSwgaXRlbSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJBbmRyb2lkQXJ0aWZhY3QuZ2V0TmFtZSgpIGxpc3QgaXRlbSBudWxsLWNoZWNrOiAiICsgbmFtZSwgaXRlbS5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGl0ZW0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgcHJpdmF0ZSBzdGF0aWMgU2lnbmluZ0NvbmZpZyBnZXRTaWduaW5nQ29uZmlnKAorICAgICAgICAgICAgQE5vbk51bGwgQ29sbGVjdGlvbjxTaWduaW5nQ29uZmlnPiBpdGVtcywKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZvciAoU2lnbmluZ0NvbmZpZyBpdGVtIDogaXRlbXMpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlNpZ25pbmdDb25maWcgbGlzdCBpdGVtIG51bGwtY2hlY2s6IiArIG5hbWUsIGl0ZW0pOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2lnbmluZ0NvbmZpZy5nZXROYW1lKCkgbGlzdCBpdGVtIG51bGwtY2hlY2s6ICIgKyBuYW1lLCBpdGVtLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoaXRlbS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIHN0YXRpYyBTb3VyY2VQcm92aWRlckNvbnRhaW5lciBnZXRTb3VyY2VQcm92aWRlckNvbnRhaW5lcigKKyAgICAgICAgICAgIEBOb25OdWxsIENvbGxlY3Rpb248U291cmNlUHJvdmlkZXJDb250YWluZXI+IGl0ZW1zLAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZm9yIChTb3VyY2VQcm92aWRlckNvbnRhaW5lciBpdGVtIDogaXRlbXMpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlNvdXJjZVByb3ZpZGVyQ29udGFpbmVyIGxpc3QgaXRlbSBudWxsLWNoZWNrOiIgKyBuYW1lLCBpdGVtKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlNvdXJjZVByb3ZpZGVyQ29udGFpbmVyLmdldE5hbWUoKSBsaXN0IGl0ZW0gbnVsbC1jaGVjazogIiArIG5hbWUsIGl0ZW0uZ2V0QXJ0aWZhY3ROYW1lKCkpOworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGl0ZW0uZ2V0QXJ0aWZhY3ROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9kdWN0Rmxhdm9yVGVzdGVyIHsKICAgICAgICAgQE5vbk51bGwgcHJpdmF0ZSBmaW5hbCBQcm9kdWN0Rmxhdm9yIHByb2R1Y3RGbGF2b3I7CiAgICAgICAgIEBOb25OdWxsIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CkBAIC01MTcsNiArODU0LDggQEAKICAgICAgICAgcHJpdmF0ZSBpbnQgcmVuZGVyc2NyaXB0VGFyZ2V0QXBpID0gLTE7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIHRlc3RQYWNrYWdlTmFtZSA9IG51bGw7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIHRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXIgPSBudWxsOworICAgICAgICBwcml2YXRlIEJvb2xlYW4gdGVzdEhhbmRsZVByb2ZpbGluZyA9IG51bGw7CisgICAgICAgIHByaXZhdGUgQm9vbGVhbiB0ZXN0RnVuY3Rpb25hbFRlc3QgPSBudWxsOwogCiAgICAgICAgIFByb2R1Y3RGbGF2b3JUZXN0ZXIoQE5vbk51bGwgUHJvZHVjdEZsYXZvciBwcm9kdWN0Rmxhdm9yLCBATm9uTnVsbCBTdHJpbmcgbmFtZSkgewogICAgICAgICAgICAgdGhpcy5wcm9kdWN0Rmxhdm9yID0gcHJvZHVjdEZsYXZvcjsKQEAgLTUzMywzNiArODcyLDQ2IEBACiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgICBQcm9kdWN0Rmxhdm9yVGVzdGVyIHNldFZlcnNpb25OYW1lKFN0cmluZyB2ZXJzaW9uTmFtZSkgeworICAgICAgICBQcm9kdWN0Rmxhdm9yVGVzdGVyIHNldFZlcnNpb25OYW1lKFN0cmluZyB2ZXJzaW9uTmFtZSkgewogICAgICAgICAgICAgdGhpcy52ZXJzaW9uTmFtZSA9IHZlcnNpb25OYW1lOwogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICAgUHJvZHVjdEZsYXZvclRlc3RlciBzZXRNaW5TZGtWZXJzaW9uKGludCBtaW5TZGtWZXJzaW9uKSB7CisgICAgICAgIFByb2R1Y3RGbGF2b3JUZXN0ZXIgc2V0TWluU2RrVmVyc2lvbihpbnQgbWluU2RrVmVyc2lvbikgewogICAgICAgICAgICAgdGhpcy5taW5TZGtWZXJzaW9uID0gbWluU2RrVmVyc2lvbjsKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgIFByb2R1Y3RGbGF2b3JUZXN0ZXIgc2V0VGFyZ2V0U2RrVmVyc2lvbihpbnQgdGFyZ2V0U2RrVmVyc2lvbikgeworICAgICAgICBQcm9kdWN0Rmxhdm9yVGVzdGVyIHNldFRhcmdldFNka1ZlcnNpb24oaW50IHRhcmdldFNka1ZlcnNpb24pIHsKICAgICAgICAgICAgIHRoaXMudGFyZ2V0U2RrVmVyc2lvbiA9IHRhcmdldFNka1ZlcnNpb247CiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgICBQcm9kdWN0Rmxhdm9yVGVzdGVyIHNldFJlbmRlcnNjcmlwdFRhcmdldEFwaShpbnQgcmVuZGVyc2NyaXB0VGFyZ2V0QXBpKSB7CisgICAgICAgIFByb2R1Y3RGbGF2b3JUZXN0ZXIgc2V0UmVuZGVyc2NyaXB0VGFyZ2V0QXBpKGludCByZW5kZXJzY3JpcHRUYXJnZXRBcGkpIHsKICAgICAgICAgICAgIHRoaXMucmVuZGVyc2NyaXB0VGFyZ2V0QXBpID0gcmVuZGVyc2NyaXB0VGFyZ2V0QXBpOwogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICAgUHJvZHVjdEZsYXZvclRlc3RlciBzZXRUZXN0UGFja2FnZU5hbWUoU3RyaW5nIHRlc3RQYWNrYWdlTmFtZSkgeworICAgICAgICBQcm9kdWN0Rmxhdm9yVGVzdGVyIHNldFRlc3RQYWNrYWdlTmFtZShTdHJpbmcgdGVzdFBhY2thZ2VOYW1lKSB7CiAgICAgICAgICAgICB0aGlzLnRlc3RQYWNrYWdlTmFtZSA9IHRlc3RQYWNrYWdlTmFtZTsKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgIFByb2R1Y3RGbGF2b3JUZXN0ZXIgc2V0VGVzdEluc3RydW1lbnRhdGlvblJ1bm5lcihTdHJpbmcgdGVzdEluc3RydW1lbnRhdGlvblJ1bm5lcikgeworICAgICAgICBQcm9kdWN0Rmxhdm9yVGVzdGVyIHNldFRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXIoU3RyaW5nIHRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXIpIHsKICAgICAgICAgICAgIHRoaXMudGVzdEluc3RydW1lbnRhdGlvblJ1bm5lciA9IHRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXI7CiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCisgICAgICAgIFByb2R1Y3RGbGF2b3JUZXN0ZXIgc2V0VGVzdEhhbmRsZVByb2ZpbGluZyhCb29sZWFuIHRlc3RIYW5kbGVQcm9maWxpbmcpIHsKKyAgICAgICAgICAgIHRoaXMudGVzdEhhbmRsZVByb2ZpbGluZyA9IHRlc3RIYW5kbGVQcm9maWxpbmc7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFByb2R1Y3RGbGF2b3JUZXN0ZXIgc2V0VGVzdEZ1bmN0aW9uYWxUZXN0KEJvb2xlYW4gdGVzdEZ1bmN0aW9uYWxUZXN0KSB7CisgICAgICAgICAgICB0aGlzLnRlc3RGdW5jdGlvbmFsVGVzdCA9IHRlc3RGdW5jdGlvbmFsVGVzdDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKICAgICAgICAgdm9pZCB0ZXN0KCkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUgKyAiOnBhY2thZ2VOYW1lIiwgcGFja2FnZU5hbWUsIHByb2R1Y3RGbGF2b3IuZ2V0UGFja2FnZU5hbWUoKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZSArICI6VmVyc2lvbkNvZGUiLCB2ZXJzaW9uQ29kZSwgcHJvZHVjdEZsYXZvci5nZXRWZXJzaW9uQ29kZSgpKTsKQEAgLTU3Niw2ICs5MjUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgdGVzdFBhY2thZ2VOYW1lLCBwcm9kdWN0Rmxhdm9yLmdldFRlc3RQYWNrYWdlTmFtZSgpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lICsgIjp0ZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyIiwKICAgICAgICAgICAgICAgICAgICAgdGVzdEluc3RydW1lbnRhdGlvblJ1bm5lciwgcHJvZHVjdEZsYXZvci5nZXRUZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUgKyAiOnRlc3RIYW5kbGVQcm9maWxpbmciLAorICAgICAgICAgICAgICAgICAgICB0ZXN0SGFuZGxlUHJvZmlsaW5nLCBwcm9kdWN0Rmxhdm9yLmdldFRlc3RIYW5kbGVQcm9maWxpbmcoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZSArICI6dGVzdEZ1bmN0aW9uYWxUZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgdGVzdEZ1bmN0aW9uYWxUZXN0LCBwcm9kdWN0Rmxhdm9yLmdldFRlc3RGdW5jdGlvbmFsVGVzdCgpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjUyLDIwICsxMDA1LDIzIEBACiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIHRlc3QoKSB7Ci0gICAgICAgICAgICB0ZXN0U2luZ2xlUGF0aFNldCgiamF2YSIsIGphdmFEaXIsIHNvdXJjZVByb3ZpZGVyLmdldEphdmFEaXJlY3RvcmllcygpKTsKLSAgICAgICAgICAgIHRlc3RTaW5nbGVQYXRoU2V0KCJyZXNvdXJjZXMiLCByZXNvdXJjZXNEaXIsIHNvdXJjZVByb3ZpZGVyLmdldFJlc291cmNlc0RpcmVjdG9yaWVzKCkpOwotICAgICAgICAgICAgdGVzdFNpbmdsZVBhdGhTZXQoInJlcyIsIHJlc0Rpciwgc291cmNlUHJvdmlkZXIuZ2V0UmVzRGlyZWN0b3JpZXMoKSk7Ci0gICAgICAgICAgICB0ZXN0U2luZ2xlUGF0aFNldCgiYXNzZXRzIiwgYXNzZXRzRGlyLCBzb3VyY2VQcm92aWRlci5nZXRBc3NldHNEaXJlY3RvcmllcygpKTsKLSAgICAgICAgICAgIHRlc3RTaW5nbGVQYXRoU2V0KCJhaWRsIiwgYWlkbERpciwgc291cmNlUHJvdmlkZXIuZ2V0QWlkbERpcmVjdG9yaWVzKCkpOwotICAgICAgICAgICAgdGVzdFNpbmdsZVBhdGhTZXQoInJzIiwgcmVuZGVyc2NyaXB0RGlyLCBzb3VyY2VQcm92aWRlci5nZXRSZW5kZXJzY3JpcHREaXJlY3RvcmllcygpKTsKLSAgICAgICAgICAgIHRlc3RTaW5nbGVQYXRoU2V0KCJqbmkiLCBqbmlEaXIsIHNvdXJjZVByb3ZpZGVyLmdldEpuaURpcmVjdG9yaWVzKCkpOworICAgICAgICAgICAgdGVzdFNpbmdsZVBhdGhDb2xsZWN0aW9uKCJqYXZhIiwgamF2YURpciwgc291cmNlUHJvdmlkZXIuZ2V0SmF2YURpcmVjdG9yaWVzKCkpOworICAgICAgICAgICAgdGVzdFNpbmdsZVBhdGhDb2xsZWN0aW9uKCJyZXNvdXJjZXMiLCByZXNvdXJjZXNEaXIsIHNvdXJjZVByb3ZpZGVyLmdldFJlc291cmNlc0RpcmVjdG9yaWVzKCkpOworICAgICAgICAgICAgdGVzdFNpbmdsZVBhdGhDb2xsZWN0aW9uKCJyZXMiLCByZXNEaXIsIHNvdXJjZVByb3ZpZGVyLmdldFJlc0RpcmVjdG9yaWVzKCkpOworICAgICAgICAgICAgdGVzdFNpbmdsZVBhdGhDb2xsZWN0aW9uKCJhc3NldHMiLCBhc3NldHNEaXIsIHNvdXJjZVByb3ZpZGVyLmdldEFzc2V0c0RpcmVjdG9yaWVzKCkpOworICAgICAgICAgICAgdGVzdFNpbmdsZVBhdGhDb2xsZWN0aW9uKCJhaWRsIiwgYWlkbERpciwgc291cmNlUHJvdmlkZXIuZ2V0QWlkbERpcmVjdG9yaWVzKCkpOworICAgICAgICAgICAgdGVzdFNpbmdsZVBhdGhDb2xsZWN0aW9uKCJycyIsIHJlbmRlcnNjcmlwdERpciwgc291cmNlUHJvdmlkZXIuZ2V0UmVuZGVyc2NyaXB0RGlyZWN0b3JpZXMoKSk7CisgICAgICAgICAgICB0ZXN0U2luZ2xlUGF0aENvbGxlY3Rpb24oImpuaSIsIGpuaURpciwgc291cmNlUHJvdmlkZXIuZ2V0Sm5pRGlyZWN0b3JpZXMoKSk7CiAKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiQW5kcm9pZE1hbmlmZXN0IiwKICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUocHJvamVjdERpciwgbWFuaWZlc3RGaWxlKS5nZXRBYnNvbHV0ZVBhdGgoKSwKICAgICAgICAgICAgICAgICAgICAgc291cmNlUHJvdmlkZXIuZ2V0TWFuaWZlc3RGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIHRlc3RTaW5nbGVQYXRoU2V0KFN0cmluZyBzZXROYW1lLCBTdHJpbmcgcmVmZXJlbmNlUGF0aCwgU2V0PEZpbGU+IHBhdGhTZXQpIHsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHRlc3RTaW5nbGVQYXRoQ29sbGVjdGlvbigKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgc2V0TmFtZSwKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgcmVmZXJlbmNlUGF0aCwKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBDb2xsZWN0aW9uPEZpbGU+IHBhdGhTZXQpIHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBwYXRoU2V0LnNpemUoKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJvamVjdE5hbWUgKyAiOiAiICsgY29uZmlnTmFtZSArICIvIiArIHNldE5hbWUsCiAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHByb2plY3REaXIsIHJlZmVyZW5jZVBhdGgpLmdldEFic29sdXRlUGF0aCgpLApAQCAtNjg3LDEzICsxMDQzLDE5IEBACiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIHRlc3QoKSB7CisgICAgICAgICAgICBBbmRyb2lkQXJ0aWZhY3QgYXJ0aWZhY3QgPSB2YXJpYW50LmdldE1haW5BcnRpZmFjdCgpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTWFpbiBBcnRpZmFjdCBudWxsLWNoZWNrIiwgYXJ0aWZhY3QpOworCiAgICAgICAgICAgICBTdHJpbmcgdmFyaWFudE5hbWUgPSB2YXJpYW50LmdldE5hbWUoKTsKICAgICAgICAgICAgIEZpbGUgYnVpbGQgPSBuZXcgRmlsZShwcm9qZWN0RGlyLCAgImJ1aWxkIik7CiAgICAgICAgICAgICBGaWxlIGFwayA9IG5ldyBGaWxlKGJ1aWxkLCAiYXBrLyIgKyBvdXRwdXRGaWxlTmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModmFyaWFudE5hbWUgKyAiIG91dHB1dCIsIGFwaywgdmFyaWFudC5nZXRNYWluQXJ0aWZhY3RJbmZvKCkuZ2V0T3V0cHV0RmlsZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YXJpYW50TmFtZSArICIgb3V0cHV0IiwgYXBrLCBhcnRpZmFjdC5nZXRPdXRwdXRGaWxlKCkpOwogCi0gICAgICAgICAgICBMaXN0PEZpbGU+IHNvdXJjZUZvbGRlcnMgPSB2YXJpYW50LmdldE1haW5BcnRpZmFjdEluZm8oKS5nZXRHZW5lcmF0ZWRTb3VyY2VGb2xkZXJzKCk7CisgICAgICAgICAgICBDb2xsZWN0aW9uPEZpbGU+IHNvdXJjZUZvbGRlcnMgPSBhcnRpZmFjdC5nZXRHZW5lcmF0ZWRTb3VyY2VGb2xkZXJzKCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkdlbiBzcmMgRm9sZGVyIGNvdW50IiwgNCwgc291cmNlRm9sZGVycy5zaXplKCkpOworCisgICAgICAgICAgICBGaWxlIG1hbmlmZXN0ID0gYXJ0aWZhY3QuZ2V0R2VuZXJhdGVkTWFuaWZlc3QoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWFuaWZlc3QpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFkbGUucHJvcGVydGllcyBiL2dyYWRsZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NmFkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFkbGUucHJvcGVydGllcwpAQCAtMCwwICsxIEBACitvcmcuZ3JhZGxlLmp2bWFyZ3M9LVhteDQwOTZtIC1YWDpNYXhQZXJtU2l6ZT0xMDI0bQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyYWRsZS9idWlsZC5ncmFkbGUgYi9ncmFkbGUvYnVpbGQuZ3JhZGxlCmluZGV4IDE2Yjk5ZTYuLmZlZmU4NjggMTAwNjQ0Ci0tLSBhL2dyYWRsZS9idWlsZC5ncmFkbGUKKysrIGIvZ3JhZGxlL2J1aWxkLmdyYWRsZQpAQCAtMjksNyArMjksMTIgQEAKICAgICBncm9vdnkgbG9jYWxHcm9vdnkoKQogICAgIGNvbXBpbGUgcHJvamVjdCgnOmJ1aWxkZXInKQogCi0gICAgcnVudGltZSAnbmV0LnNmLnByb2d1YXJkOnByb2d1YXJkLWdyYWRsZTo0LjknCisgICAgY29tcGlsZSAiY29tLmFuZHJvaWQudG9vbHM6c2RrbGliOiRwcm9qZWN0LmV4dC5iYXNlQW5kcm9pZFZlcnNpb24iCisgICAgY29tcGlsZSAiY29tLmFuZHJvaWQudG9vbHM6c2RrLWNvbW1vbjokcHJvamVjdC5leHQuYmFzZUFuZHJvaWRWZXJzaW9uIgorICAgIGNvbXBpbGUgImNvbS5hbmRyb2lkLnRvb2xzOmNvbW1vbjokcHJvamVjdC5leHQuYmFzZUFuZHJvaWRWZXJzaW9uIgorCisgICAgY29tcGlsZSAiY29tLmFuZHJvaWQudG9vbHMubGludDpsaW50OiRwcm9qZWN0LmV4dC5iYXNlQW5kcm9pZFZlcnNpb24iCisgICAgY29tcGlsZSAnbmV0LnNmLnByb2d1YXJkOnByb2d1YXJkLWdyYWRsZTo0LjEwJwogCiAgICAgdGVzdENvbXBpbGUgJ2p1bml0Omp1bml0OjMuOC4xJwogCkBAIC01Miw3ICs1Nyw3IEBACiB9CiAKIGRlcGVuZGVuY2llc3sKLSAgICBwcm92aWRlZCAnbmV0LnNmLnByb2d1YXJkOnByb2d1YXJkLWdyYWRsZTo0LjknCisgICAgcHJvdmlkZWQgJ25ldC5zZi5wcm9ndWFyZDpwcm9ndWFyZC1ncmFkbGU6NC4xMCcKIH0KIAogLy9JbmNsdWRlIHByb3ZpZGVkIGZvciBjb21waWxhdGlvbgpAQCAtNjcsMjYgKzcyLDEzIEBACiAgICAgfQogfQogCi1kZWYgZ2V0VmVyc2lvbigpIHsKLSAgICBpZiAocHJvamVjdC5oYXMoInJlbGVhc2UiKSkgewotICAgICAgICByZXR1cm4gcHJvamVjdC5leHQuYmFzZVZlcnNpb24KLSAgICB9Ci0KLSAgICByZXR1cm4gcHJvamVjdC5leHQuYmFzZVZlcnNpb24gKyAnLVNOQVBTSE9UJwotfQotCi12ZXJzaW9uID0gZ2V0VmVyc2lvbigpCiBhcmNoaXZlc0Jhc2VOYW1lID0gJ2dyYWRsZScKLWphci5tYW5pZmVzdC5hdHRyaWJ1dGVzKCJQbHVnaW4tVmVyc2lvbiI6IHZlcnNpb24pCitwcm9qZWN0LmV4dC5wb21OYW1lID0gJ0dyYWRsZSBQbHVnLWluIGZvciBBbmRyb2lkJworcHJvamVjdC5leHQucG9tRGVzYyA9ICdHcmFkbGUgcGx1Zy1pbiB0byBidWlsZCBBbmRyb2lkIGFwcGxpY2F0aW9ucy4nCiAKLXRhc2sgcHVibGlzaExvY2FsKHR5cGU6IFVwbG9hZCkgewotICAgIGNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9ucy5hcmNoaXZlcwotICAgIHJlcG9zaXRvcmllcyB7Ci0gICAgICAgIG1hdmVuRGVwbG95ZXIgewotICAgICAgICAgICAgcmVwb3NpdG9yeSh1cmw6IHVyaSgiJHJvb3RQcm9qZWN0LmV4dC5hbmRyb2lkSG9zdE91dC9yZXBvIikpCi0gICAgICAgIH0KLSAgICB9Ci19CithcHBseSBmcm9tOiAnLi4vcHVibGlzaC5ncmFkbGUnCisKK2phci5tYW5pZmVzdC5hdHRyaWJ1dGVzKCJQbHVnaW4tVmVyc2lvbiI6IHZlcnNpb24pCiBwdWJsaXNoTG9jYWwuZGVwZW5kc09uICc6YnVpbGRlcjpwdWJsaXNoTG9jYWwnCiAKIHRhc2sgYnVpbGRUZXN0KHR5cGU6IFRlc3QsIGRlcGVuZHNPbjogcHVibGlzaExvY2FsKSB7CkBAIC0xMDcsNjIgKzk5LDYgQEAKIAogY2hlY2suZGVwZW5kc09uIGJ1aWxkVGVzdAogCi1wcm9qZWN0LmV4dC5zb25hdHlwZVVzZXJuYW1lID0gcHJvamVjdC5oYXNQcm9wZXJ0eSgnc29uYXR5cGVVc2VybmFtZScpID8gc29uYXR5cGVVc2VybmFtZSA6ICIiCi1wcm9qZWN0LmV4dC5zb25hdHlwZVBhc3N3b3JkID0gcHJvamVjdC5oYXNQcm9wZXJ0eSgnc29uYXR5cGVQYXNzd29yZCcpID8gc29uYXR5cGVQYXNzd29yZCA6ICIiCi0KLXVwbG9hZEFyY2hpdmVzIHsKLSAgICByZXBvc2l0b3JpZXMgewotICAgICAgICBtYXZlbkRlcGxveWVyIHsKLSAgICAgICAgICAgIGJlZm9yZURlcGxveW1lbnQgeyBNYXZlbkRlcGxveW1lbnQgZGVwbG95bWVudCAtPgotICAgICAgICAgICAgICAgIGlmICghcHJvamVjdC5oYXMoInJlbGVhc2UiKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcEV4ZWN1dGlvbkV4Y2VwdGlvbigidXBsb2FkQXJjaGl2ZXMgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgcmVsZWFzZS5ncmFkbGUgaW5pdCBzY3JpcHQiKQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0LmV4dC5zb25hdHlwZVVzZXJuYW1lLmxlbmd0aCgpID09IDAgfHwgcHJvamVjdC5leHQuc29uYXR5cGVQYXNzd29yZC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdG9wRXhlY3V0aW9uRXhjZXB0aW9uKCJ1cGxvYWRBcmNoaXZlcyBjYW5ub3QgYmUgY2FsbGVkIHdpdGhvdXQgc29uYXR5cGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIikKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzaWduaW5nLnNpZ25Qb20oZGVwbG95bWVudCkKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVwb3NpdG9yeSh1cmw6ICJodHRwczovL29zcy5zb25hdHlwZS5vcmcvc2VydmljZS9sb2NhbC9zdGFnaW5nL2RlcGxveS9tYXZlbjIvIikgewotICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uKHVzZXJOYW1lOiBwcm9qZWN0LmV4dC5zb25hdHlwZVVzZXJuYW1lLCBwYXNzd29yZDogcHJvamVjdC5leHQuc29uYXR5cGVQYXNzd29yZCkKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcG9tLnByb2plY3QgewotICAgICAgICAgICAgICAgIG5hbWUgJ0dyYWRsZSBQbHVnLWluIGZvciBBbmRyb2lkJwotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICdHcmFkbGUgcGx1Zy1pbiB0byBidWlsZCBBbmRyb2lkIGFwcGxpY2F0aW9ucy4nCi0gICAgICAgICAgICAgICAgdXJsICdodHRwOi8vdG9vbHMuYW5kcm9pZC5jb20nCi0gICAgICAgICAgICAgICAgaW5jZXB0aW9uWWVhciAnMjAwNycKLQotICAgICAgICAgICAgICAgIGxpY2Vuc2VzIHsKLSAgICAgICAgICAgICAgICAgICAgbGljZW5zZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICdUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wJwotICAgICAgICAgICAgICAgICAgICAgICAgdXJsICdodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0JwotICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uICdyZXBvJwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2NtIHsKLSAgICAgICAgICAgICAgICAgICAgdXJsICJodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS90b29scy9idWlsZCIKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiAiZ2l0Oi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3Rvb2xzL2J1aWxkLmdpdCIKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZXZlbG9wZXJzIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2ZWxvcGVyIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgJ1RoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QnCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGN1c3RvbSB0YXNrcyBmb3IgY3JlYXRpbmcgc291cmNlL2phdmFkb2MgamFycwotdGFzayBzb3VyY2VzSmFyKHR5cGU6IEphciwgZGVwZW5kc09uOmNsYXNzZXMpIHsKLSAgICBjbGFzc2lmaWVyID0gJ3NvdXJjZXMnCi0gICAgZnJvbSBzb3VyY2VTZXRzLm1haW4uYWxsU291cmNlCi19CiAKIGdyb292eWRvYyB7CiAgICAgZXhjbHVkZSAgICAgIioqL2ludGVybmFsLyoqIgpAQCAtMTc4LDE1ICsxMTQsOSBAQAogICAgIGNsYXNzaWZpZXIgICdqYXZhZG9jJwogICAgIGZyb20gICAgICAgIGdyb292eWRvYy5kZXN0aW5hdGlvbkRpcgogfQotIAotLy8gYWRkIGphdmFkb2Mvc291cmNlIGphciB0YXNrcyBhcyBhcnRpZmFjdHMKKworLy8gYWRkIGphdmFkb2MgamFyIHRhc2tzIGFzIGFydGlmYWN0cwogYXJ0aWZhY3RzIHsKLSAgICBhcmNoaXZlcyBqYXIKLSAgICBhcmNoaXZlcyBzb3VyY2VzSmFyCiAgICAgYXJjaGl2ZXMgamF2YWRvY0phcgogfQogCi1zaWduaW5nIHsKLSAgICByZXF1aXJlZCB7IHByb2plY3QuaGFzKCJyZWxlYXNlIikgJiYgZ3JhZGxlLnRhc2tHcmFwaC5oYXNUYXNrKCJ1cGxvYWRBcmNoaXZlcyIpIH0KLSAgICBzaWduIGNvbmZpZ3VyYXRpb25zLmFyY2hpdmVzCi19CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL2J1aWxkLXRlc3QvZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9BdXRvbWF0ZWRCdWlsZFRlc3QuamF2YSBiL2dyYWRsZS9zcmMvYnVpbGQtdGVzdC9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0F1dG9tYXRlZEJ1aWxkVGVzdC5qYXZhCmluZGV4IGI5MjIzOWYuLjE4ZTMyNzcgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvYnVpbGQtdGVzdC9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0F1dG9tYXRlZEJ1aWxkVGVzdC5qYXZhCisrKyBiL2dyYWRsZS9zcmMvYnVpbGQtdGVzdC9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0F1dG9tYXRlZEJ1aWxkVGVzdC5qYXZhCkBAIC0zNSwxMCArMzUsMTEgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHNCdWlsdFByb2plY3RzID0gbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJhaWRsIiwgImFwaSIsICJhcHBsaWJ0ZXN0IiwgImFzc2V0cyIsICJhdHRyT3JkZXIiLCAiYmFzaWMiLCAiZGVwZW5kZW5jaWVzIiwKLSAgICAgICAgICAgICJkZXBlbmRlbmN5Q2hlY2tlciIsICJmbGF2b3JlZCIsICJmbGF2b3JsaWIiLCAiZmxhdm9ycyIsICJsaWJUZXN0RGVwIiwgImxpYnNUZXN0IiwKLSAgICAgICAgICAgICJsb2NhbEphcnMiLCAibWlncmF0ZWQiLCAibXVsdGlwcm9qZWN0IiwgIm11bHRpcmVzIiwgIm92ZXJsYXkxIiwgIm92ZXJsYXkyIiwKLSAgICAgICAgICAgICJwa2dPdmVycmlkZSIsICJwcm9ndWFyZCIsICJwcm9ndWFyZExpYiIsICJyZW5kZXJzY3JpcHQiLCAicmVuZGVyc2NyaXB0SW5MaWIiLAotICAgICAgICAgICAgInJlbmRlcnNjcmlwdE11bHRpU3JjIiwgInNhbWVOYW1lZExpYnMiLCAidGljdGFjdG9lIiAvKiwgImF1dG9yZXBvIiovCisgICAgICAgICAgICAiZGVwZW5kZW5jeUNoZWNrZXIiLCAiZmxhdm9yZWQiLCAiZmxhdm9ybGliIiwgImZsYXZvcnMiLCAiZ2VuRm9sZGVyQXBpIiwKKyAgICAgICAgICAgICJsaWJQcm9ndWFyZEphckRlcCIsICJsaWJQcm9ndWFyZExpYkRlcCIsICJsaWJUZXN0RGVwIiwgImxpYnNUZXN0IiwgImxvY2FsSmFycyIsCisgICAgICAgICAgICAibWlncmF0ZWQiLCAibXVsdGlwcm9qZWN0IiwgIm11bHRpcmVzIiwgIm5ka1NhbkFuZ2VsZXMiLCAibmRrSm5pTGliIiwgIm92ZXJsYXkxIiwKKyAgICAgICAgICAgICJvdmVybGF5MiIsICJwa2dPdmVycmlkZSIsICJwcm9ndWFyZCIsICJwcm9ndWFyZExpYiIsICJyZW5kZXJzY3JpcHQiLCAicmVuZGVyc2NyaXB0SW5MaWIiLAorICAgICAgICAgICAgInJlbmRlcnNjcmlwdE11bHRpU3JjIiwgInJzU3VwcG9ydE1vZGUiLCAic2FtZU5hbWVkTGlicyIsICJ0aWN0YWN0b2UiIC8qLCAiYXV0b3JlcG8iKi8KICAgICB9OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc1JlcG9ydFByb2plY3RzID0gbmV3IFN0cmluZ1tdIHsKQEAgLTUwLDYgKzUxLDkgQEAKICAgICAgICAgc3VpdGUuc2V0TmFtZSgiQXV0b21hdGVkQnVpbGRUZXN0Iik7CiAKICAgICAgICAgZm9yIChTdHJpbmcgZ3JhZGxlVmVyc2lvbiA6IEJhc2VQbHVnaW4uR1JBRExFX1NVUFBPUlRFRF9WRVJTSU9OUykgeworICAgICAgICAgICAgaWYgKGlzSWdub3JlZEdyYWRsZVZlcnNpb24oZ3JhZGxlVmVyc2lvbikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGZpcnN0IHRoZSBwcm9qZWN0IHdlIGJ1aWxkIG9uIGFsbCBhdmFpbGFibGUgdmVyc2lvbnMgb2YgR3JhZGxlCiAgICAgICAgICAgICBmb3IgKFN0cmluZyBwcm9qZWN0TmFtZSA6IHNCdWlsdFByb2plY3RzKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHRlc3ROYW1lID0gImJ1aWxkXyIgKyBwcm9qZWN0TmFtZSArICJfIiArIGdyYWRsZVZlcnNpb247CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL2J1aWxkLXRlc3QvZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9CdWlsZFRlc3QuamF2YSBiL2dyYWRsZS9zcmMvYnVpbGQtdGVzdC9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0J1aWxkVGVzdC5qYXZhCmluZGV4IDhhZmI3YmEuLmM4MWQwZGIgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvYnVpbGQtdGVzdC9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0J1aWxkVGVzdC5qYXZhCisrKyBiL2dyYWRsZS9zcmMvYnVpbGQtdGVzdC9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0J1aWxkVGVzdC5qYXZhCkBAIC0xNyw4ICsxNywxMCBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGU7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwudGVzdC5CYXNlVGVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCiAvKioKICAqIEJhc2UgY2xhc3MgZm9yIGJ1aWxkIHRlc3RzLgpAQCAtMjcsMTQgKzI5LDI4IEBACiAgKiBBbmRyb2lkIFNvdXJjZSB0cmVlIHVuZGVyIG91dC9ob3N0LzxwbGF0Zm9ybT4vc2RrLy4uLiAocmVzdWx0IG9mICdtYWtlIHNkaycpCiAgKi8KIGFic3RyYWN0IGNsYXNzIEJ1aWxkVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gSUdOT1JFRF9HUkFETEVfVkVSU0lPTlMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKIAogICAgIHByb3RlY3RlZCBGaWxlIHRlc3REaXI7CiAgICAgcHJvdGVjdGVkIEZpbGUgc2RrRGlyOworICAgIHByb3RlY3RlZCBGaWxlIG5ka0RpcjsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRlc3REaXIgPSBnZXRUZXN0RGlyKCk7CiAgICAgICAgIHNka0RpciA9IGdldFNka0RpcigpOworICAgICAgICBuZGtEaXIgPSBnZXROZGtEaXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gR3JhZGxlIHZlcnNpb24gc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGVzdHMgKGZvciBleGFtcGxlLCB3aGVuIGEgR3JhZGxlIHZlcnNpb24gaGFzCisgICAgICogbm90IGJlZW4gcHVibGljbHkgcmVsZWFzZWQgeWV0LikKKyAgICAgKgorICAgICAqIEBwYXJhbSBncmFkbGVWZXJzaW9uIHRoZSBnaXZlbiBHcmFkbGUgdmVyc2lvbi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gR3JhZGxlIHZlcnNpb24gc2hvdWxkIGJlIGlnbm9yZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0lnbm9yZWRHcmFkbGVWZXJzaW9uKFN0cmluZyBncmFkbGVWZXJzaW9uKSB7CisgICAgICByZXR1cm4gSUdOT1JFRF9HUkFETEVfVkVSU0lPTlMuY29udGFpbnMoZ3JhZGxlVmVyc2lvbik7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIEZpbGUgYnVpbGRQcm9qZWN0KFN0cmluZyBuYW1lLCBTdHJpbmcgZ3JhZGxlVmVyc2lvbikgewpAQCAtNDUsMTIgKzYxLDEwIEBACiAgICAgICAgIEZpbGUgcHJvamVjdCA9IG5ldyBGaWxlKHRlc3REaXIsIG5hbWUpOwogCiAgICAgICAgIEZpbGUgYnVpbGRHcmFkbGUgPSBuZXcgRmlsZShwcm9qZWN0LCAiYnVpbGQuZ3JhZGxlIik7Ci0gICAgICAgIGlmICghYnVpbGRHcmFkbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIk1pc3NpbmcgYnVpbGQuZ3JhZGxlIGZvciAiICsgbmFtZSwgYnVpbGRHcmFkbGUuaXNGaWxlKCkpOwogCiAgICAgICAgIC8vIGJ1aWxkIHRoZSBwcm9qZWN0Ci0gICAgICAgIHJ1bkdyYWRsZVRhc2tzKHNka0RpciwgZ3JhZGxlVmVyc2lvbiwgcHJvamVjdCwgdGFza3MpOworICAgICAgICBydW5HcmFkbGVUYXNrcyhzZGtEaXIsIG5ka0RpciwgZ3JhZGxlVmVyc2lvbiwgcHJvamVjdCwgdGFza3MpOwogCiAgICAgICAgIHJldHVybiBwcm9qZWN0OwogICAgIH0KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvYnVpbGQtdGVzdC9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL01hbnVhbEJ1aWxkVGVzdC5qYXZhIGIvZ3JhZGxlL3NyYy9idWlsZC10ZXN0L2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvTWFudWFsQnVpbGRUZXN0LmphdmEKaW5kZXggMGNjZmMyNC4uZTBjOTg1YiAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9idWlsZC10ZXN0L2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvTWFudWFsQnVpbGRUZXN0LmphdmEKKysrIGIvZ3JhZGxlL3NyYy9idWlsZC10ZXN0L2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvTWFudWFsQnVpbGRUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDkgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGU7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOworCiBpbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOwogaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7CiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMjksMzYgKzMyLDc0IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBNYW51YWxCdWlsZFRlc3QgZXh0ZW5kcyBCdWlsZFRlc3QgewogCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFJFRCA9IDB4RkZGRjAwMDA7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEdSRUVOID0gMHhGRjAwRkYwMDsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQkxVRSA9IDB4RkYwMDAwRkY7CisKIAogICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVybGF5MUNvbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBwcm9qZWN0ID0gYnVpbGRQcm9qZWN0KCJvdmVybGF5MSIsIEJhc2VQbHVnaW4uR1JBRExFX01JTl9WRVJTSU9OKTsKICAgICAgICAgRmlsZSBkcmF3YWJsZU91dHB1dCA9IG5ldyBGaWxlKHByb2plY3QsICJidWlsZC9yZXMvYWxsL2RlYnVnL2RyYXdhYmxlIik7CiAKLSAgICAgICAgY2hlY2tJbWFnZUNvbG9yKGRyYXdhYmxlT3V0cHV0LCAibm9fb3ZlcmxheS5wbmciLCAoaW50KSAweEZGMDBGRjAwKTsKLSAgICAgICAgY2hlY2tJbWFnZUNvbG9yKGRyYXdhYmxlT3V0cHV0LCAidHlwZV9vdmVybGF5LnBuZyIsIChpbnQpIDB4RkYwMEZGMDApOworICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJub19vdmVybGF5LnBuZyIsIEdSRUVOKTsKKyAgICAgICAgY2hlY2tJbWFnZUNvbG9yKGRyYXdhYmxlT3V0cHV0LCAidHlwZV9vdmVybGF5LnBuZyIsIEdSRUVOKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcmxheTJDb250ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgcHJvamVjdCA9IGJ1aWxkUHJvamVjdCgib3ZlcmxheTIiLCBCYXNlUGx1Z2luLkdSQURMRV9NSU5fVkVSU0lPTik7CiAgICAgICAgIEZpbGUgZHJhd2FibGVPdXRwdXQgPSBuZXcgRmlsZShwcm9qZWN0LCAiYnVpbGQvcmVzL2FsbC9vbmUvZGVidWcvZHJhd2FibGUiKTsKIAotICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJub19vdmVybGF5LnBuZyIsIChpbnQpIDB4RkYwMEZGMDApOwotICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJ0eXBlX292ZXJsYXkucG5nIiwgKGludCkgMHhGRjAwRkYwMCk7Ci0gICAgICAgIGNoZWNrSW1hZ2VDb2xvcihkcmF3YWJsZU91dHB1dCwgImZsYXZvcl9vdmVybGF5LnBuZyIsIChpbnQpIDB4RkYwMEZGMDApOwotICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJ0eXBlX2ZsYXZvcl9vdmVybGF5LnBuZyIsIChpbnQpIDB4RkYwMEZGMDApOworICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJub19vdmVybGF5LnBuZyIsIEdSRUVOKTsKKyAgICAgICAgY2hlY2tJbWFnZUNvbG9yKGRyYXdhYmxlT3V0cHV0LCAidHlwZV9vdmVybGF5LnBuZyIsIEdSRUVOKTsKKyAgICAgICAgY2hlY2tJbWFnZUNvbG9yKGRyYXdhYmxlT3V0cHV0LCAiZmxhdm9yX292ZXJsYXkucG5nIiwgR1JFRU4pOworICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJ0eXBlX2ZsYXZvcl9vdmVybGF5LnBuZyIsIEdSRUVOKTsKKyAgICAgICAgY2hlY2tJbWFnZUNvbG9yKGRyYXdhYmxlT3V0cHV0LCAidmFyaWFudF90eXBlX2ZsYXZvcl9vdmVybGF5LnBuZyIsIEdSRUVOKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcmxheTNDb250ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgcHJvamVjdCA9IGJ1aWxkUHJvamVjdCgib3ZlcmxheTMiLCBCYXNlUGx1Z2luLkdSQURMRV9NSU5fVkVSU0lPTik7CisgICAgICAgIEZpbGUgZHJhd2FibGVPdXRwdXQgPSBuZXcgRmlsZShwcm9qZWN0LCAiYnVpbGQvcmVzL2FsbC9mcmVlYmV0YS9kZWJ1Zy9kcmF3YWJsZSIpOworCisgICAgICAgIGNoZWNrSW1hZ2VDb2xvcihkcmF3YWJsZU91dHB1dCwgIm5vX292ZXJsYXkucG5nIiwgR1JFRU4pOworICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJkZWJ1Z19vdmVybGF5LnBuZyIsIEdSRUVOKTsKKyAgICAgICAgY2hlY2tJbWFnZUNvbG9yKGRyYXdhYmxlT3V0cHV0LCAiYmV0YV9vdmVybGF5LnBuZyIsIEdSRUVOKTsKKyAgICAgICAgY2hlY2tJbWFnZUNvbG9yKGRyYXdhYmxlT3V0cHV0LCAiZnJlZV9vdmVybGF5LnBuZyIsIEdSRUVOKTsKKyAgICAgICAgY2hlY2tJbWFnZUNvbG9yKGRyYXdhYmxlT3V0cHV0LCAiZnJlZV9iZXRhX292ZXJsYXkucG5nIiwgR1JFRU4pOworICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJmcmVlX2JldGFfZGVidWdfb3ZlcmxheS5wbmciLCBHUkVFTik7CisgICAgICAgIGNoZWNrSW1hZ2VDb2xvcihkcmF3YWJsZU91dHB1dCwgImZyZWVfbm9ybWFsX292ZXJsYXkucG5nIiwgUkVEKTsKKworICAgICAgICBkcmF3YWJsZU91dHB1dCA9IG5ldyBGaWxlKHByb2plY3QsICJidWlsZC9yZXMvYWxsL2ZyZWVub3JtYWwvZGVidWcvZHJhd2FibGUiKTsKKworICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJub19vdmVybGF5LnBuZyIsIEdSRUVOKTsKKyAgICAgICAgY2hlY2tJbWFnZUNvbG9yKGRyYXdhYmxlT3V0cHV0LCAiZGVidWdfb3ZlcmxheS5wbmciLCBHUkVFTik7CisgICAgICAgIGNoZWNrSW1hZ2VDb2xvcihkcmF3YWJsZU91dHB1dCwgImJldGFfb3ZlcmxheS5wbmciLCBSRUQpOworICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJmcmVlX292ZXJsYXkucG5nIiwgR1JFRU4pOworICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJmcmVlX2JldGFfb3ZlcmxheS5wbmciLCBSRUQpOworICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJmcmVlX2JldGFfZGVidWdfb3ZlcmxheS5wbmciLCBSRUQpOworICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJmcmVlX25vcm1hbF9vdmVybGF5LnBuZyIsIEdSRUVOKTsKKworICAgICAgICBkcmF3YWJsZU91dHB1dCA9IG5ldyBGaWxlKHByb2plY3QsICJidWlsZC9yZXMvYWxsL3BhaWRiZXRhL2RlYnVnL2RyYXdhYmxlIik7CisKKyAgICAgICAgY2hlY2tJbWFnZUNvbG9yKGRyYXdhYmxlT3V0cHV0LCAibm9fb3ZlcmxheS5wbmciLCBHUkVFTik7CisgICAgICAgIGNoZWNrSW1hZ2VDb2xvcihkcmF3YWJsZU91dHB1dCwgImRlYnVnX292ZXJsYXkucG5nIiwgR1JFRU4pOworICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJiZXRhX292ZXJsYXkucG5nIiwgR1JFRU4pOworICAgICAgICBjaGVja0ltYWdlQ29sb3IoZHJhd2FibGVPdXRwdXQsICJmcmVlX292ZXJsYXkucG5nIiwgUkVEKTsKKyAgICAgICAgY2hlY2tJbWFnZUNvbG9yKGRyYXdhYmxlT3V0cHV0LCAiZnJlZV9iZXRhX292ZXJsYXkucG5nIiwgUkVEKTsKKyAgICAgICAgY2hlY2tJbWFnZUNvbG9yKGRyYXdhYmxlT3V0cHV0LCAiZnJlZV9iZXRhX2RlYnVnX292ZXJsYXkucG5nIiwgUkVEKTsKKyAgICAgICAgY2hlY2tJbWFnZUNvbG9yKGRyYXdhYmxlT3V0cHV0LCAiZnJlZV9ub3JtYWxfb3ZlcmxheS5wbmciLCBSRUQpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBvKCkgewogICAgICAgICBGaWxlIHJlcG8gPSBuZXcgRmlsZSh0ZXN0RGlyLCAicmVwbyIpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBydW5HcmFkbGVUYXNrcyhzZGtEaXIsIEJhc2VQbHVnaW4uR1JBRExFX01JTl9WRVJTSU9OLAorICAgICAgICAgICAgcnVuR3JhZGxlVGFza3Moc2RrRGlyLCBuZGtEaXIsIEJhc2VQbHVnaW4uR1JBRExFX01JTl9WRVJTSU9OLAogICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShyZXBvLCAidXRpbCIpLCAiY2xlYW4iLCAidXBsb2FkQXJjaGl2ZXMiKTsKLSAgICAgICAgICAgIHJ1bkdyYWRsZVRhc2tzKHNka0RpciwgQmFzZVBsdWdpbi5HUkFETEVfTUlOX1ZFUlNJT04sCisgICAgICAgICAgICBydW5HcmFkbGVUYXNrcyhzZGtEaXIsIG5ka0RpciwgQmFzZVBsdWdpbi5HUkFETEVfTUlOX1ZFUlNJT04sCiAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHJlcG8sICJiYXNlTGlicmFyeSIpLCAiY2xlYW4iLCAidXBsb2FkQXJjaGl2ZXMiKTsKLSAgICAgICAgICAgIHJ1bkdyYWRsZVRhc2tzKHNka0RpciwgQmFzZVBsdWdpbi5HUkFETEVfTUlOX1ZFUlNJT04sCisgICAgICAgICAgICBydW5HcmFkbGVUYXNrcyhzZGtEaXIsIG5ka0RpciwgQmFzZVBsdWdpbi5HUkFETEVfTUlOX1ZFUlNJT04sCiAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHJlcG8sICJsaWJyYXJ5IiksICJjbGVhbiIsICJ1cGxvYWRBcmNoaXZlcyIpOwotICAgICAgICAgICAgcnVuR3JhZGxlVGFza3Moc2RrRGlyLCBCYXNlUGx1Z2luLkdSQURMRV9NSU5fVkVSU0lPTiwKKyAgICAgICAgICAgIHJ1bkdyYWRsZVRhc2tzKHNka0RpciwgbmRrRGlyLCBCYXNlUGx1Z2luLkdSQURMRV9NSU5fVkVSU0lPTiwKICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUocmVwbywgImFwcCIpLCAiY2xlYW4iLCAiYXNzZW1ibGUiKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIC8vIGNsZWFuIHVwIHRoZSB0ZXN0IHJlcG9zaXRvcnkuCkBAIC02NywxMSArMTA4LDM0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyB0ZXN0IHdoZXRoZXIgYSBsaWJyYXJ5IHByb2plY3QgaGFzIGl0cyBmaWVsZHMgUHJvR3VhcmRlZAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaWJQcm9ndWFyZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlIHByb2plY3QgPSBuZXcgRmlsZSh0ZXN0RGlyLCAibGliUHJvZ3VhcmQiKTsKKyAgICAgICAgRmlsZSBmaWxlT3V0cHV0ID0gbmV3IEZpbGUocHJvamVjdCwgImJ1aWxkL3Byb2d1YXJkL3JlbGVhc2UiKTsKKworICAgICAgICBydW5HcmFkbGVUYXNrcyhzZGtEaXIsIG5ka0RpciwgQmFzZVBsdWdpbi5HUkFETEVfTUlOX1ZFUlNJT04sCisgICAgICAgICAgcHJvamVjdCwgImNsZWFuIiwgImJ1aWxkIik7CisgICAgICAgIGNoZWNrRmlsZShmaWxlT3V0cHV0LCAibWFwcGluZy50eHQiLCBuZXcgU3RyaW5nW117ImludCBwcm9ndWFyZEludCAtPiBhIn0pOworCisgICAgfQorCisgICAgLy8gdGVzdCB3aGV0aGVyIHByb2d1YXJkLnR4dCBoYXMgYmVlbiBjb3JyZWN0bHkgbWVyZ2VkCisgICAgcHVibGljIHZvaWQgdGVzdExpYlByb2d1YXJkQ29uc3VtZXJGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgcHJvamVjdCA9IG5ldyBGaWxlKHRlc3REaXIsICJsaWJQcm9ndWFyZENvbnN1bWVyRmlsZXMiKTsKKyAgICAgICAgRmlsZSBkZWJ1Z0ZpbGVPdXRwdXQgPSBuZXcgRmlsZShwcm9qZWN0LCAiYnVpbGQvYnVuZGxlcy9kZWJ1ZyIpOworICAgICAgICBGaWxlIHJlbGVhc2VGaWxlT3V0cHV0ID0gbmV3IEZpbGUocHJvamVjdCwgImJ1aWxkL2J1bmRsZXMvcmVsZWFzZSIpOworCisgICAgICAgIHJ1bkdyYWRsZVRhc2tzKHNka0RpciwgbmRrRGlyLCBCYXNlUGx1Z2luLkdSQURMRV9NSU5fVkVSU0lPTiwKKyAgICAgICAgICAgIHByb2plY3QsICJjbGVhbiIsICJidWlsZCIpOworICAgICAgICBjaGVja0ZpbGUoZGVidWdGaWxlT3V0cHV0LCAicHJvZ3VhcmQudHh0IiwgbmV3IFN0cmluZ1tdeyJBIn0pOworICAgICAgICBjaGVja0ZpbGUocmVsZWFzZUZpbGVPdXRwdXQsICJwcm9ndWFyZC50eHQiLCBuZXcgU3RyaW5nW117IkEiLCAiQiIsICJDIn0pOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3QzcmRQYXJ0eVRlc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGN1c3RvbSBiZWNhdXNlIHdlIHdhbnQgdG8gcnVuIGRldmljZUNoZWNrIGV2ZW4gd2l0aG91dCBkZXZpY2VzLCBzaW5jZSB3ZSB1c2UKICAgICAgICAgLy8gYSBmYWtlIERldmljZVByb3ZpZGVyIHRoYXQgZG9lc24ndCB1c2UgYSBkZXZpY2UsIGJ1dCBvbmx5IHJlY29yZCB0aGUgY2FsbHMgbWFkZQogICAgICAgICAvLyB0byB0aGUgRGV2aWNlUHJvdmlkZXIgYW5kIHRoZSBEZXZpY2VDb25uZWN0b3IuCi0gICAgICAgIHJ1bkdyYWRsZVRhc2tzKHNka0RpciwgQmFzZVBsdWdpbi5HUkFETEVfTUlOX1ZFUlNJT04sCisgICAgICAgIHJ1bkdyYWRsZVRhc2tzKHNka0RpciwgbmRrRGlyLCBCYXNlUGx1Z2luLkdSQURMRV9NSU5fVkVSU0lPTiwKICAgICAgICAgICAgICAgICBuZXcgRmlsZSh0ZXN0RGlyLCAiM3JkUGFydHlUZXN0cyIpLCAiY2xlYW4iLCAiZGV2aWNlQ2hlY2siKTsKICAgICB9CiAKQEAgLTg2LDQgKzE1MCwxNiBAQAogICAgICAgICAgICAgICAgIGV4cGVjdGVkQ29sb3IsIHJnYiwgZiksCiAgICAgICAgICAgICAgICAgZXhwZWN0ZWRDb2xvciwgcmdiKTsKICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRmlsZShGaWxlIGZvbGRlciwgU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmdbXSBleHBlY3RlZENvbnRlbnRzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZm9sZGVyLCBmaWxlTmFtZSk7CisgICAgICAgIGFzc2VydFRydWUoIkZpbGUgJyIgKyBmLmdldEFic29sdXRlUGF0aCgpICsgIicgZG9lcyBub3QgZXhpc3QuIiwgZi5pc0ZpbGUoKSk7CisKKyAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gRmlsZXMudG9TdHJpbmcoZiwgQ2hhcnNldHMuVVRGXzgpOworICAgICAgICBmb3IgKFN0cmluZyBleHBlY3RlZENvbnRlbnQgOiBleHBlY3RlZENvbnRlbnRzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGaWxlICciICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSArICInIGRvZXMgbm90IGNvbnRhaW46ICIgKyBleHBlY3RlZENvbnRlbnQsCisgICAgICAgICAgICAgICAgY29udGVudHMuY29udGFpbnMoZXhwZWN0ZWRDb250ZW50KSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL2RldmljZS10ZXN0L2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvRGV2aWNlVGVzdC5qYXZhIGIvZ3JhZGxlL3NyYy9kZXZpY2UtdGVzdC9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0RldmljZVRlc3QuamF2YQppbmRleCA5M2I1M2I2Li4wZTQxMGYxIDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL2RldmljZS10ZXN0L2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvRGV2aWNlVGVzdC5qYXZhCisrKyBiL2dyYWRsZS9zcmMvZGV2aWNlLXRlc3QvZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9EZXZpY2VUZXN0LmphdmEKQEAgLTM5LDggKzM5LDkgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHNCdWlsdFByb2plY3RzID0gbmV3IFN0cmluZ1tdIHsKICAgICAgICAgImFwaSIsICJhc3NldHMiLCAiYXBwbGlidGVzdCIsICJhdHRyT3JkZXIiLCAiYmFzaWMiLCAiZGVwZW5kZW5jaWVzIiwgImZsYXZvcmVkIiwKLSAgICAgICAgImZsYXZvcmxpYiIsICJmbGF2b3JzIiwgImxpYlRlc3REZXAiLCAibGlic1Rlc3QiLCAibWlncmF0ZWQiLCAibXVsdGlyZXMiLCAib3ZlcmxheTEiLAotICAgICAgICAib3ZlcmxheTIiLCAicGtnT3ZlcnJpZGUiLCAicHJvZ3VhcmQiLCAicHJvZ3VhcmRMaWIiLCAic2FtZU5hbWVkTGlicyIKKyAgICAgICAgImZsYXZvcmxpYiIsICJmbGF2b3JzIiwgImxpYlByb2d1YXJkSmFyRGVwIiwgImxpYlByb2d1YXJkTGliRGVwIiwgImxpYlRlc3REZXAiLCAibGlic1Rlc3QiLAorICAgICAgICAibWlncmF0ZWQiLCAibXVsdGlyZXMiLCAibmRrSm5pTGliIiwgIm92ZXJsYXkxIiwgIm92ZXJsYXkyIiwgInBrZ092ZXJyaWRlIiwgInByb2d1YXJkIiwKKyAgICAgICAgInByb2d1YXJkTGliIiwgInNhbWVOYW1lZExpYnMiCiAgICAgfTsKIAogICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKQEAgLTQ4LDYgKzQ5LDkgQEAKICAgICAgICAgc3VpdGUuc2V0TmFtZSgiRGV2aWNlVGVzdCIpOwogCiAgICAgICAgIGZvciAoU3RyaW5nIGdyYWRsZVZlcnNpb24gOiBCYXNlUGx1Z2luLkdSQURMRV9TVVBQT1JURURfVkVSU0lPTlMpIHsKKyAgICAgICAgICAgIGlmIChpc0lnbm9yZWRHcmFkbGVWZXJzaW9uKGdyYWRsZVZlcnNpb24pKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBmaXJzdCB0aGUgcHJvamVjdCB3ZSBidWlsZCBvbiBhbGwgYXZhaWxhYmxlIHZlcnNpb25zIG9mIEdyYWRsZQogICAgICAgICAgICAgZm9yIChTdHJpbmcgcHJvamVjdE5hbWUgOiBzQnVpbHRQcm9qZWN0cykgewogICAgICAgICAgICAgICAgIFN0cmluZyB0ZXN0TmFtZSA9ICJjaGVja18iICsgcHJvamVjdE5hbWUgKyAiXyIgKyBncmFkbGVWZXJzaW9uOwpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9mcm9tR3JhZGxlL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdGVzdC9yZXBvcnQvQ2xhc3NQYWdlUmVuZGVyZXIuamF2YSBiL2dyYWRsZS9zcmMvZnJvbUdyYWRsZS9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL3Rlc3QvcmVwb3J0L0NsYXNzUGFnZVJlbmRlcmVyLmphdmEKaW5kZXggMjIzY2E3Ni4uZWUzMTE0NiAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9mcm9tR3JhZGxlL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdGVzdC9yZXBvcnQvQ2xhc3NQYWdlUmVuZGVyZXIuamF2YQorKysgYi9ncmFkbGUvc3JjL2Zyb21HcmFkbGUvZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC90ZXN0L3JlcG9ydC9DbGFzc1BhZ2VSZW5kZXJlci5qYXZhCkBAIC0yMSw3ICsyMSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLkVycm9yaW5nQWN0aW9uOwogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLmh0bWwuU2ltcGxlSHRtbFdyaXRlcjsKLWltcG9ydCBvcmcuZ3JhZGxlLmFwaS5pbnRlcm5hbC50YXNrcy50ZXN0aW5nLmp1bml0LnJlcG9ydC5UZXN0RmFpbHVyZTsKK2ltcG9ydCBvcmcuZ3JhZGxlLmFwaS5pbnRlcm5hbC50YXNrcy50ZXN0aW5nLmp1bml0LnJlc3VsdC5UZXN0RmFpbHVyZTsKIGltcG9ydCBvcmcuZ3JhZGxlLnJlcG9ydGluZy5Db2RlUGFuZWxSZW5kZXJlcjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL2Zyb21HcmFkbGUvZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC90ZXN0L3JlcG9ydC9UZXN0UmVzdWx0LmphdmEgYi9ncmFkbGUvc3JjL2Zyb21HcmFkbGUvZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC90ZXN0L3JlcG9ydC9UZXN0UmVzdWx0LmphdmEKaW5kZXggYTQ0MzVkNS4uOTBlY2M4YSAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9mcm9tR3JhZGxlL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdGVzdC9yZXBvcnQvVGVzdFJlc3VsdC5qYXZhCisrKyBiL2dyYWRsZS9zcmMvZnJvbUdyYWRsZS9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL3Rlc3QvcmVwb3J0L1Rlc3RSZXN1bHQuamF2YQpAQCAtMTUsNyArMTUsNyBAQAogICovCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC50ZXN0LnJlcG9ydDsKIAotaW1wb3J0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLnRhc2tzLnRlc3RpbmcuanVuaXQucmVwb3J0LlRlc3RGYWlsdXJlOworaW1wb3J0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLnRhc2tzLnRlc3RpbmcuanVuaXQucmVzdWx0LlRlc3RGYWlsdXJlOwogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLnRhc2tzLnRlc3RpbmcuanVuaXQucmVwb3J0LlRlc3RSZXN1bHRNb2RlbDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0xMDEsNyArMTAxLDcgQEAKICAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgc3RhY2tUcmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXZpY2VOYW1lLCBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBmbGF2b3JOYW1lKSB7CiAgICAgICAgIGNsYXNzUmVzdWx0cy5mYWlsZWQodGhpcywgZGV2aWNlTmFtZSwgcHJvamVjdE5hbWUsIGZsYXZvck5hbWUpOwotICAgICAgICBmYWlsdXJlcy5hZGQobmV3IFRlc3RGYWlsdXJlKG1lc3NhZ2UsIHN0YWNrVHJhY2UpKTsKKyAgICAgICAgZmFpbHVyZXMuYWRkKG5ldyBUZXN0RmFpbHVyZShtZXNzYWdlLCBzdGFja1RyYWNlLCBudWxsKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgaWdub3JlZCgpIHsKZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0FwcFBsdWdpbi5ncm9vdnkgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9BcHBQbHVnaW4uZ3Jvb3Z5CmluZGV4IDA3M2FhN2IuLjMyYTEzYWQgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0FwcFBsdWdpbi5ncm9vdnkKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvQXBwUGx1Z2luLmdyb292eQpAQCAtMTUsNyArMTUsNiBAQAogICovCiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlCi0KIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsCiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGUKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuYXBpLkJhc2VWYXJpYW50CkBAIC01Nyw3ICs1Niw2IEBACiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmJ1aWxkZXIuQnVpbGRlckNvbnN0YW50cy5MSU5UCiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmJ1aWxkZXIuQnVpbGRlckNvbnN0YW50cy5SRUxFQVNFCiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmJ1aWxkZXIuQnVpbGRlckNvbnN0YW50cy5VSV9URVNUCi0KIC8qKgogICogR3JhZGxlIHBsdWdpbiBjbGFzcyBmb3IgJ2FwcGxpY2F0aW9uJyBwcm9qZWN0cy4KICAqLwpAQCAtMTQxLDcgKzEzOSw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQnVpbGRUeXBlIG5hbWVzIGNhbm5vdCBjb2xsaWRlIHdpdGggUHJvZHVjdEZsYXZvciBuYW1lcyIpCiAgICAgICAgIH0KIAotICAgICAgICBkZWYgc291cmNlU2V0ID0gZXh0ZW5zaW9uLnNvdXJjZVNldHNDb250YWluZXIuY3JlYXRlKG5hbWUpCisgICAgICAgIGRlZiBzb3VyY2VTZXQgPSBleHRlbnNpb24uc291cmNlU2V0c0NvbnRhaW5lci5tYXliZUNyZWF0ZShuYW1lKQogCiAgICAgICAgIEJ1aWxkVHlwZURhdGEgYnVpbGRUeXBlRGF0YSA9IG5ldyBCdWlsZFR5cGVEYXRhKGJ1aWxkVHlwZSwgc291cmNlU2V0LCBwcm9qZWN0KQogICAgICAgICBwcm9qZWN0LnRhc2tzLmFzc2VtYmxlLmRlcGVuZHNPbiBidWlsZFR5cGVEYXRhLmFzc2VtYmxlVGFzawpAQCAtMTYzLDkgKzE2MSw5IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUHJvZHVjdEZsYXZvciBuYW1lcyBjYW5ub3QgY29sbGlkZSB3aXRoIEJ1aWxkVHlwZSBuYW1lcyIpCiAgICAgICAgIH0KIAotICAgICAgICBkZWYgbWFpblNvdXJjZVNldCA9IChEZWZhdWx0QW5kcm9pZFNvdXJjZVNldCkgZXh0ZW5zaW9uLnNvdXJjZVNldHNDb250YWluZXIuY3JlYXRlKHByb2R1Y3RGbGF2b3IubmFtZSkKKyAgICAgICAgZGVmIG1haW5Tb3VyY2VTZXQgPSAoRGVmYXVsdEFuZHJvaWRTb3VyY2VTZXQpIGV4dGVuc2lvbi5zb3VyY2VTZXRzQ29udGFpbmVyLm1heWJlQ3JlYXRlKHByb2R1Y3RGbGF2b3IubmFtZSkKICAgICAgICAgU3RyaW5nIHRlc3ROYW1lID0gIiR7SU5TVFJVTUVOVF9URVNUfSR7cHJvZHVjdEZsYXZvci5uYW1lLmNhcGl0YWxpemUoKX0iCi0gICAgICAgIGRlZiB0ZXN0U291cmNlU2V0ID0gKERlZmF1bHRBbmRyb2lkU291cmNlU2V0KSBleHRlbnNpb24uc291cmNlU2V0c0NvbnRhaW5lci5jcmVhdGUodGVzdE5hbWUpCisgICAgICAgIGRlZiB0ZXN0U291cmNlU2V0ID0gKERlZmF1bHRBbmRyb2lkU291cmNlU2V0KSBleHRlbnNpb24uc291cmNlU2V0c0NvbnRhaW5lci5tYXliZUNyZWF0ZSh0ZXN0TmFtZSkKIAogICAgICAgICBQcm9kdWN0Rmxhdm9yRGF0YTxHcm91cGFibGVQcm9kdWN0Rmxhdm9yRHNsPiBwcm9kdWN0Rmxhdm9yRGF0YSA9CiAgICAgICAgICAgICAgICAgbmV3IFByb2R1Y3RGbGF2b3JEYXRhPEdyb3VwYWJsZVByb2R1Y3RGbGF2b3JEc2w+KApAQCAtMjMyLDYgKzIzMCwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgLy8gQWRkIGEgY29tcGlsZSBsaW50IHRhc2sKKyAgICAgICAgY3JlYXRlTGludENvbXBpbGVUYXNrKCkKKworICAgICAgICAvLyBjcmVhdGUgdGhlIGxpbnQgdGFza3MuCisgICAgICAgIGNyZWF0ZUxpbnRUYXNrcygpCisKICAgICAgICAgLy8gY3JlYXRlIHRoZSB0ZXN0IHRhc2tzLgogICAgICAgICBjcmVhdGVDaGVja1Rhc2tzKCFwcm9kdWN0Rmxhdm9ycy5pc0VtcHR5KCksIGZhbHNlIC8qaXNMaWJyYXJ5Ki8pCiAKQEAgLTI4OSwxMyArMjkzLDE2IEBACiAKICAgICAgICAgZm9yIChCdWlsZFR5cGVEYXRhIGJ1aWxkVHlwZURhdGEgOiBidWlsZFR5cGVzLnZhbHVlcygpKSB7CiAgICAgICAgICAgICBkZWYgdmFyaWFudENvbmZpZyA9IG5ldyBWYXJpYW50Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbmZpZ0RhdGEucHJvZHVjdEZsYXZvciwgZGVmYXVsdENvbmZpZ0RhdGEuc291cmNlU2V0LAotICAgICAgICAgICAgICAgICAgICBidWlsZFR5cGVEYXRhLmJ1aWxkVHlwZSwgYnVpbGRUeXBlRGF0YS5zb3VyY2VTZXQsIHByb2plY3QubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbmZpZ0RhdGEucHJvZHVjdEZsYXZvciwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbmZpZ0RhdGEuc291cmNlU2V0LAorICAgICAgICAgICAgICAgICAgICBidWlsZFR5cGVEYXRhLmJ1aWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRUeXBlRGF0YS5zb3VyY2VTZXQpCiAKICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdmFyaWFudCBhbmQgZ2V0IGl0cyBpbnRlcm5hbCBzdG9yYWdlIG9iamVjdC4KICAgICAgICAgICAgIEFwcGxpY2F0aW9uVmFyaWFudERhdGEgYXBwVmFyaWFudERhdGEgPSBuZXcgQXBwbGljYXRpb25WYXJpYW50RGF0YSh2YXJpYW50Q29uZmlnKQogICAgICAgICAgICAgVmFyaWFudERlcGVuZGVuY2llcyB2YXJpYW50RGVwID0gVmFyaWFudERlcGVuZGVuY2llcy5jb21wdXRlKAotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LCBhcHBWYXJpYW50RGF0YS5uYW1lLCBidWlsZFR5cGVEYXRhLCBkZWZhdWx0Q29uZmlnRGF0YS5tYWluUHJvdmlkZXIpCisgICAgICAgICAgICAgICAgICAgIHByb2plY3QsIGFwcFZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLAorICAgICAgICAgICAgICAgICAgICBidWlsZFR5cGVEYXRhLCBkZWZhdWx0Q29uZmlnRGF0YS5tYWluUHJvdmlkZXIpCiAgICAgICAgICAgICBhcHBWYXJpYW50RGF0YS5zZXRWYXJpYW50RGVwZW5kZW5jeSh2YXJpYW50RGVwKQogCiAgICAgICAgICAgICB2YXJpYW50RGF0YUxpc3QuYWRkKGFwcFZhcmlhbnREYXRhKQpAQCAtMzA5LDEwICszMTYsMTEgQEAKIAogICAgICAgICAvLyBoYW5kbGUgdGhlIHRlc3QgdmFyaWFudAogICAgICAgICBkZWYgdGVzdFZhcmlhbnRDb25maWcgPSBuZXcgVmFyaWFudENvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICAgICAgZGVmYXVsdENvbmZpZ0RhdGEucHJvZHVjdEZsYXZvciwgZGVmYXVsdENvbmZpZ0RhdGEudGVzdFNvdXJjZVNldCwKLSAgICAgICAgICAgICAgICB0ZXN0RGF0YS5idWlsZFR5cGUsIG51bGwsCi0gICAgICAgICAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24uVHlwZS5URVNULCB0ZXN0ZWRWYXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICBwcm9qZWN0Lm5hbWUpCisgICAgICAgICAgICAgICAgZGVmYXVsdENvbmZpZ0RhdGEucHJvZHVjdEZsYXZvciwKKyAgICAgICAgICAgICAgICBkZWZhdWx0Q29uZmlnRGF0YS50ZXN0U291cmNlU2V0LAorICAgICAgICAgICAgICAgIHRlc3REYXRhLmJ1aWxkVHlwZSwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIFZhcmlhbnRDb25maWd1cmF0aW9uLlR5cGUuVEVTVCwgdGVzdGVkVmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24pCiAKICAgICAgICAgLy8gY3JlYXRlIHRoZSBpbnRlcm5hbCBzdG9yYWdlIGZvciB0aGlzIHZhcmlhbnQuCiAgICAgICAgIGRlZiB0ZXN0VmFyaWFudERhdGEgPSBuZXcgVGVzdFZhcmlhbnREYXRhKHRlc3RWYXJpYW50Q29uZmlnLCB0ZXN0ZWRWYXJpYW50RGF0YSkKQEAgLTMyMiw3ICszMzAsOCBAQAogCiAgICAgICAgIC8vIGRlcGVuZGVuY2llcyBmb3IgdGhlIHRlc3QgdmFyaWFudAogICAgICAgICBWYXJpYW50RGVwZW5kZW5jaWVzIHZhcmlhbnREZXAgPSBWYXJpYW50RGVwZW5kZW5jaWVzLmNvbXB1dGUoCi0gICAgICAgICAgICAgICAgcHJvamVjdCwgdGVzdFZhcmlhbnREYXRhLm5hbWUsIGRlZmF1bHRDb25maWdEYXRhLnRlc3RQcm92aWRlcikKKyAgICAgICAgICAgICAgICBwcm9qZWN0LCB0ZXN0VmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZnVsbE5hbWUsCisgICAgICAgICAgICAgICAgZGVmYXVsdENvbmZpZ0RhdGEudGVzdFByb3ZpZGVyKQogICAgICAgICB0ZXN0VmFyaWFudERhdGEuc2V0VmFyaWFudERlcGVuZGVuY3kodmFyaWFudERlcCkKIAogICAgICAgICAvLyBub3cgbG9vcCBvbiB0aGUgVmFyaWFudERlcGVuZGVuY3kgYW5kIHJlc29sdmUgdGhlbSwgYW5kIGNyZWF0ZSB0aGUgdGFza3MKQEAgLTQyMywxMSArNDMyLDIxIEBACiAgICAgICAgICAgICB2YXJpYW50UHJvdmlkZXJzLmFkZChidWlsZFR5cGVEYXRhKQogCiAgICAgICAgICAgICBWYXJpYW50Q29uZmlndXJhdGlvbiB2YXJpYW50Q29uZmlnID0gbmV3IFZhcmlhbnRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVmYXVsdENvbmZpZywgZ2V0RGVmYXVsdENvbmZpZ0RhdGEoKS5zb3VyY2VTZXQsCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkVHlwZURhdGEuYnVpbGRUeXBlLCBidWlsZFR5cGVEYXRhLnNvdXJjZVNldCwgcHJvamVjdC5uYW1lKQorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVmYXVsdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdENvbmZpZ0RhdGEoKS5zb3VyY2VTZXQsCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkVHlwZURhdGEuYnVpbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICBidWlsZFR5cGVEYXRhLnNvdXJjZVNldCkKIAogICAgICAgICAgICAgZm9yIChQcm9kdWN0Rmxhdm9yRGF0YSBkYXRhIDogZmxhdm9yRGF0YUxpc3QpIHsKLSAgICAgICAgICAgICAgICB2YXJpYW50Q29uZmlnLmFkZFByb2R1Y3RGbGF2b3IoZGF0YS5wcm9kdWN0Rmxhdm9yLCBkYXRhLnNvdXJjZVNldCkKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGltZW5zaW9uTmFtZSA9ICIiOworICAgICAgICAgICAgICAgIGlmIChkYXRhLnByb2R1Y3RGbGF2b3IgaW5zdGFuY2VvZiBHcm91cGFibGVQcm9kdWN0Rmxhdm9yRHNsKSB7CisgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbk5hbWUgPSAoKEdyb3VwYWJsZVByb2R1Y3RGbGF2b3JEc2wpIGRhdGEucHJvZHVjdEZsYXZvcikuZmxhdm9yR3JvdXAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFyaWFudENvbmZpZy5hZGRQcm9kdWN0Rmxhdm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wcm9kdWN0Rmxhdm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zb3VyY2VTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25OYW1lCisgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgIHZhcmlhbnRQcm92aWRlcnMuYWRkKGRhdGEubWFpblByb3ZpZGVyKQogICAgICAgICAgICAgfQogCkBAIC00MzYsOCArNDU1LDIxIEBACiAKICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdmFyaWFudCBhbmQgZ2V0IGl0cyBpbnRlcm5hbCBzdG9yYWdlIG9iamVjdC4KICAgICAgICAgICAgIEFwcGxpY2F0aW9uVmFyaWFudERhdGEgYXBwVmFyaWFudERhdGEgPSBuZXcgQXBwbGljYXRpb25WYXJpYW50RGF0YSh2YXJpYW50Q29uZmlnKQorCisgICAgICAgICAgICBEZWZhdWx0QW5kcm9pZFNvdXJjZVNldCB2YXJpYW50U291cmNlU2V0ID0gKERlZmF1bHRBbmRyb2lkU291cmNlU2V0KSBleHRlbnNpb24uc291cmNlU2V0c0NvbnRhaW5lci5tYXliZUNyZWF0ZSh2YXJpYW50Q29uZmlnLmZ1bGxOYW1lKQorICAgICAgICAgICAgdmFyaWFudENvbmZpZy5zZXRWYXJpYW50U291cmNlUHJvdmlkZXIodmFyaWFudFNvdXJjZVNldCkKKyAgICAgICAgICAgIC8vIFRPRE86IGhtbSB0aGlzIHdvbid0IHdvcmsKKyAgICAgICAgICAgIC8vdmFyaWFudFByb3ZpZGVycy5hZGQobmV3IENvbmZpZ3VyYXRpb25Qcm92aWRlckltcGwocHJvamVjdCwgdmFyaWFudFNvdXJjZVNldCkpCisKKyAgICAgICAgICAgIGlmIChmbGF2b3JEYXRhTGlzdC5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgRGVmYXVsdEFuZHJvaWRTb3VyY2VTZXQgbXVsdGlGbGF2b3JTb3VyY2VTZXQgPSAoRGVmYXVsdEFuZHJvaWRTb3VyY2VTZXQpIGV4dGVuc2lvbi5zb3VyY2VTZXRzQ29udGFpbmVyLm1heWJlQ3JlYXRlKHZhcmlhbnRDb25maWcuZmxhdm9yTmFtZSkKKyAgICAgICAgICAgICAgICB2YXJpYW50Q29uZmlnLnNldE11bHRpRmxhdm9yU291cmNlUHJvdmlkZXIobXVsdGlGbGF2b3JTb3VyY2VTZXQpCisgICAgICAgICAgICAgICAgLy8gVE9ETzogaG1tIHRoaXMgd29uJ3Qgd29yaworICAgICAgICAgICAgICAgIC8vdmFyaWFudFByb3ZpZGVycy5hZGQobmV3IENvbmZpZ3VyYXRpb25Qcm92aWRlckltcGwocHJvamVjdCwgbXVsdGlGbGF2b3JTb3VyY2VTZXQpKQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBWYXJpYW50RGVwZW5kZW5jaWVzIHZhcmlhbnREZXAgPSBWYXJpYW50RGVwZW5kZW5jaWVzLmNvbXB1dGUoCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3QsIGFwcFZhcmlhbnREYXRhLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2plY3QsIGFwcFZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLAogICAgICAgICAgICAgICAgICAgICB2YXJpYW50UHJvdmlkZXJzLnRvQXJyYXkobmV3IENvbmZpZ3VyYXRpb25Qcm92aWRlclt2YXJpYW50UHJvdmlkZXJzLnNpemUoKV0pKQogICAgICAgICAgICAgYXBwVmFyaWFudERhdGEuc2V0VmFyaWFudERlcGVuZGVuY3kodmFyaWFudERlcCkKIApAQCAtNDUyLDEwICs0ODQsMTIgQEAKIAogICAgICAgICAvLyBoYW5kbGUgdGVzdCB2YXJpYW50CiAgICAgICAgIFZhcmlhbnRDb25maWd1cmF0aW9uIHRlc3RWYXJpYW50Q29uZmlnID0gbmV3IFZhcmlhbnRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZWZhdWx0Q29uZmlnLCBnZXREZWZhdWx0Q29uZmlnRGF0YSgpLnRlc3RTb3VyY2VTZXQsCi0gICAgICAgICAgICAgICAgdGVzdERhdGEuYnVpbGRUeXBlLCBudWxsLAorICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZWZhdWx0Q29uZmlnLAorICAgICAgICAgICAgICAgIGdldERlZmF1bHRDb25maWdEYXRhKCkudGVzdFNvdXJjZVNldCwKKyAgICAgICAgICAgICAgICB0ZXN0RGF0YS5idWlsZFR5cGUsCisgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICBWYXJpYW50Q29uZmlndXJhdGlvbi5UeXBlLlRFU1QsCi0gICAgICAgICAgICAgICAgdGVzdGVkVmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24sIHByb2plY3QubmFtZSkKKyAgICAgICAgICAgICAgICB0ZXN0ZWRWYXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbikKIAogICAgICAgICAvLy8gYWRkIHRoZSBjb250YWluZXIgb2YgZGVwZW5kZW5jaWVzCiAgICAgICAgIC8vIHRoZSBvcmRlciBvZiB0aGUgbGlicmFyaWVzIGlzIGltcG9ydGFudC4gSW4gZGVzY2VuZGluZyBvcmRlcjoKQEAgLTQ2Myw3ICs0OTcsMTQgQEAKICAgICAgICAgTGlzdDxDb25maWd1cmF0aW9uUHJvdmlkZXI+IHRlc3RWYXJpYW50UHJvdmlkZXJzID0gW10KIAogICAgICAgICBmb3IgKFByb2R1Y3RGbGF2b3JEYXRhIGRhdGEgOiBmbGF2b3JEYXRhTGlzdCkgewotICAgICAgICAgICAgdGVzdFZhcmlhbnRDb25maWcuYWRkUHJvZHVjdEZsYXZvcihkYXRhLnByb2R1Y3RGbGF2b3IsIGRhdGEudGVzdFNvdXJjZVNldCkKKyAgICAgICAgICAgIFN0cmluZyBkaW1lbnNpb25OYW1lID0gIiI7CisgICAgICAgICAgICBpZiAoZGF0YS5wcm9kdWN0Rmxhdm9yIGluc3RhbmNlb2YgR3JvdXBhYmxlUHJvZHVjdEZsYXZvckRzbCkgeworICAgICAgICAgICAgICAgIGRpbWVuc2lvbk5hbWUgPSAoKEdyb3VwYWJsZVByb2R1Y3RGbGF2b3JEc2wpIGRhdGEucHJvZHVjdEZsYXZvcikuZmxhdm9yR3JvdXAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRlc3RWYXJpYW50Q29uZmlnLmFkZFByb2R1Y3RGbGF2b3IoCisgICAgICAgICAgICAgICAgICAgIGRhdGEucHJvZHVjdEZsYXZvciwKKyAgICAgICAgICAgICAgICAgICAgZGF0YS50ZXN0U291cmNlU2V0LAorICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25OYW1lKQogICAgICAgICAgICAgdGVzdFZhcmlhbnRQcm92aWRlcnMuYWRkKGRhdGEudGVzdFByb3ZpZGVyKQogICAgICAgICB9CiAKQEAgLTQ3OCw3ICs1MTksNyBAQAogCiAgICAgICAgIC8vIGRlcGVuZGVuY2llcyBmb3IgdGhlIHRlc3QgdmFyaWFudAogICAgICAgICBWYXJpYW50RGVwZW5kZW5jaWVzIHZhcmlhbnREZXAgPSBWYXJpYW50RGVwZW5kZW5jaWVzLmNvbXB1dGUoCi0gICAgICAgICAgICAgICAgcHJvamVjdCwgdGVzdFZhcmlhbnREYXRhLm5hbWUsCisgICAgICAgICAgICAgICAgcHJvamVjdCwgdGVzdFZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLAogICAgICAgICAgICAgICAgIHRlc3RWYXJpYW50UHJvdmlkZXJzLnRvQXJyYXkobmV3IENvbmZpZ3VyYXRpb25Qcm92aWRlclt0ZXN0VmFyaWFudFByb3ZpZGVycy5zaXplKCldKSkKICAgICAgICAgdGVzdFZhcmlhbnREYXRhLnNldFZhcmlhbnREZXBlbmRlbmN5KHZhcmlhbnREZXApCiAKQEAgLTUyNyw3ICs1NjgsNyBAQAogICAgICAgICAgICAgQE5vbk51bGwgQXBwbGljYXRpb25WYXJpYW50RGF0YSB2YXJpYW50LAogICAgICAgICAgICAgQE51bGxhYmxlIFRhc2sgYXNzZW1ibGVUYXNrKSB7CiAKLSAgICAgICAgY3JlYXRlUHJlcGFyZURlcGVuZGVuY2llc1Rhc2sodmFyaWFudCkKKyAgICAgICAgY3JlYXRlQW5jaG9yVGFza3ModmFyaWFudCkKIAogICAgICAgICAvLyBBZGQgYSB0YXNrIHRvIHByb2Nlc3MgdGhlIG1hbmlmZXN0KHMpCiAgICAgICAgIGNyZWF0ZVByb2Nlc3NNYW5pZmVzdFRhc2sodmFyaWFudCwgIm1hbmlmZXN0cyIpCkBAIC01NTUsNiArNTk2LDkgQEAKICAgICAgICAgLy8gQWRkIGEgY29tcGlsZSB0YXNrCiAgICAgICAgIGNyZWF0ZUNvbXBpbGVUYXNrKHZhcmlhbnQsIG51bGwvKnRlc3RlZFZhcmlhbnQqLykKIAorICAgICAgICAvLyBBZGQgTkRLIHRhc2tzCisgICAgICAgIGNyZWF0ZU5ka1Rhc2tzKHZhcmlhbnQpCisKICAgICAgICAgYWRkUGFja2FnZVRhc2tzKHZhcmlhbnQsIGFzc2VtYmxlVGFzaykKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9CYXNlRXh0ZW5zaW9uLmdyb292eSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0Jhc2VFeHRlbnNpb24uZ3Jvb3Z5CmluZGV4IGU4MDA3NTMuLjk3NGZlMTYgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0Jhc2VFeHRlbnNpb24uZ3Jvb3Z5CisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0Jhc2VFeHRlbnNpb24uZ3Jvb3Z5CkBAIC0xNyw5ICsxNywxMiBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuU2RrQ29uc3RhbnRzCiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbAoraW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmFwaS5BbmRyb2lkU291cmNlU2V0CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmFwaS5CYXNlVmFyaWFudAogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5hcGkuVGVzdFZhcmlhbnQKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwuQ29tcGlsZU9wdGlvbnMKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwuU291cmNlU2V0U291cmNlUHJvdmlkZXJXcmFwcGVyCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLmRzbC5BYXB0T3B0aW9uc0ltcGwKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwuZHNsLkFuZHJvaWRTb3VyY2VTZXRGYWN0b3J5CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLmRzbC5EZXhPcHRpb25zSW1wbApAQCAtMjcsNiArMzAsOSBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC50ZXN0LlRlc3RPcHRpb25zCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5CdWlsZGVyQ29uc3RhbnRzCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5EZWZhdWx0UHJvZHVjdEZsYXZvcgoraW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQnVpbGRUeXBlCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Qcm9kdWN0Rmxhdm9yCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Tb3VyY2VQcm92aWRlcgogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIudGVzdGluZy5hcGkuRGV2aWNlUHJvdmlkZXIKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLnRlc3RpbmcuYXBpLlRlc3RTZXJ2ZXIKIGltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIucmVwb3NpdG9yeS5GdWxsUmV2aXNpb24KQEAgLTM4LDggKzQ0LDggQEAKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS5hcnRpZmFjdHMuQ29uZmlndXJhdGlvbkNvbnRhaW5lcgogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLkRlZmF1bHREb21haW5PYmplY3RTZXQKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RJbnRlcm5hbAoraW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLlNvdXJjZVNldAogaW1wb3J0IG9yZy5ncmFkbGUuaW50ZXJuYWwucmVmbGVjdC5JbnN0YW50aWF0b3IKLQogLyoqCiAgKiBCYXNlIGFuZHJvaWQgZXh0ZW5zaW9uIGZvciBhbGwgYW5kcm9pZCBwbHVnaW5zLgogICovCkBAIC03Miw3ICs3OCw3IEBACiAgICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luCiAKICAgICAgICAgZGVmYXVsdENvbmZpZyA9IGluc3RhbnRpYXRvci5uZXdJbnN0YW5jZShQcm9kdWN0Rmxhdm9yRHNsLmNsYXNzLCBCdWlsZGVyQ29uc3RhbnRzLk1BSU4sCi0gICAgICAgICAgICAgICAgcHJvamVjdC5maWxlUmVzb2x2ZXIpCisgICAgICAgICAgICAgICAgcHJvamVjdC5maWxlUmVzb2x2ZXIsIGluc3RhbnRpYXRvcikKIAogICAgICAgICBhYXB0T3B0aW9ucyA9IGluc3RhbnRpYXRvci5uZXdJbnN0YW5jZShBYXB0T3B0aW9uc0ltcGwuY2xhc3MpCiAgICAgICAgIGRleE9wdGlvbnMgPSBpbnN0YW50aWF0b3IubmV3SW5zdGFuY2UoRGV4T3B0aW9uc0ltcGwuY2xhc3MpCkBAIC0yMDEsNiArMjA3LDQ5IEBACiAgICAgICAgIHRlc3RWYXJpYW50TGlzdC5hZGQodGVzdFZhcmlhbnQpCiAgICAgfQogCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJBcnRpZmFjdFR5cGUoQE5vbk51bGwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFydGlmYWN0VHlwZSkgeworICAgICAgICBwbHVnaW4ucmVnaXN0ZXJBcnRpZmFjdFR5cGUobmFtZSwgaXNUZXN0LCBhcnRpZmFjdFR5cGUpCisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJCdWlsZFR5cGVTb3VyY2VQcm92aWRlcigKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgQE5vbk51bGwgQnVpbGRUeXBlIGJ1aWxkVHlwZSwKKyAgICAgICAgICAgIEBOb25OdWxsIFNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyKSB7CisgICAgICAgIHBsdWdpbi5yZWdpc3RlckJ1aWxkVHlwZVNvdXJjZVByb3ZpZGVyKG5hbWUsIGJ1aWxkVHlwZSwgc291cmNlUHJvdmlkZXIpCisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJQcm9kdWN0Rmxhdm9yU291cmNlUHJvdmlkZXIoCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIEBOb25OdWxsIFByb2R1Y3RGbGF2b3IgcHJvZHVjdEZsYXZvciwKKyAgICAgICAgICAgIEBOb25OdWxsIFNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyKSB7CisgICAgICAgIHBsdWdpbi5yZWdpc3RlclByb2R1Y3RGbGF2b3JTb3VyY2VQcm92aWRlcihuYW1lLCBwcm9kdWN0Rmxhdm9yLCBzb3VyY2VQcm92aWRlcikKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckphdmFBcnRpZmFjdCgKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgQE5vbk51bGwgQmFzZVZhcmlhbnQgdmFyaWFudCwKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBhc3NlbWJsZVRhc2tOYW1lLAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIGphdmFDb21waWxlVGFza05hbWUsCisgICAgICAgICAgICBATm9uTnVsbCBGaWxlIGNsYXNzZXNGb2xkZXIsCisgICAgICAgICAgICBATnVsbGFibGUgU291cmNlUHJvdmlkZXIgc291cmNlUHJvdmlkZXIpIHsKKyAgICAgICAgcGx1Z2luLnJlZ2lzdGVySmF2YUFydGlmYWN0KG5hbWUsIHZhcmlhbnQsIGFzc2VtYmxlVGFza05hbWUsIGphdmFDb21waWxlVGFza05hbWUsCisgICAgICAgICAgICAgICAgY2xhc3Nlc0ZvbGRlciwgc291cmNlUHJvdmlkZXIpCisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJNdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyKAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgZmxhdm9yTmFtZSwKKyAgICAgICAgICAgIEBOb25OdWxsIFNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyKSB7CisgICAgICAgIHBsdWdpbi5yZWdpc3Rlck11bHRpRmxhdm9yU291cmNlUHJvdmlkZXIobmFtZSwgZmxhdm9yTmFtZSwgc291cmNlUHJvdmlkZXIpCisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgU291cmNlUHJvdmlkZXIgd3JhcEphdmFTb3VyY2VTZXQoQE5vbk51bGwgU291cmNlU2V0IHNvdXJjZVNldCkgeworICAgICAgICByZXR1cm4gbmV3IFNvdXJjZVNldFNvdXJjZVByb3ZpZGVyV3JhcHBlcihzb3VyY2VTZXQpCisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyBnZXRDb21waWxlU2RrVmVyc2lvbigpIHsKICAgICAgICAgcmV0dXJuIHRhcmdldAogICAgIH0KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0Jhc2VQbHVnaW4uZ3Jvb3Z5IGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvQmFzZVBsdWdpbi5ncm9vdnkKaW5kZXggZTg1Yzc4NC4uMWU1ZmI0NSAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvQmFzZVBsdWdpbi5ncm9vdnkKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvQmFzZVBsdWdpbi5ncm9vdnkKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsCiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGUKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuYXBpLkFuZHJvaWRTb3VyY2VTZXQKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuYXBpLkJhc2VWYXJpYW50CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLkJhZFBsdWdpbkV4Y2VwdGlvbgogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC5Mb2dnZXJXcmFwcGVyCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLlByb2R1Y3RGbGF2b3JEYXRhCkBAIC0zMCw2ICszMSw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLmRlcGVuZGVuY3kuU3ltYm9sRmlsZVByb3ZpZGVySW1wbAogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC5kZXBlbmRlbmN5LlZhcmlhbnREZXBlbmRlbmNpZXMKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwuZHNsLlNpZ25pbmdDb25maWdEc2wKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwubW9kZWwuQXJ0aWZhY3RNZXRhRGF0YUltcGwKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwubW9kZWwuSmF2YUFydGlmYWN0SW1wbAogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEJ1aWxkZXIKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwudGFza3MuQW5kcm9pZFJlcG9ydFRhc2sKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwudGFza3MuRGVwZW5kZW5jeVJlcG9ydFRhc2sKQEAgLTQ3LDE1ICs1MCwxOSBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC52YXJpYW50LkFwa1ZhcmlhbnREYXRhCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLnZhcmlhbnQuQXBwbGljYXRpb25WYXJpYW50RGF0YQogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC52YXJpYW50LkJhc2VWYXJpYW50RGF0YQoraW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC52YXJpYW50LkRlZmF1bHRTb3VyY2VQcm92aWRlckNvbnRhaW5lcgogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC52YXJpYW50LkxpYnJhcnlWYXJpYW50RGF0YQogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC52YXJpYW50LlRlc3RWYXJpYW50RGF0YQogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC52YXJpYW50LlRlc3RlZFZhcmlhbnREYXRhCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLkFpZGxDb21waWxlCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLkRleAogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5HZW5lcmF0ZUJ1aWxkQ29uZmlnCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLkxpbnQKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuTWVyZ2VBc3NldHMKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuTWVyZ2VSZXNvdXJjZXMKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuTmRrQ29tcGlsZQogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5QYWNrYWdlQXBwbGljYXRpb24KK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuUHJlRGV4CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLlByb2Nlc3NBbmRyb2lkUmVzb3VyY2VzCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLlByb2Nlc3NBcHBNYW5pZmVzdAogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5Qcm9jZXNzVGVzdE1hbmlmZXN0CkBAIC02NywxNyArNzQsMjUgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLlZhcmlhbnRDb25maWd1cmF0aW9uCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5kZXBlbmRlbmN5LkphckRlcGVuZGVuY3kKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLmRlcGVuZGVuY3kuTGlicmFyeURlcGVuZGVuY3kKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkFuZHJvaWRBcnRpZmFjdAoraW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQW5kcm9pZFByb2plY3QKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkFydGlmYWN0TWV0YURhdGEKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkJ1aWxkVHlwZQoraW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuSmF2YUFydGlmYWN0CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Qcm9kdWN0Rmxhdm9yCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5TaWduaW5nQ29uZmlnCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Tb3VyY2VQcm92aWRlcgoraW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuU291cmNlUHJvdmlkZXJDb250YWluZXIKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLnRlc3RpbmcuQ29ubmVjdGVkRGV2aWNlUHJvdmlkZXIKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLnRlc3RpbmcuYXBpLkRldmljZVByb3ZpZGVyCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci50ZXN0aW5nLmFwaS5UZXN0U2VydmVyCiBpbXBvcnQgY29tLmFuZHJvaWQudXRpbHMuSUxvZ2dlcgogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQXJyYXlMaXN0TXVsdGltYXAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RNdWx0aW1hcAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHMKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHMKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzCiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkuRGVmYXVsdFRhc2sKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS5HcmFkbGVFeGNlcHRpb24KIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS5Qcm9qZWN0CkBAIC04NywxMSArMTAyLDE0IEBACiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkuYXJ0aWZhY3RzLlByb2plY3REZXBlbmRlbmN5CiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkuYXJ0aWZhY3RzLlJlc29sdmVkQXJ0aWZhY3QKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS5hcnRpZmFjdHMuU2VsZlJlc29sdmluZ0RlcGVuZGVuY3kKK2ltcG9ydCBvcmcuZ3JhZGxlLmFwaS5hcnRpZmFjdHMucmVzdWx0LkRlcGVuZGVuY3lSZXN1bHQKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS5hcnRpZmFjdHMucmVzdWx0LlJlc29sdmVkRGVwZW5kZW5jeVJlc3VsdAogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLmFydGlmYWN0cy5yZXN1bHQuUmVzb2x2ZWRNb2R1bGVWZXJzaW9uUmVzdWx0CitpbXBvcnQgb3JnLmdyYWRsZS5hcGkuYXJ0aWZhY3RzLnJlc3VsdC5VbnJlc29sdmVkRGVwZW5kZW5jeVJlc3VsdAogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLmxvZ2dpbmcuTG9nTGV2ZWwKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS5wbHVnaW5zLkphdmFCYXNlUGx1Z2luCiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkucGx1Z2lucy5KYXZhUGx1Z2luCitpbXBvcnQgb3JnLmdyYWRsZS5hcGkuc3BlY3MuU3BlY3MKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5Db3B5CiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuY29tcGlsZS5KYXZhQ29tcGlsZQogaW1wb3J0IG9yZy5ncmFkbGUuaW50ZXJuYWwucmVmbGVjdC5JbnN0YW50aWF0b3IKQEAgLTExMywxMyArMTMxLDE2IEBACiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmJ1aWxkZXIuQnVpbGRlckNvbnN0YW50cy5GRF9JTlNUUlVNRU5UX1RFU1RTCiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmJ1aWxkZXIuQnVpbGRlckNvbnN0YW50cy5GRF9SRVBPUlRTCiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmJ1aWxkZXIuQnVpbGRlckNvbnN0YW50cy5JTlNUUlVNRU5UX1RFU1QKK2ltcG9ydCBzdGF0aWMgamF2YS5pby5GaWxlLnNlcGFyYXRvcgogCiAvKioKICAqIEJhc2UgY2xhc3MgZm9yIGFsbCBBbmRyb2lkIHBsdWdpbnMKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VQbHVnaW4gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQURMRV9NSU5fVkVSU0lPTiA9ICIxLjYiCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBHUkFETEVfU1VQUE9SVEVEX1ZFUlNJT05TID0gWyBHUkFETEVfTUlOX1ZFUlNJT04sICIxLjciIF0KKyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBESVJfQlVORExFUyA9ICJidW5kbGVzIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQURMRV9NSU5fVkVSU0lPTiA9ICIxLjkiCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBHUkFETEVfU1VQUE9SVEVEX1ZFUlNJT05TID0gWyBHUkFETEVfTUlOX1ZFUlNJT04gXQogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFMTF9HUk9VUCA9ICJJbnN0YWxsIgogCkBAIC0xNDIsMTMgKzE2MywxOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBoYXNDcmVhdGVkVGFza3MgPSBmYWxzZQogCiAgICAgcHJpdmF0ZSBQcm9kdWN0Rmxhdm9yRGF0YTxEZWZhdWx0UHJvZHVjdEZsYXZvcj4gZGVmYXVsdENvbmZpZ0RhdGEKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB1bnJlc29sdmVkRGVwZW5kZW5jaWVzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisKICAgICBwcm90ZWN0ZWQgRGVmYXVsdEFuZHJvaWRTb3VyY2VTZXQgbWFpblNvdXJjZVNldAogICAgIHByb3RlY3RlZCBEZWZhdWx0QW5kcm9pZFNvdXJjZVNldCB0ZXN0U291cmNlU2V0CiAKKyAgICBwcm90ZWN0ZWQgVGFzayBtYWluUHJlQnVpbGQKICAgICBwcm90ZWN0ZWQgVGFzayB1bmluc3RhbGxBbGwKICAgICBwcm90ZWN0ZWQgVGFzayBhc3NlbWJsZVRlc3QKICAgICBwcm90ZWN0ZWQgVGFzayBkZXZpY2VDaGVjawogICAgIHByb3RlY3RlZCBUYXNrIGNvbm5lY3RlZENoZWNrCisgICAgcHJvdGVjdGVkIFRhc2sgbGludAorICAgIHByb3RlY3RlZCBUYXNrIGxpbnRDb21waWxlCiAKICAgICBwcm90ZWN0ZWQgQmFzZVBsdWdpbihJbnN0YW50aWF0b3IgaW5zdGFudGlhdG9yLCBUb29saW5nTW9kZWxCdWlsZGVyUmVnaXN0cnkgcmVnaXN0cnkpIHsKICAgICAgICAgdGhpcy5pbnN0YW50aWF0b3IgPSBpbnN0YW50aWF0b3IKQEAgLTE5MCw2ICsyMTYsMjEgQEAKICAgICAgICAgY29ubmVjdGVkQ2hlY2suZGVzY3JpcHRpb24gPSAiUnVucyBhbGwgZGV2aWNlIGNoZWNrcyBvbiBjdXJyZW50bHkgY29ubmVjdGVkIGRldmljZXMuIgogICAgICAgICBjb25uZWN0ZWRDaGVjay5ncm91cCA9IEphdmFCYXNlUGx1Z2luLlZFUklGSUNBVElPTl9HUk9VUAogCisgICAgICAgIG1haW5QcmVCdWlsZCA9IHByb2plY3QudGFza3MuY3JlYXRlKCJwcmVCdWlsZCIpCisKKyAgICAgICAgbGludCA9IHByb2plY3QudGFza3MuY3JlYXRlKCJsaW50IiwgTGludCkKKyAgICAgICAgbGludC5kZXNjcmlwdGlvbiA9ICJSdW5zIGxpbnQgb24gYWxsIHZhcmlhbnRzLiIKKyAgICAgICAgbGludC5ncm91cCA9IEphdmFCYXNlUGx1Z2luLlZFUklGSUNBVElPTl9HUk9VUAorICAgICAgICBsaW50LnNldFBsdWdpbih0aGlzKQorICAgICAgICBpbnQgY291bnQgPSB2YXJpYW50RGF0YUxpc3Quc2l6ZSgpCisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBCYXNlVmFyaWFudERhdGEgYmFzZVZhcmlhbnREYXRhID0gdmFyaWFudERhdGFMaXN0LmdldChpKQorICAgICAgICAgICAgaWYgKGlzTGludFZhcmlhbnQoYmFzZVZhcmlhbnREYXRhKSkgeworICAgICAgICAgICAgICAgIGxpbnQuZGVwZW5kc09uIGJhc2VWYXJpYW50RGF0YS5qYXZhQ29tcGlsZVRhc2sKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcm9qZWN0LnRhc2tzLmNoZWNrLmRlcGVuZHNPbiBsaW50CisKICAgICAgICAgcHJvamVjdC5hZnRlckV2YWx1YXRlIHsKICAgICAgICAgICAgIGNyZWF0ZUFuZHJvaWRUYXNrcyhmYWxzZSkKICAgICAgICAgfQpAQCAtMjE1LDEwICsyNTYsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghZm91bmRNYXRjaCkgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoImdyYWRsZSIgKyBzZXBhcmF0b3IgKyAid3JhcHBlciIgKyBzZXBhcmF0b3IgKworICAgICAgICAgICAgICAgICAgICAiZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyIpOwogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHcmFkbGUgdmVyc2lvbiAlcyBpcyByZXF1aXJlZC4gQ3VycmVudCB2ZXJzaW9uIGlzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFETEVfTUlOX1ZFUlNJT04sIHByb2plY3QuZ2V0R3JhZGxlKCkuZ3JhZGxlVmVyc2lvbiksIG51bGwpOworICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJHcmFkbGUgdmVyc2lvbiAlcyBpcyByZXF1aXJlZC4gQ3VycmVudCB2ZXJzaW9uIGlzICVzLiAiICsKKyAgICAgICAgICAgICAgICAgICAgIklmIHVzaW5nIHRoZSBncmFkbGUgd3JhcHBlciwgdHJ5IGVkaXRpbmcgdGhlIGRpc3RyaWJ1dGlvblVybCBpbiAlcyAiICsKKyAgICAgICAgICAgICAgICAgICAgInRvIGdyYWRsZS0lcy1hbGwuemlwIiwKKyAgICAgICAgICAgICAgICAgICAgR1JBRExFX01JTl9WRVJTSU9OLCBwcm9qZWN0LmdldEdyYWRsZSgpLmdyYWRsZVZlcnNpb24sIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgIEdSQURMRV9NSU5fVkVSU0lPTiksIG51bGwpOwogCiAgICAgICAgIH0KICAgICB9CkBAIC0yNjMsNiArMzA5LDEwIEBACiAgICAgICAgIHJldHVybiBkZWZhdWx0Q29uZmlnRGF0YQogICAgIH0KIAorICAgIENvbGxlY3Rpb248U3RyaW5nPiBnZXRVbnJlc29sdmVkRGVwZW5kZW5jaWVzKCkgeworICAgICAgICByZXR1cm4gdW5yZXNvbHZlZERlcGVuZGVuY2llcworICAgIH0KKwogICAgIFNka1BhcnNlciBnZXRTZGtQYXJzZXIoKSB7CiAgICAgICAgIHJldHVybiBzZGsucGFyc2VyCiAgICAgfQpAQCAtMjcyLDcgKzMyMiwxMSBAQAogICAgIH0KIAogICAgIEZpbGUgZ2V0U2RrRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gc2RrLmRpcmVjdG9yeQorICAgICAgICByZXR1cm4gc2RrLnNka0RpcmVjdG9yeQorICAgIH0KKworICAgIEZpbGUgZ2V0TmRrRGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gc2RrLm5ka0RpcmVjdG9yeQogICAgIH0KIAogICAgIElMb2dnZXIgZ2V0TG9nZ2VyKCkgewpAQCAtMjkzLDYgKzM0Nyw5IEBACiAgICAgICAgIGlmIChhbmRyb2lkQnVpbGRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICBTZGtQYXJzZXIgcGFyc2VyID0gZ2V0TG9hZGVkU2RrUGFyc2VyKCkKICAgICAgICAgICAgIGFuZHJvaWRCdWlsZGVyID0gbmV3IEFuZHJvaWRCdWlsZGVyKHBhcnNlciwgY3JlYXRvciwgbG9nZ2VyLCB2ZXJib3NlKQorICAgICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBMaWJyYXJ5UGx1Z2luKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZEJ1aWxkZXIuc2V0QnVpbGRpbmdMaWJyYXJ5KHRydWUpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBidWlsZGVycy5wdXQodmFyaWFudERhdGEsIGFuZHJvaWRCdWlsZGVyKQogICAgICAgICB9CkBAIC0zMTIsNyArMzY5LDggQEAKIAogICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2Nlc3NNYW5pZmVzdFRhc2soQmFzZVZhcmlhbnREYXRhIHZhcmlhbnREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1hbmlmZXN0T3VyRGlyKSB7Ci0gICAgICAgIGRlZiBwcm9jZXNzTWFuaWZlc3RUYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoInByb2Nlc3Mke3ZhcmlhbnREYXRhLm5hbWV9TWFuaWZlc3QiLAorICAgICAgICBkZWYgcHJvY2Vzc01hbmlmZXN0VGFzayA9IHByb2plY3QudGFza3MuY3JlYXRlKAorICAgICAgICAgICAgICAgICJwcm9jZXNzJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZS5jYXBpdGFsaXplKCl9TWFuaWZlc3QiLAogICAgICAgICAgICAgICAgIFByb2Nlc3NBcHBNYW5pZmVzdCkKICAgICAgICAgdmFyaWFudERhdGEucHJvY2Vzc01hbmlmZXN0VGFzayA9IHByb2Nlc3NNYW5pZmVzdFRhc2sKICAgICAgICAgcHJvY2Vzc01hbmlmZXN0VGFzay5kZXBlbmRzT24gdmFyaWFudERhdGEucHJlcGFyZURlcGVuZGVuY2llc1Rhc2sKQEAgLTMzOSw3ICszOTcsNyBAQAogICAgICAgICAgICAgZ2V0TWFuaWZlc3REZXBlbmRlbmNpZXMoY29uZmlnLmRpcmVjdExpYnJhcmllcykKICAgICAgICAgfQogICAgICAgICBwcm9jZXNzTWFuaWZlc3RUYXNrLmNvbnZlbnRpb25NYXBwaW5nLnZlcnNpb25Db2RlID0gewotICAgICAgICAgICAgbWVyZ2VkRmxhdm9yLnZlcnNpb25Db2RlCisgICAgICAgICAgICBjb25maWcudmVyc2lvbkNvZGUKICAgICAgICAgfQogICAgICAgICBwcm9jZXNzTWFuaWZlc3RUYXNrLmNvbnZlbnRpb25NYXBwaW5nLm1pblNka1ZlcnNpb24gPSB7CiAgICAgICAgICAgICBtZXJnZWRGbGF2b3IubWluU2RrVmVyc2lvbgpAQCAtMzQ5LDEzICs0MDcsMTQgQEAKICAgICAgICAgfQogICAgICAgICBwcm9jZXNzTWFuaWZlc3RUYXNrLmNvbnZlbnRpb25NYXBwaW5nLm1hbmlmZXN0T3V0cHV0RmlsZSA9IHsKICAgICAgICAgICAgIHByb2plY3QuZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgIiRwcm9qZWN0LmJ1aWxkRGlyLyR7bWFuaWZlc3RPdXJEaXJ9LyR2YXJpYW50RGF0YS5kaXJOYW1lL0FuZHJvaWRNYW5pZmVzdC54bWwiKQorICAgICAgICAgICAgICAgICAgICAiJHByb2plY3QuYnVpbGREaXIvJHttYW5pZmVzdE91ckRpcn0vJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfS9BbmRyb2lkTWFuaWZlc3QueG1sIikKICAgICAgICAgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2Nlc3NUZXN0TWFuaWZlc3RUYXNrKEJhc2VWYXJpYW50RGF0YSB2YXJpYW50RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWFuaWZlc3RPdXJEaXIpIHsKLSAgICAgICAgZGVmIHByb2Nlc3NUZXN0TWFuaWZlc3RUYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoInByb2Nlc3Mke3ZhcmlhbnREYXRhLm5hbWV9VGVzdE1hbmlmZXN0IiwKKyAgICAgICAgZGVmIHByb2Nlc3NUZXN0TWFuaWZlc3RUYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoCisgICAgICAgICAgICAgICAgInByb2Nlc3Mke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLmNhcGl0YWxpemUoKX1NYW5pZmVzdCIsCiAgICAgICAgICAgICAgICAgUHJvY2Vzc1Rlc3RNYW5pZmVzdCkKICAgICAgICAgdmFyaWFudERhdGEucHJvY2Vzc01hbmlmZXN0VGFzayA9IHByb2Nlc3NUZXN0TWFuaWZlc3RUYXNrCiAgICAgICAgIHByb2Nlc3NUZXN0TWFuaWZlc3RUYXNrLmRlcGVuZHNPbiB2YXJpYW50RGF0YS5wcmVwYXJlRGVwZW5kZW5jaWVzVGFzawpAQCAtMzgwLDI3ICs0MzksNDQgQEAKICAgICAgICAgcHJvY2Vzc1Rlc3RNYW5pZmVzdFRhc2suY29udmVudGlvbk1hcHBpbmcuaW5zdHJ1bWVudGF0aW9uUnVubmVyID0gewogICAgICAgICAgICAgY29uZmlnLmluc3RydW1lbnRhdGlvblJ1bm5lcgogICAgICAgICB9CisgICAgICAgIHByb2Nlc3NUZXN0TWFuaWZlc3RUYXNrLmNvbnZlbnRpb25NYXBwaW5nLmhhbmRsZVByb2ZpbGluZyA9IHsKKyAgICAgICAgICAgIGNvbmZpZy5oYW5kbGVQcm9maWxpbmcKKyAgICAgICAgfQorICAgICAgICBwcm9jZXNzVGVzdE1hbmlmZXN0VGFzay5jb252ZW50aW9uTWFwcGluZy5mdW5jdGlvbmFsVGVzdCA9IHsKKyAgICAgICAgICAgIGNvbmZpZy5mdW5jdGlvbmFsVGVzdAorICAgICAgICB9CiAgICAgICAgIHByb2Nlc3NUZXN0TWFuaWZlc3RUYXNrLmNvbnZlbnRpb25NYXBwaW5nLmxpYnJhcmllcyA9IHsKICAgICAgICAgICAgIGdldE1hbmlmZXN0RGVwZW5kZW5jaWVzKGNvbmZpZy5kaXJlY3RMaWJyYXJpZXMpCiAgICAgICAgIH0KICAgICAgICAgcHJvY2Vzc1Rlc3RNYW5pZmVzdFRhc2suY29udmVudGlvbk1hcHBpbmcubWFuaWZlc3RPdXRwdXRGaWxlID0gewogICAgICAgICAgICAgcHJvamVjdC5maWxlKAotICAgICAgICAgICAgICAgICAgICAiJHByb2plY3QuYnVpbGREaXIvJHttYW5pZmVzdE91ckRpcn0vJHZhcmlhbnREYXRhLmRpck5hbWUvQW5kcm9pZE1hbmlmZXN0LnhtbCIpCisgICAgICAgICAgICAgICAgICAgICIkcHJvamVjdC5idWlsZERpci8ke21hbmlmZXN0T3VyRGlyfS8ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmRpck5hbWV9L0FuZHJvaWRNYW5pZmVzdC54bWwiKQogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVuZGVyc2NyaXB0VGFzayhCYXNlVmFyaWFudERhdGEgdmFyaWFudERhdGEpIHsKICAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24gY29uZmlnID0gdmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24KIAotICAgICAgICBkZWYgcmVuZGVyc2NyaXB0VGFzayA9IHByb2plY3QudGFza3MuY3JlYXRlKCJjb21waWxlJHt2YXJpYW50RGF0YS5uYW1lfVJlbmRlcnNjcmlwdCIsCisgICAgICAgIGRlZiByZW5kZXJzY3JpcHRUYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoCisgICAgICAgICAgICAgICAgImNvbXBpbGUke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLmNhcGl0YWxpemUoKX1SZW5kZXJzY3JpcHQiLAogICAgICAgICAgICAgICAgIFJlbmRlcnNjcmlwdENvbXBpbGUpCiAgICAgICAgIHZhcmlhbnREYXRhLnJlbmRlcnNjcmlwdENvbXBpbGVUYXNrID0gcmVuZGVyc2NyaXB0VGFzawogCisgICAgICAgIFByb2R1Y3RGbGF2b3IgbWVyZ2VkRmxhdm9yID0gY29uZmlnLm1lcmdlZEZsYXZvcgorICAgICAgICBib29sZWFuIG5ka01vZGUgPSBtZXJnZWRGbGF2b3IucmVuZGVyc2NyaXB0TmRrTW9kZQorCisgICAgICAgIC8vIG9ubHkgcHV0IHRoaXMgZGVwZW5kZW5jeSBpZiBycyB3aWxsIGdlbmVyYXRlIEphdmEgY29kZQorICAgICAgICBpZiAoIW5ka01vZGUpIHsKKyAgICAgICAgICAgIHZhcmlhbnREYXRhLnNvdXJjZUdlblRhc2suZGVwZW5kc09uIHJlbmRlcnNjcmlwdFRhc2sKKyAgICAgICAgfQorCiAgICAgICAgIHJlbmRlcnNjcmlwdFRhc2suZGVwZW5kc09uIHZhcmlhbnREYXRhLnByZXBhcmVEZXBlbmRlbmNpZXNUYXNrCiAgICAgICAgIHJlbmRlcnNjcmlwdFRhc2sucGx1Z2luID0gdGhpcwogICAgICAgICByZW5kZXJzY3JpcHRUYXNrLnZhcmlhbnQgPSB2YXJpYW50RGF0YQogCi0gICAgICAgIHJlbmRlcnNjcmlwdFRhc2sudGFyZ2V0QXBpID0gY29uZmlnLm1lcmdlZEZsYXZvci5yZW5kZXJzY3JpcHRUYXJnZXRBcGkKKyAgICAgICAgcmVuZGVyc2NyaXB0VGFzay50YXJnZXRBcGkgPSBtZXJnZWRGbGF2b3IucmVuZGVyc2NyaXB0VGFyZ2V0QXBpCisgICAgICAgIHJlbmRlcnNjcmlwdFRhc2suc3VwcG9ydE1vZGUgPSBtZXJnZWRGbGF2b3IucmVuZGVyc2NyaXB0U3VwcG9ydE1vZGUKKyAgICAgICAgcmVuZGVyc2NyaXB0VGFzay5uZGtNb2RlID0gbmRrTW9kZQogICAgICAgICByZW5kZXJzY3JpcHRUYXNrLmRlYnVnQnVpbGQgPSBjb25maWcuYnVpbGRUeXBlLnJlbmRlcnNjcmlwdERlYnVnQnVpbGQKICAgICAgICAgcmVuZGVyc2NyaXB0VGFzay5vcHRpbUxldmVsID0gY29uZmlnLmJ1aWxkVHlwZS5yZW5kZXJzY3JpcHRPcHRpbUxldmVsCiAKQEAgLTQwOCwxMSArNDg0LDE4IEBACiAgICAgICAgIHJlbmRlcnNjcmlwdFRhc2suY29udmVudGlvbk1hcHBpbmcuaW1wb3J0RGlycyA9IHsgY29uZmlnLnJlbmRlcnNjcmlwdEltcG9ydHMgfQogCiAgICAgICAgIHJlbmRlcnNjcmlwdFRhc2suY29udmVudGlvbk1hcHBpbmcuc291cmNlT3V0cHV0RGlyID0gewotICAgICAgICAgICAgcHJvamVjdC5maWxlKCIkcHJvamVjdC5idWlsZERpci9zb3VyY2UvcnMvJHZhcmlhbnREYXRhLmRpck5hbWUiKQorICAgICAgICAgICAgcHJvamVjdC5maWxlKCIkcHJvamVjdC5idWlsZERpci9zb3VyY2UvcnMvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfSIpCiAgICAgICAgIH0KICAgICAgICAgcmVuZGVyc2NyaXB0VGFzay5jb252ZW50aW9uTWFwcGluZy5yZXNPdXRwdXREaXIgPSB7Ci0gICAgICAgICAgICBwcm9qZWN0LmZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyL3Jlcy9ycy8kdmFyaWFudERhdGEuZGlyTmFtZSIpCisgICAgICAgICAgICBwcm9qZWN0LmZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyL3Jlcy9ycy8ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmRpck5hbWV9IikKICAgICAgICAgfQorICAgICAgICByZW5kZXJzY3JpcHRUYXNrLmNvbnZlbnRpb25NYXBwaW5nLm9iak91dHB1dERpciA9IHsKKyAgICAgICAgICAgIHByb2plY3QuZmlsZSgiJHByb2plY3QuYnVpbGREaXIvcnMvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfS9vYmoiKQorICAgICAgICB9CisgICAgICAgIHJlbmRlcnNjcmlwdFRhc2suY29udmVudGlvbk1hcHBpbmcubGliT3V0cHV0RGlyID0geworICAgICAgICAgICAgcHJvamVjdC5maWxlKCIkcHJvamVjdC5idWlsZERpci9ycy8ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmRpck5hbWV9L2xpYiIpCisgICAgICAgIH0KKyAgICAgICAgcmVuZGVyc2NyaXB0VGFzay5jb252ZW50aW9uTWFwcGluZy5uZGtDb25maWcgPSB7IGNvbmZpZy5uZGtDb25maWcgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1lcmdlUmVzb3VyY2VzVGFzayhATm9uTnVsbCBCYXNlVmFyaWFudERhdGEgdmFyaWFudERhdGEsCkBAIC00MjAsNyArNTAzLDcgQEAKICAgICAgICAgTWVyZ2VSZXNvdXJjZXMgbWVyZ2VSZXNvdXJjZXNUYXNrID0gYmFzaWNDcmVhdGVNZXJnZVJlc291cmNlc1Rhc2soCiAgICAgICAgICAgICAgICAgdmFyaWFudERhdGEsCiAgICAgICAgICAgICAgICAgIm1lcmdlIiwKLSAgICAgICAgICAgICAgICAiJHByb2plY3QuYnVpbGREaXIvcmVzL2FsbC8kdmFyaWFudERhdGEuZGlyTmFtZSIsCisgICAgICAgICAgICAgICAgIiRwcm9qZWN0LmJ1aWxkRGlyL3Jlcy9hbGwvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfSIsCiAgICAgICAgICAgICAgICAgdHJ1ZSAvKmluY2x1ZGVEZXBlbmRlbmNpZXMqLywKICAgICAgICAgICAgICAgICBwcm9jZXNzOVBhdGNoKQogICAgICAgICB2YXJpYW50RGF0YS5tZXJnZVJlc291cmNlc1Rhc2sgPSBtZXJnZVJlc291cmNlc1Rhc2sKQEAgLTQzMywxMyArNTE2LDE0IEBACiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGluY2x1ZGVEZXBlbmRlbmNpZXMsCiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHByb2Nlc3M5UGF0Y2gpIHsKICAgICAgICAgTWVyZ2VSZXNvdXJjZXMgbWVyZ2VSZXNvdXJjZXNUYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoCi0gICAgICAgICAgICAgICAgIiR0YXNrTmFtZVByZWZpeCR7dmFyaWFudERhdGEubmFtZX1SZXNvdXJjZXMiLCBNZXJnZVJlc291cmNlcykKKyAgICAgICAgICAgICAgICAiJHRhc2tOYW1lUHJlZml4JHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZS5jYXBpdGFsaXplKCl9UmVzb3VyY2VzIiwKKyAgICAgICAgICAgICAgICBNZXJnZVJlc291cmNlcykKIAogICAgICAgICBtZXJnZVJlc291cmNlc1Rhc2suZGVwZW5kc09uIHZhcmlhbnREYXRhLnByZXBhcmVEZXBlbmRlbmNpZXNUYXNrLCB2YXJpYW50RGF0YS5yZW5kZXJzY3JpcHRDb21waWxlVGFzawogICAgICAgICBtZXJnZVJlc291cmNlc1Rhc2sucGx1Z2luID0gdGhpcwogICAgICAgICBtZXJnZVJlc291cmNlc1Rhc2sudmFyaWFudCA9IHZhcmlhbnREYXRhCiAgICAgICAgIG1lcmdlUmVzb3VyY2VzVGFzay5pbmNyZW1lbnRhbEZvbGRlciA9IHByb2plY3QuZmlsZSgKLSAgICAgICAgICAgICAgICAiJHByb2plY3QuYnVpbGREaXIvaW5jcmVtZW50YWwvJHt0YXNrTmFtZVByZWZpeH1SZXNvdXJjZXMvJHZhcmlhbnREYXRhLmRpck5hbWUiKQorICAgICAgICAgICAgICAgICIkcHJvamVjdC5idWlsZERpci9pbmNyZW1lbnRhbC8ke3Rhc2tOYW1lUHJlZml4fVJlc291cmNlcy8ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmRpck5hbWV9IikKIAogICAgICAgICBtZXJnZVJlc291cmNlc1Rhc2sucHJvY2VzczlQYXRjaCA9IHByb2Nlc3M5UGF0Y2gKIApAQCAtNDU4LDE3ICs1NDIsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBvdXRwdXRMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbmNsdWRlRGVwZW5kZW5jaWVzKSB7CiAgICAgICAgIGlmIChvdXRwdXRMb2NhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvdXRwdXRMb2NhdGlvbiA9ICIkcHJvamVjdC5idWlsZERpci9hc3NldHMvJHZhcmlhbnREYXRhLmRpck5hbWUiCisgICAgICAgICAgICBvdXRwdXRMb2NhdGlvbiA9ICIkcHJvamVjdC5idWlsZERpci9hc3NldHMvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfSIKICAgICAgICAgfQogCi0gICAgICAgIGRlZiBtZXJnZUFzc2V0c1Rhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgibWVyZ2Uke3ZhcmlhbnREYXRhLm5hbWV9QXNzZXRzIiwgTWVyZ2VBc3NldHMpCisgICAgICAgIGRlZiBtZXJnZUFzc2V0c1Rhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAibWVyZ2Uke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLmNhcGl0YWxpemUoKX1Bc3NldHMiLAorICAgICAgICAgICAgICAgIE1lcmdlQXNzZXRzKQogICAgICAgICB2YXJpYW50RGF0YS5tZXJnZUFzc2V0c1Rhc2sgPSBtZXJnZUFzc2V0c1Rhc2sKIAogICAgICAgICBtZXJnZUFzc2V0c1Rhc2suZGVwZW5kc09uIHZhcmlhbnREYXRhLnByZXBhcmVEZXBlbmRlbmNpZXNUYXNrCiAgICAgICAgIG1lcmdlQXNzZXRzVGFzay5wbHVnaW4gPSB0aGlzCiAgICAgICAgIG1lcmdlQXNzZXRzVGFzay52YXJpYW50ID0gdmFyaWFudERhdGEKICAgICAgICAgbWVyZ2VBc3NldHNUYXNrLmluY3JlbWVudGFsRm9sZGVyID0KLSAgICAgICAgICAgIHByb2plY3QuZmlsZSgiJHByb2plY3QuYnVpbGREaXIvaW5jcmVtZW50YWwvbWVyZ2VBc3NldHMvJHZhcmlhbnREYXRhLmRpck5hbWUiKQorICAgICAgICAgICAgICAgIHByb2plY3QuZmlsZSgiJHByb2plY3QuYnVpbGREaXIvaW5jcmVtZW50YWwvbWVyZ2VBc3NldHMvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfSIpCiAKICAgICAgICAgbWVyZ2VBc3NldHNUYXNrLmNvbnZlbnRpb25NYXBwaW5nLmlucHV0QXNzZXRTZXRzID0gewogICAgICAgICAgICAgdmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZ2V0QXNzZXRTZXRzKGluY2x1ZGVEZXBlbmRlbmNpZXMpCkBAIC00NzgsMTEgKzU2NCwxMyBAQAogCiAgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnVpbGRDb25maWdUYXNrKEJhc2VWYXJpYW50RGF0YSB2YXJpYW50RGF0YSkgewogICAgICAgICBkZWYgZ2VuZXJhdGVCdWlsZENvbmZpZ1Rhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAiZ2VuZXJhdGUke3ZhcmlhbnREYXRhLm5hbWV9QnVpbGRDb25maWciLCBHZW5lcmF0ZUJ1aWxkQ29uZmlnKQorICAgICAgICAgICAgICAgICJnZW5lcmF0ZSR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZnVsbE5hbWUuY2FwaXRhbGl6ZSgpfUJ1aWxkQ29uZmlnIiwKKyAgICAgICAgICAgICAgICBHZW5lcmF0ZUJ1aWxkQ29uZmlnKQogICAgICAgICB2YXJpYW50RGF0YS5nZW5lcmF0ZUJ1aWxkQ29uZmlnVGFzayA9IGdlbmVyYXRlQnVpbGRDb25maWdUYXNrCiAKICAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24gdmFyaWFudENvbmZpZ3VyYXRpb24gPSB2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbgogCisgICAgICAgIHZhcmlhbnREYXRhLnNvdXJjZUdlblRhc2suZGVwZW5kc09uIGdlbmVyYXRlQnVpbGRDb25maWdUYXNrCiAgICAgICAgIGlmICh2YXJpYW50Q29uZmlndXJhdGlvbi50eXBlID09IFZhcmlhbnRDb25maWd1cmF0aW9uLlR5cGUuVEVTVCkgewogICAgICAgICAgICAgLy8gaW4gY2FzZSBvZiBhIHRlc3QgcHJvamVjdCwgdGhlIG1hbmlmZXN0IGlzIGdlbmVyYXRlZCBzbyB3ZSBuZWVkIHRvIGRlcGVuZAogICAgICAgICAgICAgLy8gb24gaXRzIGNyZWF0aW9uLgpAQCAtNDkyLDMxICs1ODAsNTggQEAKICAgICAgICAgZ2VuZXJhdGVCdWlsZENvbmZpZ1Rhc2sucGx1Z2luID0gdGhpcwogICAgICAgICBnZW5lcmF0ZUJ1aWxkQ29uZmlnVGFzay52YXJpYW50ID0gdmFyaWFudERhdGEKIAotICAgICAgICBnZW5lcmF0ZUJ1aWxkQ29uZmlnVGFzay5jb252ZW50aW9uTWFwcGluZy5wYWNrYWdlTmFtZSA9IHsKKyAgICAgICAgZ2VuZXJhdGVCdWlsZENvbmZpZ1Rhc2suY29udmVudGlvbk1hcHBpbmcuYnVpbGRDb25maWdQYWNrYWdlTmFtZSA9IHsKICAgICAgICAgICAgIHZhcmlhbnRDb25maWd1cmF0aW9uLm9yaWdpbmFsUGFja2FnZU5hbWUKICAgICAgICAgfQogCisgICAgICAgIGdlbmVyYXRlQnVpbGRDb25maWdUYXNrLmNvbnZlbnRpb25NYXBwaW5nLmFwcFBhY2thZ2VOYW1lID0geworICAgICAgICAgICAgdmFyaWFudENvbmZpZ3VyYXRpb24ucGFja2FnZU5hbWUKKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRlQnVpbGRDb25maWdUYXNrLmNvbnZlbnRpb25NYXBwaW5nLnZlcnNpb25OYW1lID0geworICAgICAgICAgICAgdmFyaWFudENvbmZpZ3VyYXRpb24udmVyc2lvbk5hbWUKKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRlQnVpbGRDb25maWdUYXNrLmNvbnZlbnRpb25NYXBwaW5nLnZlcnNpb25Db2RlID0geworICAgICAgICAgICAgdmFyaWFudENvbmZpZ3VyYXRpb24udmVyc2lvbkNvZGUKKyAgICAgICAgfQorCiAgICAgICAgIGdlbmVyYXRlQnVpbGRDb25maWdUYXNrLmNvbnZlbnRpb25NYXBwaW5nLmRlYnVnZ2FibGUgPSB7CiAgICAgICAgICAgICB2YXJpYW50Q29uZmlndXJhdGlvbi5idWlsZFR5cGUuaXNEZWJ1Z2dhYmxlKCkKICAgICAgICAgfQogCi0gICAgICAgIGdlbmVyYXRlQnVpbGRDb25maWdUYXNrLmNvbnZlbnRpb25NYXBwaW5nLmphdmFMaW5lcyA9IHsKLSAgICAgICAgICAgIHZhcmlhbnRDb25maWd1cmF0aW9uLmJ1aWxkQ29uZmlnTGluZXMKKyAgICAgICAgZ2VuZXJhdGVCdWlsZENvbmZpZ1Rhc2suY29udmVudGlvbk1hcHBpbmcuYnVpbGRUeXBlTmFtZSA9IHsKKyAgICAgICAgICAgIHZhcmlhbnRDb25maWd1cmF0aW9uLmJ1aWxkVHlwZS5uYW1lCisgICAgICAgIH0KKworICAgICAgICBnZW5lcmF0ZUJ1aWxkQ29uZmlnVGFzay5jb252ZW50aW9uTWFwcGluZy5mbGF2b3JOYW1lID0geworICAgICAgICAgICAgdmFyaWFudENvbmZpZ3VyYXRpb24uZmxhdm9yTmFtZQorICAgICAgICB9CisKKyAgICAgICAgZ2VuZXJhdGVCdWlsZENvbmZpZ1Rhc2suY29udmVudGlvbk1hcHBpbmcuZmxhdm9yTmFtZXNXaXRoRGltZW5zaW9uTmFtZXMgPSB7CisgICAgICAgICAgICB2YXJpYW50Q29uZmlndXJhdGlvbi5mbGF2b3JOYW1lc1dpdGhEaW1lbnNpb25OYW1lcworICAgICAgICB9CisKKyAgICAgICAgZ2VuZXJhdGVCdWlsZENvbmZpZ1Rhc2suY29udmVudGlvbk1hcHBpbmcuaXRlbXMgPSB7CisgICAgICAgICAgICB2YXJpYW50Q29uZmlndXJhdGlvbi5idWlsZENvbmZpZ0l0ZW1zCiAgICAgICAgIH0KIAogICAgICAgICBnZW5lcmF0ZUJ1aWxkQ29uZmlnVGFzay5jb252ZW50aW9uTWFwcGluZy5zb3VyY2VPdXRwdXREaXIgPSB7Ci0gICAgICAgICAgICBwcm9qZWN0LmZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyL3NvdXJjZS9idWlsZENvbmZpZy8ke3ZhcmlhbnREYXRhLmRpck5hbWV9IikKKyAgICAgICAgICAgIHByb2plY3QuZmlsZSgiJHByb2plY3QuYnVpbGREaXIvc291cmNlL2J1aWxkQ29uZmlnLyR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZGlyTmFtZX0iKQogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvY2Vzc1Jlc1Rhc2soQmFzZVZhcmlhbnREYXRhIHZhcmlhbnREYXRhKSB7Ci0gICAgICAgIGNyZWF0ZVByb2Nlc3NSZXNUYXNrKHZhcmlhbnREYXRhLCAiJHByb2plY3QuYnVpbGREaXIvc3ltYm9scy8kdmFyaWFudERhdGEuZGlyTmFtZSIpCisgICAgICAgIGNyZWF0ZVByb2Nlc3NSZXNUYXNrKHZhcmlhbnREYXRhLCAiJHByb2plY3QuYnVpbGREaXIvc3ltYm9scy8ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmRpck5hbWV9IikKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9jZXNzUmVzVGFzayhCYXNlVmFyaWFudERhdGEgdmFyaWFudERhdGEsIGZpbmFsIFN0cmluZyBzeW1ib2xMb2NhdGlvbikgewotICAgICAgICBkZWYgcHJvY2Vzc1Jlc291cmNlcyA9IHByb2plY3QudGFza3MuY3JlYXRlKCJwcm9jZXNzJHt2YXJpYW50RGF0YS5uYW1lfVJlc291cmNlcyIsCisgICAgICAgIGRlZiBwcm9jZXNzUmVzb3VyY2VzID0gcHJvamVjdC50YXNrcy5jcmVhdGUoCisgICAgICAgICAgICAgICAgInByb2Nlc3Mke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLmNhcGl0YWxpemUoKX1SZXNvdXJjZXMiLAogICAgICAgICAgICAgICAgIFByb2Nlc3NBbmRyb2lkUmVzb3VyY2VzKQogICAgICAgICB2YXJpYW50RGF0YS5wcm9jZXNzUmVzb3VyY2VzVGFzayA9IHByb2Nlc3NSZXNvdXJjZXMKKworICAgICAgICB2YXJpYW50RGF0YS5zb3VyY2VHZW5UYXNrLmRlcGVuZHNPbiBwcm9jZXNzUmVzb3VyY2VzCiAgICAgICAgIHByb2Nlc3NSZXNvdXJjZXMuZGVwZW5kc09uIHZhcmlhbnREYXRhLnByb2Nlc3NNYW5pZmVzdFRhc2ssIHZhcmlhbnREYXRhLm1lcmdlUmVzb3VyY2VzVGFzaywgdmFyaWFudERhdGEubWVyZ2VBc3NldHNUYXNrCiAKICAgICAgICAgcHJvY2Vzc1Jlc291cmNlcy5wbHVnaW4gPSB0aGlzCkBAIC01NDUsMzIgKzY2MCwzNCBAQAogCiAgICAgICAgIC8vIFRPRE86IHVuaWZ5IHdpdGggZ2VuZXJhdGVCdWlsZGVyQ29uZmlnLCBjb21waWxlQWlkbCwgYW5kIGxpYnJhcnkgcGFja2FnaW5nIHNvbWVob3c/CiAgICAgICAgIHByb2Nlc3NSZXNvdXJjZXMuY29udmVudGlvbk1hcHBpbmcuc291cmNlT3V0cHV0RGlyID0gewotICAgICAgICAgICAgcHJvamVjdC5maWxlKCIkcHJvamVjdC5idWlsZERpci9zb3VyY2Uvci8kdmFyaWFudERhdGEuZGlyTmFtZSIpCisgICAgICAgICAgICBwcm9qZWN0LmZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyL3NvdXJjZS9yLyR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZGlyTmFtZX0iKQogICAgICAgICB9CiAgICAgICAgIHByb2Nlc3NSZXNvdXJjZXMuY29udmVudGlvbk1hcHBpbmcudGV4dFN5bWJvbE91dHB1dERpciA9IHsKICAgICAgICAgICAgIHByb2plY3QuZmlsZShzeW1ib2xMb2NhdGlvbikKICAgICAgICAgfQogICAgICAgICBwcm9jZXNzUmVzb3VyY2VzLmNvbnZlbnRpb25NYXBwaW5nLnBhY2thZ2VPdXRwdXRGaWxlID0gewogICAgICAgICAgICAgcHJvamVjdC5maWxlKAotICAgICAgICAgICAgICAgICAgICAiJHByb2plY3QuYnVpbGREaXIvbGlicy8ke3Byb2plY3QuYXJjaGl2ZXNCYXNlTmFtZX0tJHt2YXJpYW50RGF0YS5iYXNlTmFtZX0uYXBfIikKKyAgICAgICAgICAgICAgICAgICAgIiRwcm9qZWN0LmJ1aWxkRGlyL2xpYnMvJHtwcm9qZWN0LmFyY2hpdmVzQmFzZU5hbWV9LSR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uYmFzZU5hbWV9LmFwXyIpCiAgICAgICAgIH0KLSAgICAgICAgaWYgKHZhcmlhbnREYXRhLnJ1blByb2d1YXJkKSB7CisgICAgICAgIGlmICh2YXJpYW50Q29uZmlndXJhdGlvbi5idWlsZFR5cGUucnVuUHJvZ3VhcmQpIHsKICAgICAgICAgICAgIHByb2Nlc3NSZXNvdXJjZXMuY29udmVudGlvbk1hcHBpbmcucHJvZ3VhcmRPdXRwdXRGaWxlID0gewotICAgICAgICAgICAgICAgIHByb2plY3QuZmlsZSgiJHByb2plY3QuYnVpbGREaXIvcHJvZ3VhcmQvJHt2YXJpYW50RGF0YS5kaXJOYW1lfS9hYXB0X3J1bGVzLnR4dCIpCisgICAgICAgICAgICAgICAgcHJvamVjdC5maWxlKCIkcHJvamVjdC5idWlsZERpci9wcm9ndWFyZC8ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmRpck5hbWV9L2FhcHRfcnVsZXMudHh0IikKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHByb2Nlc3NSZXNvdXJjZXMuY29udmVudGlvbk1hcHBpbmcudHlwZSA9IHsgdmFyaWFudENvbmZpZ3VyYXRpb24udHlwZSB9CiAgICAgICAgIHByb2Nlc3NSZXNvdXJjZXMuY29udmVudGlvbk1hcHBpbmcuZGVidWdnYWJsZSA9IHsgdmFyaWFudENvbmZpZ3VyYXRpb24uYnVpbGRUeXBlLmRlYnVnZ2FibGUgfQogICAgICAgICBwcm9jZXNzUmVzb3VyY2VzLmNvbnZlbnRpb25NYXBwaW5nLmFhcHRPcHRpb25zID0geyBleHRlbnNpb24uYWFwdE9wdGlvbnMgfQorICAgICAgICBwcm9jZXNzUmVzb3VyY2VzLmNvbnZlbnRpb25NYXBwaW5nLnJlc291cmNlQ29uZmlncyA9IHsgdmFyaWFudENvbmZpZ3VyYXRpb24ubWVyZ2VkRmxhdm9yLnJlc291cmNlQ29uZmlndXJhdGlvbnMgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2Nlc3NKYXZhUmVzVGFzayhCYXNlVmFyaWFudERhdGEgdmFyaWFudERhdGEpIHsKICAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24gdmFyaWFudENvbmZpZ3VyYXRpb24gPSB2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbgogCi0gICAgICAgIENvcHkgcHJvY2Vzc1Jlc291cmNlcyA9IHByb2plY3QudGFza3MuY3JlYXRlKCJwcm9jZXNzJHt2YXJpYW50RGF0YS5uYW1lfUphdmFSZXMiLAorICAgICAgICBDb3B5IHByb2Nlc3NSZXNvdXJjZXMgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAicHJvY2VzcyR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZnVsbE5hbWUuY2FwaXRhbGl6ZSgpfUphdmFSZXMiLAogICAgICAgICAgICAgICAgIFByb2Nlc3NSZXNvdXJjZXMpOwotICAgICAgICB2YXJpYW50RGF0YS5wcm9jZXNzSmF2YVJlc291cmNlcyA9IHByb2Nlc3NSZXNvdXJjZXMKKyAgICAgICAgdmFyaWFudERhdGEucHJvY2Vzc0phdmFSZXNvdXJjZXNUYXNrID0gcHJvY2Vzc1Jlc291cmNlcwogCiAgICAgICAgIC8vIHNldCB0aGUgaW5wdXQKICAgICAgICAgcHJvY2Vzc1Jlc291cmNlcy5mcm9tKCgoQW5kcm9pZFNvdXJjZVNldCkgdmFyaWFudENvbmZpZ3VyYXRpb24uZGVmYXVsdFNvdXJjZVNldCkucmVzb3VyY2VzKQpAQCAtNTgwLDU4ICs2OTcsNjUgQEAKICAgICAgICAgICAgICAgICAgICAgKChBbmRyb2lkU291cmNlU2V0KSB2YXJpYW50Q29uZmlndXJhdGlvbi5idWlsZFR5cGVTb3VyY2VTZXQpLnJlc291cmNlcykKICAgICAgICAgfQogICAgICAgICBpZiAodmFyaWFudENvbmZpZ3VyYXRpb24uaGFzRmxhdm9ycygpKSB7Ci0gICAgICAgICAgICBmb3IgKFNvdXJjZVByb3ZpZGVyIGZsYXZvclNvdXJjZVNldCA6IHZhcmlhbnRDb25maWd1cmF0aW9uLmZsYXZvclNvdXJjZVNldHMpIHsKKyAgICAgICAgICAgIGZvciAoU291cmNlUHJvdmlkZXIgZmxhdm9yU291cmNlU2V0IDogdmFyaWFudENvbmZpZ3VyYXRpb24uZmxhdm9yU291cmNlUHJvdmlkZXJzKSB7CiAgICAgICAgICAgICAgICAgcHJvY2Vzc1Jlc291cmNlcy5mcm9tKCgoQW5kcm9pZFNvdXJjZVNldCkgZmxhdm9yU291cmNlU2V0KS5yZXNvdXJjZXMpCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwcm9jZXNzUmVzb3VyY2VzLmNvbnZlbnRpb25NYXBwaW5nLmRlc3RpbmF0aW9uRGlyID0gewotICAgICAgICAgICAgcHJvamVjdC5maWxlKCIkcHJvamVjdC5idWlsZERpci9qYXZhUmVzb3VyY2VzLyR2YXJpYW50RGF0YS5kaXJOYW1lIikKKyAgICAgICAgICAgIHByb2plY3QuZmlsZSgiJHByb2plY3QuYnVpbGREaXIvamF2YVJlc291cmNlcy8ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmRpck5hbWV9IikKICAgICAgICAgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFpZGxUYXNrKEJhc2VWYXJpYW50RGF0YSB2YXJpYW50RGF0YSkgewogICAgICAgICBWYXJpYW50Q29uZmlndXJhdGlvbiB2YXJpYW50Q29uZmlndXJhdGlvbiA9IHZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uCiAKLSAgICAgICAgZGVmIGNvbXBpbGVUYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoImNvbXBpbGUke3ZhcmlhbnREYXRhLm5hbWV9QWlkbCIsIEFpZGxDb21waWxlKQorICAgICAgICBkZWYgY29tcGlsZVRhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAiY29tcGlsZSR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZnVsbE5hbWUuY2FwaXRhbGl6ZSgpfUFpZGwiLAorICAgICAgICAgICAgICAgIEFpZGxDb21waWxlKQogICAgICAgICB2YXJpYW50RGF0YS5haWRsQ29tcGlsZVRhc2sgPSBjb21waWxlVGFzaworCisgICAgICAgIHZhcmlhbnREYXRhLnNvdXJjZUdlblRhc2suZGVwZW5kc09uIGNvbXBpbGVUYXNrCiAgICAgICAgIHZhcmlhbnREYXRhLmFpZGxDb21waWxlVGFzay5kZXBlbmRzT24gdmFyaWFudERhdGEucHJlcGFyZURlcGVuZGVuY2llc1Rhc2sKIAogICAgICAgICBjb21waWxlVGFzay5wbHVnaW4gPSB0aGlzCiAgICAgICAgIGNvbXBpbGVUYXNrLnZhcmlhbnQgPSB2YXJpYW50RGF0YQogICAgICAgICBjb21waWxlVGFzay5pbmNyZW1lbnRhbEZvbGRlciA9Ci0gICAgICAgICAgICBwcm9qZWN0LmZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyL2luY3JlbWVudGFsL2FpZGwvJHZhcmlhbnREYXRhLmRpck5hbWUiKQotCisgICAgICAgICAgICAgICAgcHJvamVjdC5maWxlKCIkcHJvamVjdC5idWlsZERpci9pbmNyZW1lbnRhbC9haWRsLyR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZGlyTmFtZX0iKQogCiAgICAgICAgIGNvbXBpbGVUYXNrLmNvbnZlbnRpb25NYXBwaW5nLnNvdXJjZURpcnMgPSB7IHZhcmlhbnRDb25maWd1cmF0aW9uLmFpZGxTb3VyY2VMaXN0IH0KICAgICAgICAgY29tcGlsZVRhc2suY29udmVudGlvbk1hcHBpbmcuaW1wb3J0RGlycyA9IHsgdmFyaWFudENvbmZpZ3VyYXRpb24uYWlkbEltcG9ydHMgfQogCiAgICAgICAgIGNvbXBpbGVUYXNrLmNvbnZlbnRpb25NYXBwaW5nLnNvdXJjZU91dHB1dERpciA9IHsKLSAgICAgICAgICAgIHByb2plY3QuZmlsZSgiJHByb2plY3QuYnVpbGREaXIvc291cmNlL2FpZGwvJHZhcmlhbnREYXRhLmRpck5hbWUiKQorICAgICAgICAgICAgcHJvamVjdC5maWxlKCIkcHJvamVjdC5idWlsZERpci9zb3VyY2UvYWlkbC8ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmRpck5hbWV9IikKICAgICAgICAgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbXBpbGVUYXNrKEJhc2VWYXJpYW50RGF0YSB2YXJpYW50RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlVmFyaWFudERhdGEgdGVzdGVkVmFyaWFudERhdGEpIHsKLSAgICAgICAgZGVmIGNvbXBpbGVUYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoImNvbXBpbGUke3ZhcmlhbnREYXRhLm5hbWV9IiwgSmF2YUNvbXBpbGUpCisgICAgICAgIGRlZiBjb21waWxlVGFzayA9IHByb2plY3QudGFza3MuY3JlYXRlKAorICAgICAgICAgICAgICAgICJjb21waWxlJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZS5jYXBpdGFsaXplKCl9SmF2YSIsCisgICAgICAgICAgICAgICAgSmF2YUNvbXBpbGUpCiAgICAgICAgIHZhcmlhbnREYXRhLmphdmFDb21waWxlVGFzayA9IGNvbXBpbGVUYXNrCi0gICAgICAgIGNvbXBpbGVUYXNrLmRlcGVuZHNPbiB2YXJpYW50RGF0YS5wcm9jZXNzUmVzb3VyY2VzVGFzaywgdmFyaWFudERhdGEuZ2VuZXJhdGVCdWlsZENvbmZpZ1Rhc2ssIHZhcmlhbnREYXRhLmFpZGxDb21waWxlVGFzaworICAgICAgICBjb21waWxlVGFzay5kZXBlbmRzT24gdmFyaWFudERhdGEuc291cmNlR2VuVGFzawogCiAgICAgICAgIFZhcmlhbnRDb25maWd1cmF0aW9uIGNvbmZpZyA9IHZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uCiAKLSAgICAgICAgTGlzdDxPYmplY3Q+IHNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICAgICAgTGlzdDxPYmplY3Q+IHNvdXJjZUxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKQogICAgICAgICBzb3VyY2VMaXN0LmFkZCgoKEFuZHJvaWRTb3VyY2VTZXQpIGNvbmZpZy5kZWZhdWx0U291cmNlU2V0KS5qYXZhKQogICAgICAgICBzb3VyY2VMaXN0LmFkZCh7IHZhcmlhbnREYXRhLnByb2Nlc3NSZXNvdXJjZXNUYXNrLnNvdXJjZU91dHB1dERpciB9KQogICAgICAgICBzb3VyY2VMaXN0LmFkZCh7IHZhcmlhbnREYXRhLmdlbmVyYXRlQnVpbGRDb25maWdUYXNrLnNvdXJjZU91dHB1dERpciB9KQogICAgICAgICBzb3VyY2VMaXN0LmFkZCh7IHZhcmlhbnREYXRhLmFpZGxDb21waWxlVGFzay5zb3VyY2VPdXRwdXREaXIgfSkKLSAgICAgICAgc291cmNlTGlzdC5hZGQoeyB2YXJpYW50RGF0YS5yZW5kZXJzY3JpcHRDb21waWxlVGFzay5zb3VyY2VPdXRwdXREaXIgfSkKKyAgICAgICAgaWYgKCFjb25maWcubWVyZ2VkRmxhdm9yLnJlbmRlcnNjcmlwdE5ka01vZGUpIHsKKyAgICAgICAgICAgIHNvdXJjZUxpc3QuYWRkKHsgdmFyaWFudERhdGEucmVuZGVyc2NyaXB0Q29tcGlsZVRhc2suc291cmNlT3V0cHV0RGlyIH0pCisgICAgICAgIH0KIAogICAgICAgICBpZiAoY29uZmlnLmdldFR5cGUoKSAhPSBWYXJpYW50Q29uZmlndXJhdGlvbi5UeXBlLlRFU1QpIHsKICAgICAgICAgICAgIHNvdXJjZUxpc3QuYWRkKCgoQW5kcm9pZFNvdXJjZVNldCkgY29uZmlnLmJ1aWxkVHlwZVNvdXJjZVNldCkuamF2YSkKICAgICAgICAgfQogICAgICAgICBpZiAoY29uZmlnLmhhc0ZsYXZvcnMoKSkgewotICAgICAgICAgICAgZm9yIChTb3VyY2VQcm92aWRlciBmbGF2b3JTb3VyY2VTZXQgOiBjb25maWcuZmxhdm9yU291cmNlU2V0cykgewotICAgICAgICAgICAgICAgIHNvdXJjZUxpc3QuYWRkKCgoQW5kcm9pZFNvdXJjZVNldCkgZmxhdm9yU291cmNlU2V0KS5qYXZhKQorICAgICAgICAgICAgZm9yIChTb3VyY2VQcm92aWRlciBmbGF2b3JTb3VyY2VQcm92aWRlciA6IGNvbmZpZy5mbGF2b3JTb3VyY2VQcm92aWRlcnMpIHsKKyAgICAgICAgICAgICAgICBzb3VyY2VMaXN0LmFkZCgoKEFuZHJvaWRTb3VyY2VTZXQpIGZsYXZvclNvdXJjZVByb3ZpZGVyKS5qYXZhKQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGNvbXBpbGVUYXNrLnNvdXJjZSA9IHNvdXJjZUxpc3QudG9BcnJheSgpCkBAIC02NDEsMTEgKzc2NSwxMSBAQAogICAgICAgICAvLyBkZXBlbmRlbmN5LgogICAgICAgICBpZiAodGVzdGVkVmFyaWFudERhdGEgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblZhcmlhbnREYXRhKSB7CiAgICAgICAgICAgICBjb21waWxlVGFzay5jb252ZW50aW9uTWFwcGluZy5jbGFzc3BhdGggPSAgewotICAgICAgICAgICAgICAgIHByb2plY3QuZmlsZXMoY29uZmlnLmNvbXBpbGVDbGFzc3BhdGgpICsgdGVzdGVkVmFyaWFudERhdGEuamF2YUNvbXBpbGVUYXNrLmNsYXNzcGF0aCArIHRlc3RlZFZhcmlhbnREYXRhLmphdmFDb21waWxlVGFzay5vdXRwdXRzLmZpbGVzCisgICAgICAgICAgICAgICAgcHJvamVjdC5maWxlcyhnZXRBbmRyb2lkQnVpbGRlcih2YXJpYW50RGF0YSkuZ2V0Q29tcGlsZUNsYXNzcGF0aChjb25maWcpKSArIHRlc3RlZFZhcmlhbnREYXRhLmphdmFDb21waWxlVGFzay5jbGFzc3BhdGggKyB0ZXN0ZWRWYXJpYW50RGF0YS5qYXZhQ29tcGlsZVRhc2sub3V0cHV0cy5maWxlcwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY29tcGlsZVRhc2suY29udmVudGlvbk1hcHBpbmcuY2xhc3NwYXRoID0gIHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmZpbGVzKGNvbmZpZy5jb21waWxlQ2xhc3NwYXRoKQorICAgICAgICAgICAgICAgIHByb2plY3QuZmlsZXMoZ2V0QW5kcm9pZEJ1aWxkZXIodmFyaWFudERhdGEpLmdldENvbXBpbGVDbGFzc3BhdGgoY29uZmlnKSkKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC02NTQsMTAgKzc3OCwxMCBAQAogICAgICAgICBjb21waWxlVGFzay5kZXBlbmRzT24gcHJvamVjdC5jb25maWd1cmF0aW9ucy5jb21waWxlLmJ1aWxkRGVwZW5kZW5jaWVzCiAKICAgICAgICAgY29tcGlsZVRhc2suY29udmVudGlvbk1hcHBpbmcuZGVzdGluYXRpb25EaXIgPSB7Ci0gICAgICAgICAgICBwcm9qZWN0LmZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyL2NsYXNzZXMvJHZhcmlhbnREYXRhLmRpck5hbWUiKQorICAgICAgICAgICAgcHJvamVjdC5maWxlKCIkcHJvamVjdC5idWlsZERpci9jbGFzc2VzLyR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZGlyTmFtZX0iKQogICAgICAgICB9CiAgICAgICAgIGNvbXBpbGVUYXNrLmNvbnZlbnRpb25NYXBwaW5nLmRlcGVuZGVuY3lDYWNoZURpciA9IHsKLSAgICAgICAgICAgIHByb2plY3QuZmlsZSgiJHByb2plY3QuYnVpbGREaXIvZGVwZW5kZW5jeS1jYWNoZS8kdmFyaWFudERhdGEuZGlyTmFtZSIpCisgICAgICAgICAgICBwcm9qZWN0LmZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyL2RlcGVuZGVuY3ktY2FjaGUvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfSIpCiAgICAgICAgIH0KIAogICAgICAgICAvLyBzZXQgc291cmNlL3RhcmdldCBjb21wYXRpYmlsaXR5CkBAIC02NjcsNiArNzkxLDcgQEAKICAgICAgICAgY29tcGlsZVRhc2suY29udmVudGlvbk1hcHBpbmcudGFyZ2V0Q29tcGF0aWJpbGl0eSA9IHsKICAgICAgICAgICAgIGV4dGVuc2lvbi5jb21waWxlT3B0aW9ucy50YXJnZXRDb21wYXRpYmlsaXR5LnRvU3RyaW5nKCkKICAgICAgICAgfQorICAgICAgICBjb21waWxlVGFzay5vcHRpb25zLmVuY29kaW5nID0gZXh0ZW5zaW9uLmNvbXBpbGVPcHRpb25zLmVuY29kaW5nCiAKICAgICAgICAgLy8gc2V0dXAgdGhlIGJvb3QgY2xhc3NwYXRoIGp1c3QgYmVmb3JlIHRoZSB0YXNrIGFjdHVhbGx5IHJ1bnMgc2luY2UgdGhpcyB3aWxsCiAgICAgICAgIC8vIGZvcmNlIHRoZSBzZGsgdG8gYmUgcGFyc2VkLgpAQCAtNjc1LDYgKzgwMCw1NyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTmRrVGFza3MoQE5vbk51bGwgQmFzZVZhcmlhbnREYXRhIHZhcmlhbnREYXRhKSB7CisgICAgICAgIGNyZWF0ZU5ka1Rhc2tzKAorICAgICAgICAgICAgICAgIHZhcmlhbnREYXRhLAorICAgICAgICAgICAgICAgIHsgcHJvamVjdC5maWxlKCIkcHJvamVjdC5idWlsZERpci9uZGsvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfS9saWIiKSB9CisgICAgICAgICkKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOZGtUYXNrcyhATm9uTnVsbCBCYXNlVmFyaWFudERhdGEgdmFyaWFudERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgQ2xvc3VyZTxGaWxlPiBzb0ZvbGRlckNsb3N1cmUpIHsKKyAgICAgICAgTmRrQ29tcGlsZSBuZGtDb21waWxlID0gcHJvamVjdC50YXNrcy5jcmVhdGUoCisgICAgICAgICAgICAgICAgImNvbXBpbGUke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLmNhcGl0YWxpemUoKX1OZGsiLAorICAgICAgICAgICAgICAgIE5ka0NvbXBpbGUpCisKKyAgICAgICAgbmRrQ29tcGlsZS5wbHVnaW4gPSB0aGlzCisgICAgICAgIG5ka0NvbXBpbGUudmFyaWFudCA9IHZhcmlhbnREYXRhCisgICAgICAgIHZhcmlhbnREYXRhLm5ka0NvbXBpbGVUYXNrID0gbmRrQ29tcGlsZQorCisgICAgICAgIFZhcmlhbnRDb25maWd1cmF0aW9uIHZhcmlhbnRDb25maWcgPSB2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbgorCisgICAgICAgIGlmICh2YXJpYW50Q29uZmlnLm1lcmdlZEZsYXZvci5yZW5kZXJzY3JpcHROZGtNb2RlKSB7CisgICAgICAgICAgICBuZGtDb21waWxlLm5ka1JlbmRlclNjcmlwdE1vZGUgPSB0cnVlCisgICAgICAgICAgICBuZGtDb21waWxlLmRlcGVuZHNPbiB2YXJpYW50RGF0YS5yZW5kZXJzY3JpcHRDb21waWxlVGFzaworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmRrQ29tcGlsZS5uZGtSZW5kZXJTY3JpcHRNb2RlID0gZmFsc2UKKyAgICAgICAgfQorCisgICAgICAgIG5ka0NvbXBpbGUuY29udmVudGlvbk1hcHBpbmcuc291cmNlRm9sZGVycyA9IHsKKyAgICAgICAgICAgIExpc3Q8RmlsZT4gc291cmNlTGlzdCA9IHZhcmlhbnRDb25maWcuam5pU291cmNlTGlzdAorICAgICAgICAgICAgaWYgKHZhcmlhbnRDb25maWcubWVyZ2VkRmxhdm9yLnJlbmRlcnNjcmlwdE5ka01vZGUpIHsKKyAgICAgICAgICAgICAgICBzb3VyY2VMaXN0LmFkZCh2YXJpYW50RGF0YS5yZW5kZXJzY3JpcHRDb21waWxlVGFzay5zb3VyY2VPdXRwdXREaXIpCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzb3VyY2VMaXN0CisgICAgICAgIH0KKworICAgICAgICBuZGtDb21waWxlLmNvbnZlbnRpb25NYXBwaW5nLmdlbmVyYXRlZE1ha2VmaWxlID0geworICAgICAgICAgICAgcHJvamVjdC5maWxlKCIkcHJvamVjdC5idWlsZERpci9uZGsvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfS9BbmRyb2lkLm1rIikKKyAgICAgICAgfQorCisgICAgICAgIG5ka0NvbXBpbGUuY29udmVudGlvbk1hcHBpbmcubmRrQ29uZmlnID0geyB2YXJpYW50Q29uZmlnLm5ka0NvbmZpZyB9CisKKyAgICAgICAgbmRrQ29tcGlsZS5jb252ZW50aW9uTWFwcGluZy5kZWJ1Z2dhYmxlID0geworICAgICAgICAgICAgdmFyaWFudENvbmZpZy5idWlsZFR5cGUuam5pRGVidWdCdWlsZAorICAgICAgICB9CisKKyAgICAgICAgbmRrQ29tcGlsZS5jb252ZW50aW9uTWFwcGluZy5vYmpGb2xkZXIgPSB7CisgICAgICAgICAgICBwcm9qZWN0LmZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyL25kay8ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmRpck5hbWV9L29iaiIpCisgICAgICAgIH0KKyAgICAgICAgbmRrQ29tcGlsZS5jb252ZW50aW9uTWFwcGluZy5zb0ZvbGRlciA9IHNvRm9sZGVyQ2xvc3VyZQorICAgIH0KKwogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIHRhc2tzIHRvIGJ1aWxkIHRoZSB0ZXN0IGFway4KICAgICAgKgpAQCAtNjg4LDEwICs4NjQsMTAgQEAKICAgICAgICAgLy8gdG8gdGVzdCBib3RoLgogICAgICAgICBpZiAoIXZhcmlhbnREYXRhLmlzU2lnbmVkKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBHcmFkbGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJUZXN0ZWQgVmFyaWFudCAnJHt0ZXN0ZWRWYXJpYW50RGF0YS5uYW1lfScgaXMgbm90IGNvbmZpZ3VyZWQgdG8gY3JlYXRlIGEgc2lnbmVkIEFQSy4iKQorICAgICAgICAgICAgICAgICAgICAiVGVzdGVkIFZhcmlhbnQgJyR7dGVzdGVkVmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZnVsbE5hbWV9JyBpcyBub3QgY29uZmlndXJlZCB0byBjcmVhdGUgYSBzaWduZWQgQVBLLiIpCiAgICAgICAgIH0KIAotICAgICAgICBjcmVhdGVQcmVwYXJlRGVwZW5kZW5jaWVzVGFzayh2YXJpYW50RGF0YSkKKyAgICAgICAgY3JlYXRlQW5jaG9yVGFza3ModmFyaWFudERhdGEpCiAKICAgICAgICAgLy8gQWRkIGEgdGFzayB0byBwcm9jZXNzIHRoZSBtYW5pZmVzdAogICAgICAgICBjcmVhdGVQcm9jZXNzVGVzdE1hbmlmZXN0VGFzayh2YXJpYW50RGF0YSwgIm1hbmlmZXN0cyIpCkBAIC03MjcsNiArOTAzLDkgQEAKICAgICAgICAgLy8gQWRkIGEgdGFzayB0byBjb21waWxlIHRoZSB0ZXN0IGFwcGxpY2F0aW9uCiAgICAgICAgIGNyZWF0ZUNvbXBpbGVUYXNrKHZhcmlhbnREYXRhLCB0ZXN0ZWRWYXJpYW50RGF0YSkKIAorICAgICAgICAvLyBBZGQgTkRLIHRhc2tzCisgICAgICAgIGNyZWF0ZU5ka1Rhc2tzKHZhcmlhbnREYXRhKQorCiAgICAgICAgIGFkZFBhY2thZ2VUYXNrcyh2YXJpYW50RGF0YSwgbnVsbCkKIAogICAgICAgICBpZiAoYXNzZW1ibGVUZXN0ICE9IG51bGwpIHsKQEAgLTczNCw2ICs5MTMsNTQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFRPRE8gLSBzaG91bGQgY29tcGlsZSBzcmMvbGludC9qYXZhIGZyb20gc3JjL2xpbnQvamF2YSBhbmQgamFyIGl0IGludG8gYnVpbGQvbGludC9saW50LmphcgorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUxpbnRDb21waWxlVGFzaygpIHsKKyAgICAgICAgbGludENvbXBpbGUgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgiY29tcGlsZUxpbnQiLCBUYXNrKQorICAgICAgICBGaWxlIG91dHB1dERpciA9IG5ldyBGaWxlKCIkcHJvamVjdC5idWlsZERpci9saW50IikKKworICAgICAgICBsaW50Q29tcGlsZS5kb0ZpcnN0eworICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBkaXJlY3RvcnkgZm9yIGxpbnQgb3V0cHV0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAgICAgICAgaWYgKCFvdXRwdXREaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIG1rZGlycyA9IG91dHB1dERpci5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1rZGlycykgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3JhZGxlRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIGxpbnQgb3V0cHV0IGRpcmVjdG9yeS4iKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBJcyB0aGUgZ2l2ZW4gdmFyaWFudCByZWxldmFudCBmb3IgbGludD8gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGludFZhcmlhbnQoQE5vbk51bGwgQmFzZVZhcmlhbnREYXRhIGJhc2VWYXJpYW50RGF0YSkgeworICAgICAgICAvLyBPbmx5IGNyZWF0ZSBsaW50IHRhcmdldHMgZm9yIHZhcmlhbnRzIGxpa2UgZGVidWcgYW5kIHJlbGVhc2UsIG5vdCBkZWJ1Z1Rlc3QKKyAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24gY29uZmlnID0gYmFzZVZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uCisgICAgICAgIHJldHVybiBjb25maWcuZ2V0VHlwZSgpICE9IFZhcmlhbnRDb25maWd1cmF0aW9uLlR5cGUuVEVTVDsKKyAgICB9CisKKyAgICAvLyBBZGQgdGFza3MgZm9yIHJ1bm5pbmcgbGludCBvbiBpbmRpdmlkdWFsIHZhcmlhbnRzLiBXZSd2ZSBhbHJlYWR5IGFkZGVkIGEKKyAgICAvLyBsaW50IHRhc2sgZWFybGllciB3aGljaCBydW5zIG9uIGFsbCB2YXJpYW50cy4KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaW50VGFza3MoKSB7CisgICAgICAgIGludCBjb3VudCA9IHZhcmlhbnREYXRhTGlzdC5zaXplKCkKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgY291bnQgOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIEJhc2VWYXJpYW50RGF0YSBiYXNlVmFyaWFudERhdGEgPSB2YXJpYW50RGF0YUxpc3QuZ2V0KGkpCisgICAgICAgICAgICBpZiAoIWlzTGludFZhcmlhbnQoYmFzZVZhcmlhbnREYXRhKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgdmFyaWFudE5hbWUgPSBiYXNlVmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZnVsbE5hbWUKKyAgICAgICAgICAgIGRlZiBjYXBpdGFsaXplZFZhcmlhbnROYW1lID0gdmFyaWFudE5hbWUuY2FwaXRhbGl6ZSgpCisgICAgICAgICAgICBUYXNrIGxpbnRDaGVjayA9IHByb2plY3QudGFza3MuY3JlYXRlKCJsaW50IiArIGNhcGl0YWxpemVkVmFyaWFudE5hbWUsIExpbnQpCisgICAgICAgICAgICBsaW50Q2hlY2suZGVwZW5kc09uIGJhc2VWYXJpYW50RGF0YS5qYXZhQ29tcGlsZVRhc2ssIGxpbnRDb21waWxlCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgZG8gImxpbnQuZGVwZW5kc09uIGxpbnRDaGVjayI7IHRoZSAibGludCIgdGFyZ2V0IHdpbGwKKyAgICAgICAgICAgIC8vIG9uIGl0cyBvd24gcnVuIHRocm91Z2ggYWxsIHZhcmlhbnRzIChhbmQgY29tcGFyZSByZXN1bHRzKSwgaXQgZG9lc24ndCBkZWxlZ2F0ZQorICAgICAgICAgICAgLy8gdG8gdGhlIGluZGl2aWR1YWwgdGFza3MgKHNpbmNlIGl0IG5lZWRzIHRvIGNvb3JkaW5hdGUgZGF0YSBjb2xsZWN0aW9uIGFuZAorICAgICAgICAgICAgLy8gcmVwb3J0aW5nKQorICAgICAgICAgICAgbGludENoZWNrLnNldFBsdWdpbih0aGlzKQorICAgICAgICAgICAgbGludENoZWNrLnNldFZhcmlhbnROYW1lKHZhcmlhbnROYW1lKQorICAgICAgICAgICAgbGludENoZWNrLmRlc2NyaXB0aW9uID0gIlJ1bnMgbGludCBvbiB0aGUgIiArIGNhcGl0YWxpemVkVmFyaWFudE5hbWUgKyAiIGJ1aWxkIgorICAgICAgICAgICAgbGludENoZWNrLmdyb3VwID0gSmF2YUJhc2VQbHVnaW4uVkVSSUZJQ0FUSU9OX0dST1VQCisgICAgICAgIH0KKyAgICB9CisKICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGVja1Rhc2tzKGJvb2xlYW4gaGFzRmxhdm9ycywgYm9vbGVhbiBpc0xpYnJhcnlUZXN0KSB7CiAgICAgICAgIExpc3Q8QW5kcm9pZFJlcG9ydFRhc2s+IHJlcG9ydFRhc2tzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aEV4cGVjdGVkU2l6ZSgyKQogCkBAIC04MTMsOCArMTA0MCw4IEBACiAgICAgICAgICAgICAgICAgLy8gZmlyc3QgdGhlIGNvbm5lY3RlZCBvbmUuCiAgICAgICAgICAgICAgICAgZGVmIGNvbm5lY3RlZFRhc2sgPSBjcmVhdGVEZXZpY2VQcm92aWRlckluc3RydW1lbnRUZXN0VGFzaygKICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ZsYXZvcnMgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke2Nvbm5lY3RlZFJvb3ROYW1lfSR7YmFzZVZhcmlhbnREYXRhLm5hbWV9IiA6IGNvbm5lY3RlZFJvb3ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIkluc3RhbGxzIGFuZCBydW5zIHRoZSB0ZXN0cyBmb3IgQnVpbGQgJyR7YmFzZVZhcmlhbnREYXRhLm5hbWV9JyBvbiBjb25uZWN0ZWQgZGV2aWNlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke2Nvbm5lY3RlZFJvb3ROYW1lfSR7YmFzZVZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLmNhcGl0YWxpemUoKX0iIDogY29ubmVjdGVkUm9vdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAiSW5zdGFsbHMgYW5kIHJ1bnMgdGhlIHRlc3RzIGZvciBCdWlsZCAnJHtiYXNlVmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZnVsbE5hbWV9JyBvbiBjb25uZWN0ZWQgZGV2aWNlcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgaXNMaWJyYXJ5VGVzdCA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUHJvdmlkZXJJbnN0cnVtZW50VGVzdExpYnJhcnlUYXNrIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQcm92aWRlckluc3RydW1lbnRUZXN0VGFzaywKQEAgLTgzMSw5ICsxMDU4LDkgQEAKICAgICAgICAgICAgICAgICBmb3IgKERldmljZVByb3ZpZGVyIGRldmljZVByb3ZpZGVyIDogcHJvdmlkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRUYXNrIHByb3ZpZGVyVGFzayA9IGNyZWF0ZURldmljZVByb3ZpZGVySW5zdHJ1bWVudFRlc3RUYXNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ZsYXZvcnMgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtkZXZpY2VQcm92aWRlci5uYW1lfSR7SU5TVFJVTUVOVF9URVNULmNhcGl0YWxpemUoKX0ke2Jhc2VWYXJpYW50RGF0YS5uYW1lfSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtkZXZpY2VQcm92aWRlci5uYW1lfSR7SU5TVFJVTUVOVF9URVNULmNhcGl0YWxpemUoKX0ke2Jhc2VWYXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZS5jYXBpdGFsaXplKCl9IiA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke2RldmljZVByb3ZpZGVyLm5hbWV9JHtJTlNUUlVNRU5UX1RFU1QuY2FwaXRhbGl6ZSgpfSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluc3RhbGxzIGFuZCBydW5zIHRoZSB0ZXN0cyBmb3IgQnVpbGQgJyR7YmFzZVZhcmlhbnREYXRhLm5hbWV9JyB1c2luZyBQcm92aWRlciAnJHtkZXZpY2VQcm92aWRlci5uYW1lLmNhcGl0YWxpemUoKX0nLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluc3RhbGxzIGFuZCBydW5zIHRoZSB0ZXN0cyBmb3IgQnVpbGQgJyR7YmFzZVZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lfScgdXNpbmcgUHJvdmlkZXIgJyR7ZGV2aWNlUHJvdmlkZXIubmFtZS5jYXBpdGFsaXplKCl9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGlicmFyeVRlc3QgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQcm92aWRlckluc3RydW1lbnRUZXN0TGlicmFyeVRhc2sgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQcm92aWRlckluc3RydW1lbnRUZXN0VGFzaywKQEAgLTg1NiwxMCArMTA4MywxMCBAQAogICAgICAgICAgICAgICAgIGZvciAoVGVzdFNlcnZlciB0ZXN0U2VydmVyIDogc2VydmVycykgewogICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VGFzayBzZXJ2ZXJUYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzRmxhdm9ycyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke3Rlc3RTZXJ2ZXIubmFtZX0keyJ1cGxvYWQiLmNhcGl0YWxpemUoKX0ke2Jhc2VWYXJpYW50RGF0YS5uYW1lfSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHt0ZXN0U2VydmVyLm5hbWV9JHsidXBsb2FkIi5jYXBpdGFsaXplKCl9JHtiYXNlVmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZnVsbE5hbWV9IiA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke3Rlc3RTZXJ2ZXIubmFtZX0keyJ1cGxvYWQiLmNhcGl0YWxpemUoKX0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RTZXJ2ZXJUYXNrKQotICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUYXNrLmRlc2NyaXB0aW9uID0gIlVwbG9hZHMgQVBLcyBmb3IgQnVpbGQgJyR7YmFzZVZhcmlhbnREYXRhLm5hbWV9JyB0byBUZXN0IFNlcnZlciAnJHt0ZXN0U2VydmVyLm5hbWUuY2FwaXRhbGl6ZSgpfScuIgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUYXNrLmRlc2NyaXB0aW9uID0gIlVwbG9hZHMgQVBLcyBmb3IgQnVpbGQgJyR7YmFzZVZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lfScgdG8gVGVzdCBTZXJ2ZXIgJyR7dGVzdFNlcnZlci5uYW1lLmNhcGl0YWxpemUoKX0nLiIKICAgICAgICAgICAgICAgICAgICAgc2VydmVyVGFzay5ncm91cCA9IEphdmFCYXNlUGx1Z2luLlZFUklGSUNBVElPTl9HUk9VUAogICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUYXNrLmRlcGVuZHNPbiB0ZXN0VmFyaWFudERhdGEuYXNzZW1ibGVUYXNrLCBiYXNlVmFyaWFudERhdGEuYXNzZW1ibGVUYXNrCiAKQEAgLTg3MCw3ICsxMDk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRhc2suY29udmVudGlvbk1hcHBpbmcudGVzdGVkQXBrID0geyBiYXNlVmFyaWFudERhdGEub3V0cHV0RmlsZSB9CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUYXNrLmNvbnZlbnRpb25NYXBwaW5nLnZhcmlhbnROYW1lID0geyBiYXNlVmFyaWFudERhdGEubmFtZSB9CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRhc2suY29udmVudGlvbk1hcHBpbmcudmFyaWFudE5hbWUgPSB7IGJhc2VWYXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZSB9CiAKICAgICAgICAgICAgICAgICAgICAgZGV2aWNlQ2hlY2suZGVwZW5kc09uIHNlcnZlclRhc2sKIApAQCAtOTE2LDcgKzExNDMsNyBAQAogCiAgICAgICAgIHRlc3RUYXNrLnBsdWdpbiA9IHRoaXMKICAgICAgICAgdGVzdFRhc2sudmFyaWFudCA9IHZhcmlhbnREYXRhCi0gICAgICAgIHRlc3RUYXNrLmZsYXZvck5hbWUgPSB2YXJpYW50RGF0YS5mbGF2b3JOYW1lCisgICAgICAgIHRlc3RUYXNrLmZsYXZvck5hbWUgPSB2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mbGF2b3JOYW1lLmNhcGl0YWxpemUoKQogICAgICAgICB0ZXN0VGFzay5kZXZpY2VQcm92aWRlciA9IGRldmljZVByb3ZpZGVyCiAKICAgICAgICAgdGVzdFRhc2suY29udmVudGlvbk1hcHBpbmcudGVzdEFwcCA9IHsgdmFyaWFudERhdGEub3V0cHV0RmlsZSB9CkBAIC05MjksNyArMTE1Niw3IEBACiAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLnRlc3RPcHRpb25zLnJlc3VsdHNEaXIgOgogICAgICAgICAgICAgICAgICIkcHJvamVjdC5idWlsZERpci8kRkRfSU5TVFJVTUVOVF9SRVNVTFRTIgogCi0gICAgICAgICAgICBTdHJpbmcgZmxhdm9yRm9sZGVyID0gdmFyaWFudERhdGEuZmxhdm9yRGlyTmFtZQorICAgICAgICAgICAgU3RyaW5nIGZsYXZvckZvbGRlciA9IHZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZsYXZvck5hbWUKICAgICAgICAgICAgIGlmICghZmxhdm9yRm9sZGVyLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGZsYXZvckZvbGRlciA9ICIkRkRfRkxBVk9SUy8iICsgZmxhdm9yRm9sZGVyCiAgICAgICAgICAgICB9CkBAIC05NDEsNyArMTE2OCw3IEBACiAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLnRlc3RPcHRpb25zLnJlcG9ydERpciA6CiAgICAgICAgICAgICAgICAgIiRwcm9qZWN0LmJ1aWxkRGlyLyRGRF9SRVBPUlRTLyRGRF9JTlNUUlVNRU5UX1RFU1RTIgogCi0gICAgICAgICAgICBTdHJpbmcgZmxhdm9yRm9sZGVyID0gdmFyaWFudERhdGEuZmxhdm9yRGlyTmFtZQorICAgICAgICAgICAgU3RyaW5nIGZsYXZvckZvbGRlciA9IHZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZsYXZvck5hbWUKICAgICAgICAgICAgIGlmICghZmxhdm9yRm9sZGVyLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGZsYXZvckZvbGRlciA9ICIkRkRfRkxBVk9SUy8iICsgZmxhdm9yRm9sZGVyCiAgICAgICAgICAgICB9CkBAIC05NjAsMTEzICsxMTg3LDExNiBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGFkZFBhY2thZ2VUYXNrcyhATm9uTnVsbCBBcGtWYXJpYW50RGF0YSB2YXJpYW50RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIFRhc2sgYXNzZW1ibGVUYXNrKSB7Ci0KICAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24gdmFyaWFudENvbmZpZyA9IHZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uCiAKLSAgICAgICAgQ2xvc3VyZSBsaWJyYXJ5Q2xvc3VyZSA9IHsgcHJvamVjdC5maWxlcyh2YXJpYW50Q29uZmlnLnBhY2thZ2VkSmFycykgfQotICAgICAgICBDbG9zdXJlIHNvdXJjZUNsb3N1cmUgPSB7IHZhcmlhbnREYXRhLmphdmFDb21waWxlVGFzay5vdXRwdXRzLmZpbGVzIH0KLSAgICAgICAgQ2xvc3VyZSBwcm9ndWFyZEZpbGVDbG9zdXJlID0geyB9CisgICAgICAgIGJvb2xlYW4gcnVuUHJvZ3VhcmQgPSB2YXJpYW50Q29uZmlnLmJ1aWxkVHlwZS5ydW5Qcm9ndWFyZCAmJgorICAgICAgICAgICAgICAgICh2YXJpYW50Q29uZmlnLnR5cGUgIT0gVmFyaWFudENvbmZpZ3VyYXRpb24uVHlwZS5URVNUIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAodmFyaWFudENvbmZpZy50eXBlID09IFZhcmlhbnRDb25maWd1cmF0aW9uLlR5cGUuVEVTVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50Q29uZmlnLnRlc3RlZENvbmZpZy50eXBlICE9IFZhcmlhbnRDb25maWd1cmF0aW9uLlR5cGUuTElCUkFSWSkpCiAKLSAgICAgICAgaWYgKCEodmFyaWFudERhdGEgaW5zdGFuY2VvZiBUZXN0VmFyaWFudERhdGEpICYmIHZhcmlhbnRDb25maWcuYnVpbGRUeXBlLnJ1blByb2d1YXJkKSB7Ci0KLSAgICAgICAgICAgIGRlZiBwcm9ndWFyZFRhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgicHJvZ3VhcmQke3ZhcmlhbnREYXRhLm5hbWV9IiwgUHJvR3VhcmRUYXNrKTsKLSAgICAgICAgICAgIHByb2d1YXJkVGFzay5kZXBlbmRzT24gdmFyaWFudERhdGEuamF2YUNvbXBpbGVUYXNrCi0gICAgICAgICAgICB2YXJpYW50RGF0YS5wcm9ndWFyZFRhc2sgPSBwcm9ndWFyZFRhc2sKLQotICAgICAgICAgICAgRmlsZSBvdXRGaWxlID0gcHJvamVjdC5maWxlKAotICAgICAgICAgICAgICAgICAgICAiJHtwcm9qZWN0LmJ1aWxkRGlyfS9jbGFzc2VzLXByb2d1YXJkLyR7dmFyaWFudERhdGEuZGlyTmFtZX0vY2xhc3Nlcy5qYXIiKQotCi0gICAgICAgICAgICBsaWJyYXJ5Q2xvc3VyZSA9IHsgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgfQotICAgICAgICAgICAgc291cmNlQ2xvc3VyZSA9IHsgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgfQotICAgICAgICAgICAgcHJvZ3VhcmRGaWxlQ2xvc3VyZSA9IHsgb3V0RmlsZSB9Ci0KLSAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIFByb2d1YXJkIHRhc2sgYWN0cyBvbiBhbGwgdGhlIGNvbmZpZyByaWdodCBhd2F5IGFuZCBub3Qgd2hlbiB0aGUKLSAgICAgICAgICAgIC8vIHRhc2sgYWN0dWFsbHkgcnVucywgbGV0J3MgY29uZmlndXJlIGl0IGluIGl0cyBkb0ZpcnN0Ci0KLSAgICAgICAgICAgIHByb2d1YXJkVGFzay5kb0ZpcnN0IHsKLQotICAgICAgICAgICAgICAgIC8vIGFsbCB0aGUgY29uZmlnIGZpbGVzIGNvbWluZyBmcm9tIGJ1aWxkIHR5cGUsIHByb2R1Y3QgZmxhdm9ycy4KLSAgICAgICAgICAgICAgICBMaXN0PE9iamVjdD4gcHJvZ3VhcmRGaWxlcyA9IHZhcmlhbnRDb25maWcuZ2V0UHJvZ3VhcmRGaWxlcyh0cnVlIC8qaW5jbHVkZUxpYnMqLyk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgcHJvZ3VhcmRGaWxlIDogcHJvZ3VhcmRGaWxlcykgewotICAgICAgICAgICAgICAgICAgICBwcm9ndWFyZFRhc2suY29uZmlndXJhdGlvbihwcm9ndWFyZEZpbGUpCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gYWxzbyB0aGUgY29uZmlnIGZpbGUgb3V0cHV0IGJ5IGFhcHQKLSAgICAgICAgICAgICAgICBwcm9ndWFyZFRhc2suY29uZmlndXJhdGlvbih2YXJpYW50RGF0YS5wcm9jZXNzUmVzb3VyY2VzVGFzay5wcm9ndWFyZE91dHB1dEZpbGUpCi0KLSAgICAgICAgICAgICAgICAvLyBpbmphcjogdGhlIGNvbXBpbGF0aW9uIG91dHB1dAotICAgICAgICAgICAgICAgIHByb2d1YXJkVGFzay5pbmphcnModmFyaWFudERhdGEuamF2YUNvbXBpbGVUYXNrLmRlc3RpbmF0aW9uRGlyKQotCi0gICAgICAgICAgICAgICAgLy8gaW5qYXI6IHRoZSBkZXBlbmRlbmNpZXMKLSAgICAgICAgICAgICAgICBmb3IgKEZpbGUgaW5KYXIgOiB2YXJpYW50Q29uZmlnLnBhY2thZ2VkSmFycykgewotICAgICAgICAgICAgICAgICAgICBwcm9ndWFyZFRhc2suaW5qYXJzKGluSmFyLCBmaWx0ZXI6ICchTUVUQS1JTkYvTUFOSUZFU1QuTUYnKQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGxpYnJhcnlKYXJzOiB0aGUgcnVudGltZSBqYXJzCi0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcnVudGltZUphciA6IGdldFJ1bnRpbWVKYXJMaXN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ3VhcmRUYXNrLmxpYnJhcnlqYXJzKHJ1bnRpbWVKYXIpCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJvZ3VhcmRUYXNrLm91dGphcnMob3V0RmlsZSkKLQotICAgICAgICAgICAgICAgIHByb2d1YXJkVGFzay5kdW1wKCIke3Byb2plY3QuYnVpbGREaXJ9L3Byb2d1YXJkLyR7dmFyaWFudERhdGEuZGlyTmFtZX0vZHVtcC50eHQiKQotICAgICAgICAgICAgICAgIHByb2d1YXJkVGFzay5wcmludHNlZWRzKAotICAgICAgICAgICAgICAgICAgICAgICAgIiR7cHJvamVjdC5idWlsZERpcn0vcHJvZ3VhcmQvJHt2YXJpYW50RGF0YS5kaXJOYW1lfS9zZWVkcy50eHQiKQotICAgICAgICAgICAgICAgIHByb2d1YXJkVGFzay5wcmludHVzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgIiR7cHJvamVjdC5idWlsZERpcn0vcHJvZ3VhcmQvJHt2YXJpYW50RGF0YS5kaXJOYW1lfS91c2FnZS50eHQiKQotICAgICAgICAgICAgICAgIHByb2d1YXJkVGFzay5wcmludG1hcHBpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiJHtwcm9qZWN0LmJ1aWxkRGlyfS9wcm9ndWFyZC8ke3ZhcmlhbnREYXRhLmRpck5hbWV9L21hcHBpbmcudHh0IikKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBhIGRleCB0YXNrCi0gICAgICAgIGRlZiBkZXhUYXNrTmFtZSA9ICJkZXgke3ZhcmlhbnREYXRhLm5hbWV9IgotICAgICAgICBkZWYgZGV4VGFzayA9IHByb2plY3QudGFza3MuY3JlYXRlKGRleFRhc2tOYW1lLCBEZXgpCisgICAgICAgIC8vIGNvbW1vbiBkZXggdGFzayBjb25maWd1cmF0aW9uCisgICAgICAgIFN0cmluZyBkZXhUYXNrTmFtZSA9ICJkZXgke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLmNhcGl0YWxpemUoKX0iCisgICAgICAgIERleCBkZXhUYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoZGV4VGFza05hbWUsIERleCkKICAgICAgICAgdmFyaWFudERhdGEuZGV4VGFzayA9IGRleFRhc2sKLSAgICAgICAgaWYgKHZhcmlhbnREYXRhLnByb2d1YXJkVGFzayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZXhUYXNrLmRlcGVuZHNPbiB2YXJpYW50RGF0YS5wcm9ndWFyZFRhc2sKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRleFRhc2suZGVwZW5kc09uIHZhcmlhbnREYXRhLmphdmFDb21waWxlVGFzawotICAgICAgICB9CiAKICAgICAgICAgZGV4VGFzay5wbHVnaW4gPSB0aGlzCiAgICAgICAgIGRleFRhc2sudmFyaWFudCA9IHZhcmlhbnREYXRhCi0gICAgICAgIGRleFRhc2suaW5jcmVtZW50YWxGb2xkZXIgPQotICAgICAgICAgICAgICAgIHByb2plY3QuZmlsZSgiJHByb2plY3QuYnVpbGREaXIvaW5jcmVtZW50YWwvZGV4LyR2YXJpYW50RGF0YS5kaXJOYW1lIikKIAotICAgICAgICBkZXhUYXNrLmNvbnZlbnRpb25NYXBwaW5nLmxpYnJhcmllcyA9IGxpYnJhcnlDbG9zdXJlCi0gICAgICAgIGRleFRhc2suY29udmVudGlvbk1hcHBpbmcuc291cmNlRmlsZXMgPSBzb3VyY2VDbG9zdXJlCi0gICAgICAgIGRleFRhc2suY29udmVudGlvbk1hcHBpbmcucHJvZ3VhcmRlZEphciA9IHByb2d1YXJkRmlsZUNsb3N1cmUKICAgICAgICAgZGV4VGFzay5jb252ZW50aW9uTWFwcGluZy5vdXRwdXRGaWxlID0gewogICAgICAgICAgICAgcHJvamVjdC5maWxlKAotICAgICAgICAgICAgICAgICAgICAiJHtwcm9qZWN0LmJ1aWxkRGlyfS9saWJzLyR7cHJvamVjdC5hcmNoaXZlc0Jhc2VOYW1lfS0ke3ZhcmlhbnREYXRhLmJhc2VOYW1lfS5kZXgiKQorICAgICAgICAgICAgICAgICAgICAiJHtwcm9qZWN0LmJ1aWxkRGlyfS9saWJzLyR7cHJvamVjdC5hcmNoaXZlc0Jhc2VOYW1lfS0ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmJhc2VOYW1lfS5kZXgiKQogICAgICAgICB9CiAgICAgICAgIGRleFRhc2suZGV4T3B0aW9ucyA9IGV4dGVuc2lvbi5kZXhPcHRpb25zCiAKKyAgICAgICAgaWYgKHJ1blByb2d1YXJkKSB7CisKKyAgICAgICAgICAgIC8vIGZpcnN0IHByb2d1YXJkIHRhc2suCisgICAgICAgICAgICBCYXNlVmFyaWFudERhdGEgdGVzdGVkVmFyaWFudERhdGEgPSB2YXJpYW50RGF0YSBpbnN0YW5jZW9mIFRlc3RWYXJpYW50RGF0YSA/IHZhcmlhbnREYXRhLnRlc3RlZFZhcmlhbnREYXRhIDogbnVsbCBhcyBCYXNlVmFyaWFudERhdGEKKyAgICAgICAgICAgIEZpbGUgb3V0RmlsZSA9IGNyZWF0ZVByb2d1YXJkVGFza3ModmFyaWFudERhdGEsIHRlc3RlZFZhcmlhbnREYXRhKQorCisgICAgICAgICAgICAvLyB0aGVuIGRleGluZyB0YXNrCisgICAgICAgICAgICBkZXhUYXNrLmRlcGVuZHNPbiB2YXJpYW50RGF0YS5wcm9ndWFyZFRhc2sKKyAgICAgICAgICAgIGRleFRhc2suY29udmVudGlvbk1hcHBpbmcuaW5wdXRGaWxlcyA9IHsgcHJvamVjdC5maWxlcyhvdXRGaWxlKSB9CisgICAgICAgICAgICBkZXhUYXNrLmNvbnZlbnRpb25NYXBwaW5nLnByZURleGVkTGlicmFyaWVzID0geyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSB9CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gaWYgcmVxdWlyZWQsIHByZS1kZXhpbmcgdGFzay4KKyAgICAgICAgICAgIFByZURleCBwcmVEZXhUYXNrID0gbnVsbDsKKyAgICAgICAgICAgIGJvb2xlYW4gcnVuUHJlRGV4ID0gZXh0ZW5zaW9uLmRleE9wdGlvbnMucHJlRGV4TGlicmFyaWVzCisgICAgICAgICAgICBpZiAocnVuUHJlRGV4KSB7CisgICAgICAgICAgICAgICAgZGVmIHByZURleFRhc2tOYW1lID0gInByZURleCR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZnVsbE5hbWUuY2FwaXRhbGl6ZSgpfSIKKyAgICAgICAgICAgICAgICBwcmVEZXhUYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUocHJlRGV4VGFza05hbWUsIFByZURleCkKKworICAgICAgICAgICAgICAgIHByZURleFRhc2suZGVwZW5kc09uIHZhcmlhbnREYXRhLmphdmFDb21waWxlVGFzaworICAgICAgICAgICAgICAgIHByZURleFRhc2sucGx1Z2luID0gdGhpcworICAgICAgICAgICAgICAgIHByZURleFRhc2suZGV4T3B0aW9ucyA9IGV4dGVuc2lvbi5kZXhPcHRpb25zCisKKyAgICAgICAgICAgICAgICBwcmVEZXhUYXNrLmNvbnZlbnRpb25NYXBwaW5nLmlucHV0RmlsZXMgPSB7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZmlsZXMoZ2V0QW5kcm9pZEJ1aWxkZXIodmFyaWFudERhdGEpLmdldFBhY2thZ2VkSmFycyh2YXJpYW50Q29uZmlnKSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJlRGV4VGFzay5jb252ZW50aW9uTWFwcGluZy5vdXRwdXRGb2xkZXIgPSB7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtwcm9qZWN0LmJ1aWxkRGlyfS9wcmUtZGV4ZWQvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfSIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0aGVuIGRleGluZyB0YXNrCisgICAgICAgICAgICBkZXhUYXNrLmRlcGVuZHNPbiB2YXJpYW50RGF0YS5qYXZhQ29tcGlsZVRhc2sKKyAgICAgICAgICAgIGlmIChydW5QcmVEZXgpIHsKKyAgICAgICAgICAgICAgICBkZXhUYXNrLmRlcGVuZHNPbiBwcmVEZXhUYXNrCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRleFRhc2suY29udmVudGlvbk1hcHBpbmcuaW5wdXRGaWxlcyA9IHsgdmFyaWFudERhdGEuamF2YUNvbXBpbGVUYXNrLm91dHB1dHMuZmlsZXMgfQorICAgICAgICAgICAgaWYgKHJ1blByZURleCkgeworICAgICAgICAgICAgICAgIGRleFRhc2suY29udmVudGlvbk1hcHBpbmcucHJlRGV4ZWRMaWJyYXJpZXMgPSB7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZmlsZVRyZWUocHJlRGV4VGFzay5vdXRwdXRGb2xkZXIpLmZpbGVzCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXhUYXNrLmNvbnZlbnRpb25NYXBwaW5nLnByZURleGVkTGlicmFyaWVzID0geworICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmZpbGVzKGdldEFuZHJvaWRCdWlsZGVyKHZhcmlhbnREYXRhKS5nZXRQYWNrYWdlZEphcnModmFyaWFudENvbmZpZykpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgLy8gQWRkIGEgdGFzayB0byBnZW5lcmF0ZSBhcHBsaWNhdGlvbiBwYWNrYWdlCi0gICAgICAgIGRlZiBwYWNrYWdlQXBwID0gcHJvamVjdC50YXNrcy5jcmVhdGUoInBhY2thZ2Uke3ZhcmlhbnREYXRhLm5hbWV9IiwgUGFja2FnZUFwcGxpY2F0aW9uKQorICAgICAgICBkZWYgcGFja2FnZUFwcCA9IHByb2plY3QudGFza3MuY3JlYXRlKAorICAgICAgICAgICAgICAgICJwYWNrYWdlJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZS5jYXBpdGFsaXplKCl9IiwKKyAgICAgICAgICAgICAgICBQYWNrYWdlQXBwbGljYXRpb24pCiAgICAgICAgIHZhcmlhbnREYXRhLnBhY2thZ2VBcHBsaWNhdGlvblRhc2sgPSBwYWNrYWdlQXBwCi0gICAgICAgIHBhY2thZ2VBcHAuZGVwZW5kc09uIHZhcmlhbnREYXRhLnByb2Nlc3NSZXNvdXJjZXNUYXNrLCBkZXhUYXNrLCB2YXJpYW50RGF0YS5wcm9jZXNzSmF2YVJlc291cmNlcworICAgICAgICBwYWNrYWdlQXBwLmRlcGVuZHNPbiB2YXJpYW50RGF0YS5wcm9jZXNzUmVzb3VyY2VzVGFzaywgZGV4VGFzaywgdmFyaWFudERhdGEucHJvY2Vzc0phdmFSZXNvdXJjZXNUYXNrLCB2YXJpYW50RGF0YS5uZGtDb21waWxlVGFzawogCiAgICAgICAgIHBhY2thZ2VBcHAucGx1Z2luID0gdGhpcwogICAgICAgICBwYWNrYWdlQXBwLnZhcmlhbnQgPSB2YXJpYW50RGF0YQogCi0gICAgICAgIFZhcmlhbnRDb25maWd1cmF0aW9uIGNvbmZpZyA9IHZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uCi0KICAgICAgICAgcGFja2FnZUFwcC5jb252ZW50aW9uTWFwcGluZy5yZXNvdXJjZUZpbGUgPSB7CiAgICAgICAgICAgICB2YXJpYW50RGF0YS5wcm9jZXNzUmVzb3VyY2VzVGFzay5wYWNrYWdlT3V0cHV0RmlsZQogICAgICAgICB9CiAgICAgICAgIHBhY2thZ2VBcHAuY29udmVudGlvbk1hcHBpbmcuZGV4RmlsZSA9IHsgZGV4VGFzay5vdXRwdXRGaWxlIH0KLQotICAgICAgICBwYWNrYWdlQXBwLmNvbnZlbnRpb25NYXBwaW5nLnBhY2thZ2VkSmFycyA9IHsgY29uZmlnLnBhY2thZ2VkSmFycyB9Ci0KKyAgICAgICAgcGFja2FnZUFwcC5jb252ZW50aW9uTWFwcGluZy5wYWNrYWdlZEphcnMgPSB7IGdldEFuZHJvaWRCdWlsZGVyKHZhcmlhbnREYXRhKS5nZXRQYWNrYWdlZEphcnModmFyaWFudENvbmZpZykgfQogICAgICAgICBwYWNrYWdlQXBwLmNvbnZlbnRpb25NYXBwaW5nLmphdmFSZXNvdXJjZURpciA9IHsKLSAgICAgICAgICAgIGdldE9wdGlvbmFsRGlyKHZhcmlhbnREYXRhLnByb2Nlc3NKYXZhUmVzb3VyY2VzLmRlc3RpbmF0aW9uRGlyKQorICAgICAgICAgICAgZ2V0T3B0aW9uYWxEaXIodmFyaWFudERhdGEucHJvY2Vzc0phdmFSZXNvdXJjZXNUYXNrLmRlc3RpbmF0aW9uRGlyKQogICAgICAgICB9CisgICAgICAgIHBhY2thZ2VBcHAuY29udmVudGlvbk1hcHBpbmcuam5pRm9sZGVycyA9IHsKKyAgICAgICAgICAgIC8vIGZvciBub3cgb25seSB0aGUgcHJvamVjdCdzIGNvbXBpbGF0aW9uIG91dHB1dC4KKyAgICAgICAgICAgIFNldDxGaWxlPiBzZXQgPSBTZXRzLm5ld0hhc2hTZXQoKQorICAgICAgICAgICAgc2V0LmFkZEFsbCh2YXJpYW50RGF0YS5uZGtDb21waWxlVGFzay5zb0ZvbGRlcikKKyAgICAgICAgICAgIHNldC5hZGRBbGwodmFyaWFudERhdGEucmVuZGVyc2NyaXB0Q29tcGlsZVRhc2subGliT3V0cHV0RGlyKQorICAgICAgICAgICAgc2V0LmFkZEFsbCh2YXJpYW50Q29uZmlnLmxpYnJhcnlKbmlGb2xkZXJzKQogCi0gICAgICAgIHBhY2thZ2VBcHAuY29udmVudGlvbk1hcHBpbmcuam5pRGVidWdCdWlsZCA9IHsgY29uZmlnLmJ1aWxkVHlwZS5qbmlEZWJ1Z0J1aWxkIH0KKyAgICAgICAgICAgIGlmICh2YXJpYW50Q29uZmlnLm1lcmdlZEZsYXZvci5yZW5kZXJzY3JpcHRTdXBwb3J0TW9kZSkgeworICAgICAgICAgICAgICAgIEZpbGUgcnNMaWJzID0gZ2V0QW5kcm9pZEJ1aWxkZXIodmFyaWFudERhdGEpLmdldFN1cHBvcnROYXRpdmVMaWJGb2xkZXIoKQorICAgICAgICAgICAgICAgIGlmIChyc0xpYnMuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKHJzTGlicyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0gICAgICAgIFNpZ25pbmdDb25maWdEc2wgc2MgPSAoU2lnbmluZ0NvbmZpZ0RzbCkgY29uZmlnLnNpZ25pbmdDb25maWcKKyAgICAgICAgICAgIHJldHVybiBzZXQKKyAgICAgICAgfQorICAgICAgICBwYWNrYWdlQXBwLmNvbnZlbnRpb25NYXBwaW5nLmFiaUZpbHRlcnMgPSB7IHZhcmlhbnRDb25maWcuc3VwcG9ydGVkQWJpcyB9CisgICAgICAgIHBhY2thZ2VBcHAuY29udmVudGlvbk1hcHBpbmcuam5pRGVidWdCdWlsZCA9IHsgdmFyaWFudENvbmZpZy5idWlsZFR5cGUuam5pRGVidWdCdWlsZCB9CisKKyAgICAgICAgU2lnbmluZ0NvbmZpZ0RzbCBzYyA9IChTaWduaW5nQ29uZmlnRHNsKSB2YXJpYW50Q29uZmlnLnNpZ25pbmdDb25maWcKICAgICAgICAgcGFja2FnZUFwcC5jb252ZW50aW9uTWFwcGluZy5zaWduaW5nQ29uZmlnID0geyBzYyB9CiAgICAgICAgIGlmIChzYyAhPSBudWxsKSB7CiAgICAgICAgICAgICBWYWxpZGF0ZVNpZ25pbmdUYXNrIHZhbGlkYXRlU2lnbmluZ1Rhc2sgPSB2YWxpZGF0ZVNpZ25pbmdUYXNrTWFwLmdldChzYykKQEAgLTEwODQsOCArMTMxNCw4IEBACiAKICAgICAgICAgZGVmIHNpZ25lZEFwayA9IHZhcmlhbnREYXRhLmlzU2lnbmVkKCkKICAgICAgICAgZGVmIGFwa05hbWUgPSBzaWduZWRBcGsgPwotICAgICAgICAgICAgIiR7cHJvamVjdC5hcmNoaXZlc0Jhc2VOYW1lfS0ke3ZhcmlhbnREYXRhLmJhc2VOYW1lfS11bmFsaWduZWQuYXBrIiA6Ci0gICAgICAgICAgICAiJHtwcm9qZWN0LmFyY2hpdmVzQmFzZU5hbWV9LSR7dmFyaWFudERhdGEuYmFzZU5hbWV9LXVuc2lnbmVkLmFwayIKKyAgICAgICAgICAgICIke3Byb2plY3QuYXJjaGl2ZXNCYXNlTmFtZX0tJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5iYXNlTmFtZX0tdW5hbGlnbmVkLmFwayIgOgorICAgICAgICAgICAgIiR7cHJvamVjdC5hcmNoaXZlc0Jhc2VOYW1lfS0ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmJhc2VOYW1lfS11bnNpZ25lZC5hcGsiCiAKICAgICAgICAgcGFja2FnZUFwcC5jb252ZW50aW9uTWFwcGluZy5vdXRwdXRGaWxlID0gewogICAgICAgICAgICAgcHJvamVjdC5maWxlKCIkcHJvamVjdC5idWlsZERpci9hcGsvJHthcGtOYW1lfSIpCkBAIC0xMDk3LDI1ICsxMzI3LDI5IEBACiAgICAgICAgIGlmIChzaWduZWRBcGspIHsKICAgICAgICAgICAgIGlmICh2YXJpYW50RGF0YS56aXBBbGlnbikgewogICAgICAgICAgICAgICAgIC8vIEFkZCBhIHRhc2sgdG8gemlwIGFsaWduIGFwcGxpY2F0aW9uIHBhY2thZ2UKLSAgICAgICAgICAgICAgICBkZWYgemlwQWxpZ25UYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoInppcGFsaWduJHt2YXJpYW50RGF0YS5uYW1lfSIsIFppcEFsaWduKQorICAgICAgICAgICAgICAgIGRlZiB6aXBBbGlnblRhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJ6aXBhbGlnbiR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZnVsbE5hbWUuY2FwaXRhbGl6ZSgpfSIsCisgICAgICAgICAgICAgICAgICAgICAgICBaaXBBbGlnbikKICAgICAgICAgICAgICAgICB2YXJpYW50RGF0YS56aXBBbGlnblRhc2sgPSB6aXBBbGlnblRhc2sKIAogICAgICAgICAgICAgICAgIHppcEFsaWduVGFzay5kZXBlbmRzT24gcGFja2FnZUFwcAogICAgICAgICAgICAgICAgIHppcEFsaWduVGFzay5jb252ZW50aW9uTWFwcGluZy5pbnB1dEZpbGUgPSB7IHBhY2thZ2VBcHAub3V0cHV0RmlsZSB9CiAgICAgICAgICAgICAgICAgemlwQWxpZ25UYXNrLmNvbnZlbnRpb25NYXBwaW5nLm91dHB1dEZpbGUgPSB7CiAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHByb2plY3QuYnVpbGREaXIvYXBrLyR7cHJvamVjdC5hcmNoaXZlc0Jhc2VOYW1lfS0ke3ZhcmlhbnREYXRhLmJhc2VOYW1lfS5hcGsiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkcHJvamVjdC5idWlsZERpci9hcGsvJHtwcm9qZWN0LmFyY2hpdmVzQmFzZU5hbWV9LSR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uYmFzZU5hbWV9LmFwayIpCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHppcEFsaWduVGFzay5jb252ZW50aW9uTWFwcGluZy56aXBBbGlnbkV4ZSA9IHsgZ2V0U2RrUGFyc2VyKCkuemlwQWxpZ24gfQogCiAgICAgICAgICAgICAgICAgYXBwVGFzayA9IHppcEFsaWduVGFzawogICAgICAgICAgICAgICAgIG91dHB1dEZpbGVUYXNrID0gemlwQWxpZ25UYXNrCiAgICAgICAgICAgICAgICAgdmFyaWFudERhdGEub3V0cHV0RmlsZSA9IHByb2plY3QuZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICIkcHJvamVjdC5idWlsZERpci9hcGsvJHtwcm9qZWN0LmFyY2hpdmVzQmFzZU5hbWV9LSR7dmFyaWFudERhdGEuYmFzZU5hbWV9LmFwayIpCisgICAgICAgICAgICAgICAgICAgICAgICAiJHByb2plY3QuYnVpbGREaXIvYXBrLyR7cHJvamVjdC5hcmNoaXZlc0Jhc2VOYW1lfS0ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmJhc2VOYW1lfS5hcGsiKQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBBZGQgYSB0YXNrIHRvIGluc3RhbGwgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UKLSAgICAgICAgICAgIGRlZiBpbnN0YWxsVGFzayA9IHByb2plY3QudGFza3MuY3JlYXRlKCJpbnN0YWxsJHt2YXJpYW50RGF0YS5uYW1lfSIsIEluc3RhbGxUYXNrKQorICAgICAgICAgICAgZGVmIGluc3RhbGxUYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICJpbnN0YWxsJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZS5jYXBpdGFsaXplKCl9IiwKKyAgICAgICAgICAgICAgICAgICAgSW5zdGFsbFRhc2spCiAgICAgICAgICAgICBpbnN0YWxsVGFzay5kZXNjcmlwdGlvbiA9ICJJbnN0YWxscyB0aGUgIiArIHZhcmlhbnREYXRhLmRlc2NyaXB0aW9uCiAgICAgICAgICAgICBpbnN0YWxsVGFzay5ncm91cCA9IElOU1RBTExfR1JPVVAKICAgICAgICAgICAgIGluc3RhbGxUYXNrLmRlcGVuZHNPbiBhcHBUYXNrCkBAIC0xMTI3LDcgKzEzNjEsNyBAQAogCiAgICAgICAgIC8vIEFkZCBhbiBhc3NlbWJsZSB0YXNrCiAgICAgICAgIGlmIChhc3NlbWJsZVRhc2sgPT0gbnVsbCkgewotICAgICAgICAgICAgYXNzZW1ibGVUYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoImFzc2VtYmxlJHt2YXJpYW50RGF0YS5uYW1lfSIpCisgICAgICAgICAgICBhc3NlbWJsZVRhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgiYXNzZW1ibGUke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLmNhcGl0YWxpemUoKX0iKQogICAgICAgICAgICAgYXNzZW1ibGVUYXNrLmRlc2NyaXB0aW9uID0gIkFzc2VtYmxlcyB0aGUgIiArIHZhcmlhbnREYXRhLmRlc2NyaXB0aW9uCiAgICAgICAgICAgICBhc3NlbWJsZVRhc2suZ3JvdXAgPSBvcmcuZ3JhZGxlLmFwaS5wbHVnaW5zLkJhc2VQbHVnaW4uQlVJTERfR1JPVVAKICAgICAgICAgfQpAQCAtMTEzNyw3ICsxMzcxLDkgQEAKICAgICAgICAgdmFyaWFudERhdGEub3V0cHV0RmlsZSA9IHsgb3V0cHV0RmlsZVRhc2sub3V0cHV0RmlsZSB9CiAKICAgICAgICAgLy8gYWRkIGFuIHVuaW5zdGFsbCB0YXNrCi0gICAgICAgIGRlZiB1bmluc3RhbGxUYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoInVuaW5zdGFsbCR7dmFyaWFudERhdGEubmFtZX0iLCBVbmluc3RhbGxUYXNrKQorICAgICAgICBkZWYgdW5pbnN0YWxsVGFzayA9IHByb2plY3QudGFza3MuY3JlYXRlKAorICAgICAgICAgICAgICAgICJ1bmluc3RhbGwke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLmNhcGl0YWxpemUoKX0iLAorICAgICAgICAgICAgICAgIFVuaW5zdGFsbFRhc2spCiAgICAgICAgIHVuaW5zdGFsbFRhc2suZGVzY3JpcHRpb24gPSAiVW5pbnN0YWxscyB0aGUgIiArIHZhcmlhbnREYXRhLmRlc2NyaXB0aW9uCiAgICAgICAgIHVuaW5zdGFsbFRhc2suZ3JvdXAgPSBJTlNUQUxMX0dST1VQCiAgICAgICAgIHVuaW5zdGFsbFRhc2sudmFyaWFudCA9IHZhcmlhbnREYXRhCkBAIC0xMTQ3LDYgKzEzODMsMTQ2IEBACiAgICAgICAgIHVuaW5zdGFsbEFsbC5kZXBlbmRzT24gdW5pbnN0YWxsVGFzawogICAgIH0KIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIHByb2d1YXJkaW5nIHRhc2sgZm9yIHRoZSBnaXZlbiBWYXJpYW50LgorICAgICAqIEBwYXJhbSB2YXJpYW50RGF0YSB0aGUgdmFyaWFudCBkYXRhLgorICAgICAqIEBwYXJhbSB0ZXN0ZWRWYXJpYW50RGF0YSBvcHRpb25hbC4gdmFyaWFudCBkYXRhIHJlcHJlc2VudGluZyB0aGUgdGVzdGVkIHZhcmlhbnQsIG51bGwgaWYgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQgaXMgbm90IGEgdGVzdCB2YXJpYW50CisgICAgICogQHJldHVybiBvdXRGaWxlIGZpbGUgb3V0cHV0dGVkIGJ5IHByb2d1YXJkCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwcm90ZWN0ZWQgRmlsZSBjcmVhdGVQcm9ndWFyZFRhc2tzKEBOb25OdWxsIEJhc2VWYXJpYW50RGF0YSB2YXJpYW50RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBCYXNlVmFyaWFudERhdGEgdGVzdGVkVmFyaWFudERhdGEpIHsKKyAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24gdmFyaWFudENvbmZpZyA9IHZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uCisKKyAgICAgICAgZGVmIHByb2d1YXJkVGFzayA9IHByb2plY3QudGFza3MuY3JlYXRlKAorICAgICAgICAgICAgICAgICJwcm9ndWFyZCR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZnVsbE5hbWUuY2FwaXRhbGl6ZSgpfSIsCisgICAgICAgICAgICAgICAgUHJvR3VhcmRUYXNrKQorICAgICAgICBwcm9ndWFyZFRhc2suZGVwZW5kc09uIHZhcmlhbnREYXRhLmphdmFDb21waWxlVGFzaworICAgICAgICBpZiAodGVzdGVkVmFyaWFudERhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvZ3VhcmRUYXNrLmRlcGVuZHNPbiB0ZXN0ZWRWYXJpYW50RGF0YS5wcm9ndWFyZFRhc2sKKyAgICAgICAgfQorCisgICAgICAgIHZhcmlhbnREYXRhLnByb2d1YXJkVGFzayA9IHByb2d1YXJkVGFzaworCisgICAgICAgIC8vIC0tLSBPdXRwdXQgRmlsZSAtLS0KKworICAgICAgICBGaWxlIG91dEZpbGU7CisgICAgICAgIGlmICh2YXJpYW50RGF0YSBpbnN0YW5jZW9mIExpYnJhcnlWYXJpYW50RGF0YSkgeworICAgICAgICAgICAgb3V0RmlsZSA9IHByb2plY3QuZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgIiR7cHJvamVjdC5idWlsZERpcn0vJERJUl9CVU5ETEVTLyR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZGlyTmFtZX0vY2xhc3Nlcy5qYXIiKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0RmlsZSA9IHByb2plY3QuZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgIiR7cHJvamVjdC5idWlsZERpcn0vY2xhc3Nlcy1wcm9ndWFyZC8ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmRpck5hbWV9L2NsYXNzZXMuamFyIikKKyAgICAgICAgfQorCisgICAgICAgIC8vIC0tLSBQcm9ndWFyZCBDb25maWcgLS0tCisKKyAgICAgICAgaWYgKHRlc3RlZFZhcmlhbnREYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGRvbid0IHJlbW92ZSBhbnkgY29kZSBpbiB0ZXN0ZWQgYXBwCisgICAgICAgICAgICBwcm9ndWFyZFRhc2suZG9udHNocmluaygpCisgICAgICAgICAgICBwcm9ndWFyZFRhc2sua2VlcG5hbWVzKCJjbGFzcyAqIGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIikKKyAgICAgICAgICAgIHByb2d1YXJkVGFzay5rZWVwY2xhc3NtZW1iZXJzKCJjbGFzcyAqIGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHtcbiIgKworICAgICAgICAgICAgICAgICAgICAiICAgIHZvaWQgdGVzdCooLi4uKTtcbiIgKworICAgICAgICAgICAgICAgICAgICAifSIpCisKKyAgICAgICAgICAgIC8vIGlucHV0IHRoZSBtYXBwaW5nIGZyb20gdGhlIHRlc3RlZCBhcHAgc28gdGhhdCB3ZSBjYW4gZGVhbCB3aXRoIG9iZnVzY2F0ZWQgY29kZQorICAgICAgICAgICAgcHJvZ3VhcmRUYXNrLmFwcGx5bWFwcGluZygiJHtwcm9qZWN0LmJ1aWxkRGlyfS9wcm9ndWFyZC8ke3Rlc3RlZFZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmRpck5hbWV9L21hcHBpbmcudHh0IikKKworICAgICAgICAgICAgLy8gZm9yIHRlc3RlZCBhcHAsIHdlIG9ubHkgY2FyZSBhYm91dCB0aGVpciBhYXB0IGNvbmZpZyBzaW5jZSB0aGUgYmFzZQorICAgICAgICAgICAgLy8gY29uZmlncyBhcmUgdGhlIHNhbWUgZmlsZXMgYW55d2F5LgorICAgICAgICAgICAgcHJvZ3VhcmRUYXNrLmNvbmZpZ3VyYXRpb24odGVzdGVkVmFyaWFudERhdGEucHJvY2Vzc1Jlc291cmNlc1Rhc2sucHJvZ3VhcmRPdXRwdXRGaWxlKQorICAgICAgICB9CisKKyAgICAgICAgLy8gYWxsIHRoZSBjb25maWcgZmlsZXMgY29taW5nIGZyb20gYnVpbGQgdHlwZSwgcHJvZHVjdCBmbGF2b3JzLgorICAgICAgICBMaXN0PE9iamVjdD4gcHJvZ3VhcmRGaWxlcyA9IHZhcmlhbnRDb25maWcuZ2V0UHJvZ3VhcmRGaWxlcyh0cnVlIC8qaW5jbHVkZUxpYnMqLykKKyAgICAgICAgZm9yIChPYmplY3QgcHJvZ3VhcmRGaWxlIDogcHJvZ3VhcmRGaWxlcykgeworICAgICAgICAgICAgcHJvZ3VhcmRUYXNrLmNvbmZpZ3VyYXRpb24ocHJvZ3VhcmRGaWxlKQorICAgICAgICB9CisKKyAgICAgICAgLy8gYWxzbyB0aGUgY29uZmlnIGZpbGUgb3V0cHV0IGJ5IGFhcHQKKyAgICAgICAgcHJvZ3VhcmRUYXNrLmNvbmZpZ3VyYXRpb24odmFyaWFudERhdGEucHJvY2Vzc1Jlc291cmNlc1Rhc2sucHJvZ3VhcmRPdXRwdXRGaWxlKQorCisgICAgICAgIC8vIC0tLSBJbkphcnMgLyBMaWJyYXJ5SmFycyAtLS0KKworICAgICAgICBMaXN0PEZpbGU+IHBhY2thZ2VkSmFycyA9IGdldEFuZHJvaWRCdWlsZGVyKHZhcmlhbnREYXRhKS5nZXRQYWNrYWdlZEphcnModmFyaWFudENvbmZpZykKKworICAgICAgICBpZiAodmFyaWFudERhdGEgaW5zdGFuY2VvZiBMaWJyYXJ5VmFyaWFudERhdGEpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IHZhcmlhbnRDb25maWcuZ2V0UGFja2FnZUZyb21NYW5pZmVzdCgpCisgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgbWFuaWZlc3QiLCBudWxsKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywgJy8nKTsKKworICAgICAgICAgICAgLy8gaW5qYXI6IHRoZSBjb21waWxhdGlvbiBvdXRwdXQKKyAgICAgICAgICAgIC8vIGV4Y2x1ZGUgUiBmaWxlcyBhbmQgc3VjaCBmcm9tIG91dHB1dAorICAgICAgICAgICAgU3RyaW5nIGV4Y2x1ZGUgPSAnIScgKyBwYWNrYWdlTmFtZSArICIvUi5jbGFzcyIKKyAgICAgICAgICAgIGV4Y2x1ZGUgKz0gKCcsICEnICsgcGFja2FnZU5hbWUgKyAiL1JcJCouY2xhc3MiKQorICAgICAgICAgICAgZXhjbHVkZSArPSAoJywgIScgKyBwYWNrYWdlTmFtZSArICIvTWFuaWZlc3QuY2xhc3MiKQorICAgICAgICAgICAgZXhjbHVkZSArPSAoJywgIScgKyBwYWNrYWdlTmFtZSArICIvTWFuaWZlc3RcJCouY2xhc3MiKQorICAgICAgICAgICAgZXhjbHVkZSArPSAoJywgIScgKyBwYWNrYWdlTmFtZSArICIvQnVpbGRDb25maWcuY2xhc3MiKQorICAgICAgICAgICAgcHJvZ3VhcmRUYXNrLmluamFycyh2YXJpYW50RGF0YS5qYXZhQ29tcGlsZVRhc2suZGVzdGluYXRpb25EaXIsIGZpbHRlcjogZXhjbHVkZSkKKworICAgICAgICAgICAgLy8gaW5jbHVkZSBSIGZpbGVzIGFuZCBzdWNoIGZvciBjb21waWxhdGlvbgorICAgICAgICAgICAgU3RyaW5nIGluY2x1ZGUgPSBleGNsdWRlLnJlcGxhY2UoJyEnLCAnJykKKyAgICAgICAgICAgIHByb2d1YXJkVGFzay5saWJyYXJ5amFycyh2YXJpYW50RGF0YS5qYXZhQ29tcGlsZVRhc2suZGVzdGluYXRpb25EaXIsIGZpbHRlcjogaW5jbHVkZSkKKworICAgICAgICAgICAgLy8gaW5qYXI6IHRoZSBsb2NhbCBkZXBlbmRlbmNpZXMsIGZpbHRlciBvdXQgbG9jYWwgamFycyBmcm9tIHBhY2thZ2VkSmFycworICAgICAgICAgICAgT2JqZWN0W10gamFycyA9IExpYnJhcnlQbHVnaW4uZ2V0TG9jYWxKYXJGaWxlTGlzdCh2YXJpYW50RGF0YS52YXJpYW50RGVwZW5kZW5jeSkKKyAgICAgICAgICAgIGZvciAoT2JqZWN0IGluSmFyIDogamFycykgeworICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlZEphcnMuY29udGFpbnMoaW5KYXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VkSmFycy5yZW1vdmUoaW5KYXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm9ndWFyZFRhc2suaW5qYXJzKChGaWxlKSBpbkphciwgZmlsdGVyOiAnIU1FVEEtSU5GL01BTklGRVNULk1GJykKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbGliamFyOiB0aGUgbGlicmFyeSBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIGZvciAoRmlsZSBsaWJKYXIgOiBwYWNrYWdlZEphcnMpIHsKKyAgICAgICAgICAgICAgICBwcm9ndWFyZFRhc2subGlicmFyeWphcnMobGliSmFyLCBmaWx0ZXI6ICchTUVUQS1JTkYvTUFOSUZFU1QuTUYnKQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBlbnN1cmUgbG9jYWwgamFycyBrZWVwIHRoZWlyIHBhY2thZ2UgbmFtZXMKKyAgICAgICAgICAgIHByb2d1YXJkVGFzay5rZWVwcGFja2FnZW5hbWVzKCkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGluamFyOiB0aGUgY29tcGlsYXRpb24gb3V0cHV0CisgICAgICAgICAgICBwcm9ndWFyZFRhc2suaW5qYXJzKHZhcmlhbnREYXRhLmphdmFDb21waWxlVGFzay5kZXN0aW5hdGlvbkRpcikKKworICAgICAgICAgICAgLy8gaW5qYXI6IHRoZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIGZvciAoRmlsZSBpbkphciA6IHBhY2thZ2VkSmFycykgeworICAgICAgICAgICAgICAgIHByb2d1YXJkVGFzay5pbmphcnMoaW5KYXIsIGZpbHRlcjogJyFNRVRBLUlORi9NQU5JRkVTVC5NRicpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBsaWJyYXJ5SmFyczogdGhlIHJ1bnRpbWUgamFycworICAgICAgICBmb3IgKFN0cmluZyBydW50aW1lSmFyIDogZ2V0UnVudGltZUphckxpc3QoKSkgeworICAgICAgICAgICAgcHJvZ3VhcmRUYXNrLmxpYnJhcnlqYXJzKHJ1bnRpbWVKYXIpCisgICAgICAgIH0KKworICAgICAgICBpZiAodGVzdGVkVmFyaWFudERhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaW5wdXQgdGhlIHRlc3RlZCBhcHAgYXMgbGlicmFyeQorICAgICAgICAgICAgcHJvZ3VhcmRUYXNrLmxpYnJhcnlqYXJzKHRlc3RlZFZhcmlhbnREYXRhLmphdmFDb21waWxlVGFzay5kZXN0aW5hdGlvbkRpcikKKyAgICAgICAgICAgIC8vIGluY2x1ZGluZyBpdHMgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICBMaXN0PEZpbGU+IHRlc3RlZFBhY2thZ2VkSmFycyA9IGdldEFuZHJvaWRCdWlsZGVyKHRlc3RlZFZhcmlhbnREYXRhKS5nZXRQYWNrYWdlZEphcnModGVzdGVkVmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICBmb3IgKEZpbGUgaW5KYXIgOiB0ZXN0ZWRQYWNrYWdlZEphcnMpIHsKKyAgICAgICAgICAgICAgICBwcm9ndWFyZFRhc2subGlicmFyeWphcnMoaW5KYXIsIGZpbHRlcjogJyFNRVRBLUlORi9NQU5JRkVTVC5NRicpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAtLS0gT3V0IGZpbGVzIC0tLQorCisgICAgICAgIHByb2d1YXJkVGFzay5vdXRqYXJzKG91dEZpbGUpCisKKyAgICAgICAgcHJvZ3VhcmRUYXNrLmR1bXAoIiR7cHJvamVjdC5idWlsZERpcn0vcHJvZ3VhcmQvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfS9kdW1wLnR4dCIpCisgICAgICAgIHByb2d1YXJkVGFzay5wcmludHNlZWRzKAorICAgICAgICAgICAgICAgICIke3Byb2plY3QuYnVpbGREaXJ9L3Byb2d1YXJkLyR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZGlyTmFtZX0vc2VlZHMudHh0IikKKyAgICAgICAgcHJvZ3VhcmRUYXNrLnByaW50dXNhZ2UoCisgICAgICAgICAgICAgICAgIiR7cHJvamVjdC5idWlsZERpcn0vcHJvZ3VhcmQvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfS91c2FnZS50eHQiKQorICAgICAgICBwcm9ndWFyZFRhc2sucHJpbnRtYXBwaW5nKAorICAgICAgICAgICAgICAgICIke3Byb2plY3QuYnVpbGREaXJ9L3Byb2d1YXJkLyR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZGlyTmFtZX0vbWFwcGluZy50eHQiKQorCisgICAgICAgIHJldHVybiBvdXRGaWxlCisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlcG9ydFRhc2tzKCkgewogICAgICAgICBkZWYgZGVwZW5kZW5jeVJlcG9ydFRhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgiYW5kcm9pZERlcGVuZGVuY2llcyIsIERlcGVuZGVuY3lSZXBvcnRUYXNrKQogICAgICAgICBkZXBlbmRlbmN5UmVwb3J0VGFzay5zZXREZXNjcmlwdGlvbigiRGlzcGxheXMgdGhlIEFuZHJvaWQgZGVwZW5kZW5jaWVzIG9mIHRoZSBwcm9qZWN0IikKQEAgLTExNTksMTYgKzE1MzUsMTcgQEAKICAgICAgICAgc2lnbmluZ1JlcG9ydFRhc2suc2V0R3JvdXAoIkFuZHJvaWQiKQogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFuY2hvclRhc2tzKEBOb25OdWxsIEJhc2VWYXJpYW50RGF0YSB2YXJpYW50RGF0YSkgeworICAgICAgICB2YXJpYW50RGF0YS5wcmVCdWlsZFRhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAicHJlJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZS5jYXBpdGFsaXplKCl9QnVpbGQiKQorICAgICAgICB2YXJpYW50RGF0YS5wcmVCdWlsZFRhc2suZGVwZW5kc09uIG1haW5QcmVCdWlsZAogCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1RBUlQgREVQRU5ERU5DWSBTVFVGRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByZXBhcmVEZXBlbmRlbmNpZXNUYXNrKEBOb25OdWxsIEJhc2VWYXJpYW50RGF0YSB2YXJpYW50RGF0YSkgewotICAgICAgICBkZWYgcHJlcGFyZURlcGVuZGVuY2llc1Rhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgicHJlcGFyZSR7dmFyaWFudERhdGEubmFtZX1EZXBlbmRlbmNpZXMiLAorICAgICAgICBkZWYgcHJlcGFyZURlcGVuZGVuY2llc1Rhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAicHJlcGFyZSR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZnVsbE5hbWUuY2FwaXRhbGl6ZSgpfURlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgUHJlcGFyZURlcGVuZGVuY2llc1Rhc2spCisKICAgICAgICAgdmFyaWFudERhdGEucHJlcGFyZURlcGVuZGVuY2llc1Rhc2sgPSBwcmVwYXJlRGVwZW5kZW5jaWVzVGFzaworICAgICAgICBwcmVwYXJlRGVwZW5kZW5jaWVzVGFzay5kZXBlbmRzT24gdmFyaWFudERhdGEucHJlQnVpbGRUYXNrCiAKICAgICAgICAgcHJlcGFyZURlcGVuZGVuY2llc1Rhc2sucGx1Z2luID0gdGhpcwogICAgICAgICBwcmVwYXJlRGVwZW5kZW5jaWVzVGFzay52YXJpYW50ID0gdmFyaWFudERhdGEKQEAgLTExNzksMTkgKzE1NTYsMTM1IEBACiAgICAgICAgIHByZXBhcmVEZXBlbmRlbmNpZXNUYXNrLmFkZENoZWNrZXIoY29uZmlndXJhdGlvbkRlcGVuZGVuY2llcy5jaGVja2VyKQogCiAgICAgICAgIGZvciAoTGlicmFyeURlcGVuZGVuY3lJbXBsIGxpYiA6IGNvbmZpZ3VyYXRpb25EZXBlbmRlbmNpZXMubGlicmFyaWVzKSB7Ci0gICAgICAgICAgICBhZGREZXBlbmRlbmN5VG9QcmVwYXJlVGFzayhwcmVwYXJlRGVwZW5kZW5jaWVzVGFzaywgbGliKQorICAgICAgICAgICAgYWRkRGVwZW5kZW5jeVRvUHJlcGFyZVRhc2sodmFyaWFudERhdGEsIHByZXBhcmVEZXBlbmRlbmNpZXNUYXNrLCBsaWIpCiAgICAgICAgIH0KKworICAgICAgICAvLyBhbHNvIGNyZWF0ZSBzb3VyY2VHZW5UYXNrCisgICAgICAgIHZhcmlhbnREYXRhLnNvdXJjZUdlblRhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAiZ2VuZXJhdGUke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLmNhcGl0YWxpemUoKX1Tb3VyY2VzIikKICAgICB9CiAKLSAgICBkZWYgYWRkRGVwZW5kZW5jeVRvUHJlcGFyZVRhc2soUHJlcGFyZURlcGVuZGVuY2llc1Rhc2sgcHJlcGFyZURlcGVuZGVuY2llc1Rhc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpYnJhcnlEZXBlbmRlbmN5SW1wbCBsaWIpIHsKKworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQXJ0aWZhY3RNZXRhRGF0YT4gZXh0cmFBcnRpZmFjdE1hcCA9IE1hcHMubmV3SGFzaE1hcCgpCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0TXVsdGltYXA8U3RyaW5nLCBBbmRyb2lkQXJ0aWZhY3Q+IGV4dHJhQW5kcm9pZEFydGlmYWN0cyA9IEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZSgpCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0TXVsdGltYXA8U3RyaW5nLCBKYXZhQXJ0aWZhY3Q+IGV4dHJhSmF2YUFydGlmYWN0cyA9IEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZSgpCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0TXVsdGltYXA8U3RyaW5nLCBTb3VyY2VQcm92aWRlckNvbnRhaW5lcj4gZXh0cmFWYXJpYW50U291cmNlUHJvdmlkZXJzID0gQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCkKKyAgICBwcml2YXRlIGZpbmFsIExpc3RNdWx0aW1hcDxTdHJpbmcsIFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyPiBleHRyYUJ1aWxkVHlwZVNvdXJjZVByb3ZpZGVycyA9IEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZSgpCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0TXVsdGltYXA8U3RyaW5nLCBTb3VyY2VQcm92aWRlckNvbnRhaW5lcj4gZXh0cmFQcm9kdWN0Rmxhdm9yU291cmNlUHJvdmlkZXJzID0gQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCkKKyAgICBwcml2YXRlIGZpbmFsIExpc3RNdWx0aW1hcDxTdHJpbmcsIFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyPiBleHRyYU11bHRpRmxhdm9yU291cmNlUHJvdmlkZXJzID0gQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCkKKworCisgICAgcHVibGljIENvbGxlY3Rpb248QXJ0aWZhY3RNZXRhRGF0YT4gZ2V0RXh0cmFBcnRpZmFjdHMoKSB7CisgICAgICAgIHJldHVybiBleHRyYUFydGlmYWN0TWFwLnZhbHVlcygpCisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb248QW5kcm9pZEFydGlmYWN0PiBnZXRFeHRyYUFuZHJvaWRBcnRpZmFjdHMoQE5vbk51bGwgU3RyaW5nIHZhcmlhbnROYW1lKSB7CisgICAgICAgIHJldHVybiBleHRyYUFuZHJvaWRBcnRpZmFjdHMuZ2V0KHZhcmlhbnROYW1lKQorICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uPEphdmFBcnRpZmFjdD4gZ2V0RXh0cmFKYXZhQXJ0aWZhY3RzKEBOb25OdWxsIFN0cmluZyB2YXJpYW50TmFtZSkgeworICAgICAgICByZXR1cm4gZXh0cmFKYXZhQXJ0aWZhY3RzLmdldCh2YXJpYW50TmFtZSkKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTb3VyY2VQcm92aWRlckNvbnRhaW5lcj4gZ2V0RXh0cmFWYXJpYW50U291cmNlUHJvdmlkZXJzKEBOb25OdWxsIFN0cmluZyB2YXJpYW50TmFtZSkgeworICAgICAgICByZXR1cm4gZXh0cmFWYXJpYW50U291cmNlUHJvdmlkZXJzLmdldCh2YXJpYW50TmFtZSkKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTb3VyY2VQcm92aWRlckNvbnRhaW5lcj4gZ2V0RXh0cmFGbGF2b3JTb3VyY2VQcm92aWRlcnMoQE5vbk51bGwgU3RyaW5nIGZsYXZvck5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGV4dHJhUHJvZHVjdEZsYXZvclNvdXJjZVByb3ZpZGVycy5nZXQoZmxhdm9yTmFtZSkKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTb3VyY2VQcm92aWRlckNvbnRhaW5lcj4gZ2V0RXh0cmFCdWlsZFR5cGVTb3VyY2VQcm92aWRlcnMoQE5vbk51bGwgU3RyaW5nIGJ1aWxkVHlwZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGV4dHJhQnVpbGRUeXBlU291cmNlUHJvdmlkZXJzLmdldChidWlsZFR5cGVOYW1lKQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQXJ0aWZhY3RUeXBlKEBOb25OdWxsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcnRpZmFjdFR5cGUpIHsKKworICAgICAgICBpZiAoZXh0cmFBcnRpZmFjdE1hcC5nZXQobmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJ0aWZhY3Qgd2l0aCBuYW1lICRuYW1lIGFscmVhZHkgcmVnaXN0ZXJlZC4iKQorICAgICAgICB9CisKKyAgICAgICAgZXh0cmFBcnRpZmFjdE1hcC5wdXQobmFtZSwgbmV3IEFydGlmYWN0TWV0YURhdGFJbXBsKG5hbWUsIGlzVGVzdCwgYXJ0aWZhY3RUeXBlKSkKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckJ1aWxkVHlwZVNvdXJjZVByb3ZpZGVyKEBOb25OdWxsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgQnVpbGRUeXBlIGJ1aWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyKSB7CisgICAgICAgIGlmIChleHRyYUFydGlmYWN0TWFwLmdldChuYW1lKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQXJ0aWZhY3Qgd2l0aCBuYW1lICRuYW1lIGlzIG5vdCB5ZXQgcmVnaXN0ZXJlZC4gVXNlIHJlZ2lzdGVyQXJ0aWZhY3RUeXBlKCkiKQorICAgICAgICB9CisKKyAgICAgICAgZXh0cmFCdWlsZFR5cGVTb3VyY2VQcm92aWRlcnMucHV0KGJ1aWxkVHlwZS5uYW1lLAorICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0U291cmNlUHJvdmlkZXJDb250YWluZXIobmFtZSwgc291cmNlUHJvdmlkZXIpKQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJQcm9kdWN0Rmxhdm9yU291cmNlUHJvdmlkZXIoQE5vbk51bGwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgUHJvZHVjdEZsYXZvciBwcm9kdWN0Rmxhdm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyKSB7CisgICAgICAgIGlmIChleHRyYUFydGlmYWN0TWFwLmdldChuYW1lKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQXJ0aWZhY3Qgd2l0aCBuYW1lICRuYW1lIGlzIG5vdCB5ZXQgcmVnaXN0ZXJlZC4gVXNlIHJlZ2lzdGVyQXJ0aWZhY3RUeXBlKCkiKQorICAgICAgICB9CisKKyAgICAgICAgZXh0cmFQcm9kdWN0Rmxhdm9yU291cmNlUHJvdmlkZXJzLnB1dChwcm9kdWN0Rmxhdm9yLm5hbWUsCisgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRTb3VyY2VQcm92aWRlckNvbnRhaW5lcihuYW1lLCBzb3VyY2VQcm92aWRlcikpCisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck11bHRpRmxhdm9yU291cmNlUHJvdmlkZXIoQE5vbk51bGwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBmbGF2b3JOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBTb3VyY2VQcm92aWRlciBzb3VyY2VQcm92aWRlcikgeworICAgICAgICBpZiAoZXh0cmFBcnRpZmFjdE1hcC5nZXQobmFtZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkFydGlmYWN0IHdpdGggbmFtZSAkbmFtZSBpcyBub3QgeWV0IHJlZ2lzdGVyZWQuIFVzZSByZWdpc3RlckFydGlmYWN0VHlwZSgpIikKKyAgICAgICAgfQorCisgICAgICAgIGV4dHJhTXVsdGlGbGF2b3JTb3VyY2VQcm92aWRlcnMucHV0KGZsYXZvck5hbWUsCisgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRTb3VyY2VQcm92aWRlckNvbnRhaW5lcihuYW1lLCBzb3VyY2VQcm92aWRlcikpCisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJKYXZhQXJ0aWZhY3QoCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIEBOb25OdWxsIEJhc2VWYXJpYW50IHZhcmlhbnQsCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgYXNzZW1ibGVUYXNrTmFtZSwKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBqYXZhQ29tcGlsZVRhc2tOYW1lLAorICAgICAgICAgICAgQE5vbk51bGwgRmlsZSBjbGFzc2VzRm9sZGVyLAorICAgICAgICAgICAgQE51bGxhYmxlIFNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyKSB7CisgICAgICAgIEFydGlmYWN0TWV0YURhdGEgYXJ0aWZhY3RNZXRhRGF0YSA9IGV4dHJhQXJ0aWZhY3RNYXAuZ2V0KG5hbWUpCisgICAgICAgIGlmIChhcnRpZmFjdE1ldGFEYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJBcnRpZmFjdCB3aXRoIG5hbWUgJG5hbWUgaXMgbm90IHlldCByZWdpc3RlcmVkLiBVc2UgcmVnaXN0ZXJBcnRpZmFjdFR5cGUoKSIpCisgICAgICAgIH0KKyAgICAgICAgaWYgKGFydGlmYWN0TWV0YURhdGEudHlwZSAhPSBBcnRpZmFjdE1ldGFEYXRhLlRZUEVfSkFWQSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkFydGlmYWN0IHdpdGggbmFtZSAkbmFtZSBpcyBub3Qgb2YgdHlwZSBKQVZBIikKKyAgICAgICAgfQorCisgICAgICAgIEphdmFBcnRpZmFjdCBhcnRpZmFjdCA9IG5ldyBKYXZhQXJ0aWZhY3RJbXBsKAorICAgICAgICAgICAgICAgIG5hbWUsIGFzc2VtYmxlVGFza05hbWUsIGphdmFDb21waWxlVGFza05hbWUsIGNsYXNzZXNGb2xkZXIsCisgICAgICAgICAgICAgICAgbnVsbCwgc291cmNlUHJvdmlkZXIsIG51bGwpCisgICAgICAgIGV4dHJhSmF2YUFydGlmYWN0cy5wdXQodmFyaWFudC5uYW1lLCBhcnRpZmFjdCkKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTVEFSVCBERVBFTkRFTkNZIFNUVUZGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBhZGREZXBlbmRlbmN5VG9QcmVwYXJlVGFzayhATm9uTnVsbCBCYXNlVmFyaWFudERhdGEgdmFyaWFudERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFByZXBhcmVEZXBlbmRlbmNpZXNUYXNrIHByZXBhcmVEZXBlbmRlbmNpZXNUYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBMaWJyYXJ5RGVwZW5kZW5jeUltcGwgbGliKSB7CiAgICAgICAgIGRlZiBwcmVwYXJlTGliVGFzayA9IHByZXBhcmVUYXNrTWFwLmdldChsaWIpCiAgICAgICAgIGlmIChwcmVwYXJlTGliVGFzayAhPSBudWxsKSB7CiAgICAgICAgICAgICBwcmVwYXJlRGVwZW5kZW5jaWVzVGFzay5kZXBlbmRzT24gcHJlcGFyZUxpYlRhc2sKKyAgICAgICAgICAgIHByZXBhcmVMaWJUYXNrLmRlcGVuZHNPbiB2YXJpYW50RGF0YS5wcmVCdWlsZFRhc2sKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoTGlicmFyeURlcGVuZGVuY3lJbXBsIGNoaWxkTGliIDogbGliLmRlcGVuZGVuY2llcykgewotICAgICAgICAgICAgYWRkRGVwZW5kZW5jeVRvUHJlcGFyZVRhc2socHJlcGFyZURlcGVuZGVuY2llc1Rhc2ssIGNoaWxkTGliKQorICAgICAgICAgICAgYWRkRGVwZW5kZW5jeVRvUHJlcGFyZVRhc2sodmFyaWFudERhdGEsIHByZXBhcmVEZXBlbmRlbmNpZXNUYXNrLCBjaGlsZExpYikKICAgICAgICAgfQogICAgIH0KIApAQCAtMTI0NiwxNCArMTczOSwyMyBAQAogCiAgICAgICAgIHZhcmlhbnREZXBzLmNoZWNrZXIgPSBuZXcgRGVwZW5kZW5jeUNoZWNrZXIodmFyaWFudERlcHMsIGxvZ2dlcikKIAorICAgICAgICBTZXQ8U3RyaW5nPiBjdXJyZW50VW5yZXNvbHZlZERlcGVuZGVuY2llcyA9IFNldHMubmV3SGFzaFNldCgpCisKICAgICAgICAgLy8gVE9ETyAtIGRlZmVyIGRvd25sb2FkaW5nIHVudGlsIHJlcXVpcmVkIC0tIFRoaXMgaXMgaGFyZCB0byBkbyBhcyB3ZSBuZWVkIHRoZSBpbmZvIHRvIGJ1aWxkIHRoZSB2YXJpYW50IGNvbmZpZy4KICAgICAgICAgTGlzdDxMaWJyYXJ5RGVwZW5kZW5jeUltcGw+IGJ1bmRsZXMgPSBbXQogICAgICAgICBMaXN0PEphckRlcGVuZGVuY3k+IGphcnMgPSBbXQogICAgICAgICBMaXN0PEphckRlcGVuZGVuY3k+IGxvY2FsSmFycyA9IFtdCiAgICAgICAgIGNvbGxlY3RBcnRpZmFjdHMoY29tcGlsZUNsYXNzcGF0aCwgYXJ0aWZhY3RzKQotICAgICAgICBjb21waWxlQ2xhc3NwYXRoLmluY29taW5nLnJlc29sdXRpb25SZXN1bHQucm9vdC5kZXBlbmRlbmNpZXMuZWFjaCB7IFJlc29sdmVkRGVwZW5kZW5jeVJlc3VsdCBkZXAgLT4KLSAgICAgICAgICAgIGFkZERlcGVuZGVuY3koZGVwLnNlbGVjdGVkLCB2YXJpYW50RGVwcywgYnVuZGxlcywgamFycywgbW9kdWxlcywKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RzLCByZXZlcnNlTWFwKQorICAgICAgICBkZWYgZGVwZW5kZW5jaWVzID0gY29tcGlsZUNsYXNzcGF0aC5pbmNvbWluZy5yZXNvbHV0aW9uUmVzdWx0LnJvb3QuZGVwZW5kZW5jaWVzCisgICAgICAgIGRlcGVuZGVuY2llcy5lYWNoIHsgRGVwZW5kZW5jeVJlc3VsdCBkZXAgLT4KKyAgICAgICAgICAgIGlmIChkZXAgaW5zdGFuY2VvZiBSZXNvbHZlZERlcGVuZGVuY3lSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBhZGREZXBlbmRlbmN5KGRlcC5zZWxlY3RlZCwgdmFyaWFudERlcHMsIGJ1bmRsZXMsIGphcnMsIG1vZHVsZXMsIGFydGlmYWN0cywgcmV2ZXJzZU1hcCkKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVwIGluc3RhbmNlb2YgVW5yZXNvbHZlZERlcGVuZGVuY3lSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBkZWYgYXR0ZW1wdGVkID0gZGVwLmF0dGVtcHRlZDsKKyAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFVucmVzb2x2ZWREZXBlbmRlbmNpZXMuYWRkKGF0dGVtcHRlZC50b1N0cmluZygpKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIGFsc28gbmVlZCB0byBwcm9jZXNzIGxvY2FsIGphciBmaWxlcywgYXMgdGhleSBhcmUgbm90IHByb2Nlc3NlZCBieSB0aGUKQEAgLTEyNzMsMjEgKzE3NzUsMjYgQEAKICAgICAgICAgLy8gaW4gY29tcGlsZSBhbmQgcmVtb3ZlIGFsbCBkZXBlbmRlbmNpZXMgYWxyZWFkeSBpbiBjb21waWxlIHRvIGdldCBwYWNrYWdlLW9ubHkgamFyCiAgICAgICAgIC8vIGZpbGVzLgogICAgICAgICBDb25maWd1cmF0aW9uIHBhY2thZ2VDbGFzc3BhdGggPSB2YXJpYW50RGVwcy5wYWNrYWdlQ29uZmlndXJhdGlvbgotICAgICAgICBTZXQ8RmlsZT4gY29tcGlsZUZpbGVzID0gY29tcGlsZUNsYXNzcGF0aC5maWxlcwotICAgICAgICBTZXQ8RmlsZT4gcGFja2FnZUZpbGVzID0gcGFja2FnZUNsYXNzcGF0aC5maWxlcwogCi0gICAgICAgIGZvciAoRmlsZSBmIDogcGFja2FnZUZpbGVzKSB7Ci0gICAgICAgICAgICBpZiAoY29tcGlsZUZpbGVzLmNvbnRhaW5zKGYpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb21waWxlQ2xhc3NwYXRoLnJlc29sdmVkQ29uZmlndXJhdGlvbi5oYXNFcnJvcigpKSB7CisgICAgICAgICAgICBTZXQ8RmlsZT4gY29tcGlsZUZpbGVzID0gY29tcGlsZUNsYXNzcGF0aC5maWxlcworICAgICAgICAgICAgU2V0PEZpbGU+IHBhY2thZ2VGaWxlcyA9IHBhY2thZ2VDbGFzc3BhdGguZmlsZXMKIAotICAgICAgICAgICAgaWYgKGYuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXIiKSkgewotICAgICAgICAgICAgICAgIGphcnMuYWRkKG5ldyBKYXJEZXBlbmRlbmN5KGYsIGZhbHNlIC8qY29tcGlsZWQqLywgdHJ1ZSAvKnBhY2thZ2VkKi8pKQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUGFja2FnZS1vbmx5IGRlcGVuZGVuY3kgJyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZi5hYnNvbHV0ZVBhdGggKwotICAgICAgICAgICAgICAgICAgICAgICAgIicgaXMgbm90IHN1cHBvcnRlZCIpCisgICAgICAgICAgICBmb3IgKEZpbGUgZiA6IHBhY2thZ2VGaWxlcykgeworICAgICAgICAgICAgICAgIGlmIChjb21waWxlRmlsZXMuY29udGFpbnMoZikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphciIpKSB7CisgICAgICAgICAgICAgICAgICAgIGphcnMuYWRkKG5ldyBKYXJEZXBlbmRlbmN5KGYsIGZhbHNlIC8qY29tcGlsZWQqLywgdHJ1ZSAvKnBhY2thZ2VkKi8pKQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQYWNrYWdlLW9ubHkgZGVwZW5kZW5jeSAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5hYnNvbHV0ZVBhdGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGlzIG5vdCBzdXBwb3J0ZWQiKQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghY3VycmVudFVucmVzb2x2ZWREZXBlbmRlbmNpZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB1bnJlc29sdmVkRGVwZW5kZW5jaWVzLmFkZEFsbChjdXJyZW50VW5yZXNvbHZlZERlcGVuZGVuY2llcykKICAgICAgICAgfQogCiAgICAgICAgIHZhcmlhbnREZXBzLmFkZExpYnJhcmllcyhidW5kbGVzKQpAQCAtMTMwOCw3ICsxODE1LDE1IEBACiAKICAgICBzdGF0aWMgZGVmIGNvbGxlY3RBcnRpZmFjdHMoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBNYXA8TW9kdWxlVmVyc2lvbklkZW50aWZpZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxSZXNvbHZlZEFydGlmYWN0Pj4gYXJ0aWZhY3RzKSB7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24ucmVzb2x2ZWRDb25maWd1cmF0aW9uLnJlc29sdmVkQXJ0aWZhY3RzLmVhY2ggeyBSZXNvbHZlZEFydGlmYWN0IGFydGlmYWN0IC0+CisgICAgICAgIGJvb2xlYW4gYnVpbGRNb2RlbE9ubHkgPSBCb29sZWFuLmdldEJvb2xlYW4oQW5kcm9pZFByb2plY3QuQlVJTERfTU9ERUxfT05MWV9TWVNURU1fUFJPUEVSVFkpOworICAgICAgICBkZWYgYWxsQXJ0aWZhY3RzCisgICAgICAgIGlmIChidWlsZE1vZGVsT25seSkgeworICAgICAgICAgICAgYWxsQXJ0aWZhY3RzID0gY29uZmlndXJhdGlvbi5yZXNvbHZlZENvbmZpZ3VyYXRpb24ubGVuaWVudENvbmZpZ3VyYXRpb24uZ2V0QXJ0aWZhY3RzKFNwZWNzLnNhdGlzZnlBbGwoKSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFsbEFydGlmYWN0cyA9IGNvbmZpZ3VyYXRpb24ucmVzb2x2ZWRDb25maWd1cmF0aW9uLnJlc29sdmVkQXJ0aWZhY3RzCisgICAgICAgIH0KKworICAgICAgICBhbGxBcnRpZmFjdHMuZWFjaCB7IFJlc29sdmVkQXJ0aWZhY3QgYXJ0aWZhY3QgLT4KICAgICAgICAgICAgIGRlZiBpZCA9IGFydGlmYWN0Lm1vZHVsZVZlcnNpb24uaWQKICAgICAgICAgICAgIExpc3Q8UmVzb2x2ZWRBcnRpZmFjdD4gbW9kdWxlQXJ0aWZhY3RzID0gYXJ0aWZhY3RzW2lkXQogICAgICAgICAgICAgaWYgKG1vZHVsZUFydGlmYWN0cyA9PSBudWxsKSB7CkBAIC0xMzM3LDkgKzE4NTIsMTIgQEAKICAgICAgICAgICAgIG1vZHVsZXNbaWRdID0gYnVuZGxlc0ZvclRoaXNNb2R1bGUKIAogICAgICAgICAgICAgZGVmIG5lc3RlZEJ1bmRsZXMgPSBbXQotICAgICAgICAgICAgbW9kdWxlVmVyc2lvbi5kZXBlbmRlbmNpZXMuZWFjaCB7IFJlc29sdmVkRGVwZW5kZW5jeVJlc3VsdCBkZXAgLT4KLSAgICAgICAgICAgICAgICBhZGREZXBlbmRlbmN5KGRlcC5zZWxlY3RlZCwgY29uZmlnRGVwZW5kZW5jaWVzLCBuZXN0ZWRCdW5kbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgamFycywgbW9kdWxlcywgYXJ0aWZhY3RzLCByZXZlcnNlTWFwKQorICAgICAgICAgICAgZGVmIGRlcGVuZGVuY2llcyA9IG1vZHVsZVZlcnNpb24uZGVwZW5kZW5jaWVzCisgICAgICAgICAgICBkZXBlbmRlbmNpZXMuZWFjaCB7IERlcGVuZGVuY3lSZXN1bHQgZGVwIC0+CisgICAgICAgICAgICAgICAgaWYgKGRlcCBpbnN0YW5jZW9mIFJlc29sdmVkRGVwZW5kZW5jeVJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICBhZGREZXBlbmRlbmN5KGRlcC5zZWxlY3RlZCwgY29uZmlnRGVwZW5kZW5jaWVzLCBuZXN0ZWRCdW5kbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphcnMsIG1vZHVsZXMsIGFydGlmYWN0cywgcmV2ZXJzZU1hcCkKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGRlZiBtb2R1bGVBcnRpZmFjdHMgPSBhcnRpZmFjdHNbaWRdCkBAIC0xNDQzLDE3ICsxOTYxLDI1IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExvY2FsVmVyc2lvbigpIHsKLSAgICAgICAgQ2xhc3MgY2xhenogPSBCYXNlUGx1Z2luLmNsYXNzCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGF6ei5nZXRTaW1wbGVOYW1lKCkgKyAiLmNsYXNzIgotICAgICAgICBTdHJpbmcgY2xhc3NQYXRoID0gY2xhenouZ2V0UmVzb3VyY2UoY2xhc3NOYW1lKS50b1N0cmluZygpCi0gICAgICAgIGlmICghY2xhc3NQYXRoLnN0YXJ0c1dpdGgoImphciIpKSB7Ci0gICAgICAgICAgICAvLyBDbGFzcyBub3QgZnJvbSBKQVIsIHVubGlrZWx5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbAorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBCYXNlUGx1Z2luLmNsYXNzCisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2xhenouZ2V0U2ltcGxlTmFtZSgpICsgIi5jbGFzcyIKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc1BhdGggPSBjbGF6ei5nZXRSZXNvdXJjZShjbGFzc05hbWUpLnRvU3RyaW5nKCkKKyAgICAgICAgICAgIGlmICghY2xhc3NQYXRoLnN0YXJ0c1dpdGgoImphciIpKSB7CisgICAgICAgICAgICAgICAgLy8gQ2xhc3Mgbm90IGZyb20gSkFSLCB1bmxpa2VseQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsCisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgbWFuaWZlc3RQYXRoID0gY2xhc3NQYXRoLnN1YnN0cmluZygwLCBjbGFzc1BhdGgubGFzdEluZGV4T2YoIiEiKSArIDEpICsKKyAgICAgICAgICAgICAgICAgICAgIi9NRVRBLUlORi9NQU5JRkVTVC5NRiI7CisgICAgICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBNYW5pZmVzdChuZXcgVVJMKG1hbmlmZXN0UGF0aCkub3BlblN0cmVhbSgpKTsKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0ciA9IG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICByZXR1cm4gYXR0ci5nZXRWYWx1ZSgiUGx1Z2luLVZlcnNpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBtYW5pZmVzdFBhdGggPSBjbGFzc1BhdGguc3Vic3RyaW5nKDAsIGNsYXNzUGF0aC5sYXN0SW5kZXhPZigiISIpICsgMSkgKwotICAgICAgICAgICAgICAgICIvTUVUQS1JTkYvTUFOSUZFU1QuTUYiOwotICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBNYW5pZmVzdChuZXcgVVJMKG1hbmlmZXN0UGF0aCkub3BlblN0cmVhbSgpKTsKLSAgICAgICAgQXR0cmlidXRlcyBhdHRyID0gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLSAgICAgICAgcmV0dXJuIGF0dHIuZ2V0VmFsdWUoIlBsdWdpbi1WZXJzaW9uIik7CisgICAgfQorCisgICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3QKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9MaWJyYXJ5RXh0ZW5zaW9uLmdyb292eSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0xpYnJhcnlFeHRlbnNpb24uZ3Jvb3Z5CmluZGV4IDZkNjAxNWIuLmUxY2Y2YTMgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0xpYnJhcnlFeHRlbnNpb24uZ3Jvb3Z5CisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0xpYnJhcnlFeHRlbnNpb24uZ3Jvb3Z5CkBAIC00NSw5ICs0NSwxMiBAQAogICAgICAgICAgICAgICAgIEJ1aWxkZXJDb25zdGFudHMuREVCVUcpCiAgICAgICAgIGRlYnVnU2lnbmluZ0NvbmZpZy5pbml0RGVidWcoKQogCi0gICAgICAgIGRlYnVnID0gaW5zdGFudGlhdG9yLm5ld0luc3RhbmNlKEJ1aWxkVHlwZURzbC5jbGFzcywgQnVpbGRlckNvbnN0YW50cy5ERUJVRywgcHJvamVjdC5maWxlUmVzb2x2ZXIpCisgICAgICAgIGRlYnVnID0gaW5zdGFudGlhdG9yLm5ld0luc3RhbmNlKEJ1aWxkVHlwZURzbC5jbGFzcywKKyAgICAgICAgICAgICAgICBCdWlsZGVyQ29uc3RhbnRzLkRFQlVHLCBwcm9qZWN0LmZpbGVSZXNvbHZlciwgaW5zdGFudGlhdG9yKQogICAgICAgICBkZWJ1Zy5pbml0KGRlYnVnU2lnbmluZ0NvbmZpZykKLSAgICAgICAgcmVsZWFzZSA9IGluc3RhbnRpYXRvci5uZXdJbnN0YW5jZShCdWlsZFR5cGVEc2wuY2xhc3MsIEJ1aWxkZXJDb25zdGFudHMuUkVMRUFTRSwgcHJvamVjdC5maWxlUmVzb2x2ZXIpCisKKyAgICAgICAgcmVsZWFzZSA9IGluc3RhbnRpYXRvci5uZXdJbnN0YW5jZShCdWlsZFR5cGVEc2wuY2xhc3MsCisgICAgICAgICAgICAgICAgQnVpbGRlckNvbnN0YW50cy5SRUxFQVNFLCBwcm9qZWN0LmZpbGVSZXNvbHZlciwgaW5zdGFudGlhdG9yKQogICAgICAgICByZWxlYXNlLmluaXQobnVsbCkKICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0xpYnJhcnlQbHVnaW4uZ3Jvb3Z5IGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvTGlicmFyeVBsdWdpbi5ncm9vdnkKaW5kZXggOTM0MjBlOC4uMTRjY2U1ZSAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvTGlicmFyeVBsdWdpbi5ncm9vdnkKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvTGlicmFyeVBsdWdpbi5ncm9vdnkKQEAgLTQ1LDYgKzQ1LDcgQEAKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS5Qcm9qZWN0CiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0SW50ZXJuYWwKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS5wbHVnaW5zLk1hdmVuUGx1Z2luCitpbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuQ29weQogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLlN5bmMKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5idW5kbGluZy5KYXIKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5idW5kbGluZy5aaXAKQEAgLTU4LDggKzU5LDYgQEAKICAqLwogcHVibGljIGNsYXNzIExpYnJhcnlQbHVnaW4gZXh0ZW5kcyBCYXNlUGx1Z2luIGltcGxlbWVudHMgUGx1Z2luPFByb2plY3Q+IHsKIAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBESVJfQlVORExFUyA9ICJidW5kbGVzIjsKLQogICAgIExpYnJhcnlFeHRlbnNpb24gZXh0ZW5zaW9uCiAgICAgQnVpbGRUeXBlRGF0YSBkZWJ1Z0J1aWxkVHlwZURhdGEKICAgICBCdWlsZFR5cGVEYXRhIHJlbGVhc2VCdWlsZFR5cGVEYXRhCkBAIC04MCw5ICs3OSw5IEBACiAgICAgICAgIC8vIGNyZWF0ZSB0aGUgc291cmNlIHNldHMgZm9yIHRoZSBidWlsZCB0eXBlLgogICAgICAgICAvLyB0aGUgb25lcyBmb3IgdGhlIG1haW4gcHJvZHVjdCBmbGF2b3JzIGFyZSBoYW5kbGVkIGJ5IHRoZSBiYXNlIHBsdWdpbi4KICAgICAgICAgRGVmYXVsdEFuZHJvaWRTb3VyY2VTZXQgZGVidWdTb3VyY2VTZXQgPQotICAgICAgICAgICAgKERlZmF1bHRBbmRyb2lkU291cmNlU2V0KSBleHRlbnNpb24uc291cmNlU2V0c0NvbnRhaW5lci5jcmVhdGUoQnVpbGRlckNvbnN0YW50cy5ERUJVRykKKyAgICAgICAgICAgIChEZWZhdWx0QW5kcm9pZFNvdXJjZVNldCkgZXh0ZW5zaW9uLnNvdXJjZVNldHNDb250YWluZXIubWF5YmVDcmVhdGUoQnVpbGRlckNvbnN0YW50cy5ERUJVRykKICAgICAgICAgRGVmYXVsdEFuZHJvaWRTb3VyY2VTZXQgcmVsZWFzZVNvdXJjZVNldCA9Ci0gICAgICAgICAgICAoRGVmYXVsdEFuZHJvaWRTb3VyY2VTZXQpIGV4dGVuc2lvbi5zb3VyY2VTZXRzQ29udGFpbmVyLmNyZWF0ZShCdWlsZGVyQ29uc3RhbnRzLlJFTEVBU0UpCisgICAgICAgICAgICAoRGVmYXVsdEFuZHJvaWRTb3VyY2VTZXQpIGV4dGVuc2lvbi5zb3VyY2VTZXRzQ29udGFpbmVyLm1heWJlQ3JlYXRlKEJ1aWxkZXJDb25zdGFudHMuUkVMRUFTRSkKIAogICAgICAgICBkZWJ1Z0J1aWxkVHlwZURhdGEgPSBuZXcgQnVpbGRUeXBlRGF0YShleHRlbnNpb24uZGVidWcsIGRlYnVnU291cmNlU2V0LCBwcm9qZWN0KQogICAgICAgICByZWxlYXNlQnVpbGRUeXBlRGF0YSA9IG5ldyBCdWlsZFR5cGVEYXRhKGV4dGVuc2lvbi5yZWxlYXNlLCByZWxlYXNlU291cmNlU2V0LCBwcm9qZWN0KQpAQCAtMTI3LDIzICsxMjYsMjkgQEAKICAgICAgICAgTGlicmFyeVZhcmlhbnREYXRhIHJlbGVhc2VWYXJpYW50RGF0YSA9IGNyZWF0ZUxpYlZhcmlhbnQoZGVmYXVsdENvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgcmVsZWFzZUJ1aWxkVHlwZURhdGEpCiAKKyAgICAgICAgLy8gQWRkIGEgY29tcGlsZSBsaW50IHRhc2sgYmVmb3JlIGxpYnJhcnkgaXMgYnVuZGxlZAorICAgICAgICBjcmVhdGVMaW50Q29tcGlsZVRhc2soKQorCiAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIHRoZSB0YXNrcyBmb3IgdGhlc2UgYmVmb3JlIGRvaW5nIHRoZSB0ZXN0IHZhcmlhbnQgYXMgaXQKICAgICAgICAgLy8gcmVmZXJlbmNlcyB0aGUgZGVidWcgdmFyaWFudCBhbmQgaXRzIG91dHB1dAogICAgICAgICBjcmVhdGVMaWJyYXJ5VmFyaWFudChkZWJ1Z1ZhcmlhbnREYXRhLCBmYWxzZSkKICAgICAgICAgY3JlYXRlTGlicmFyeVZhcmlhbnQocmVsZWFzZVZhcmlhbnREYXRhLCB0cnVlKQogCiAgICAgICAgIFZhcmlhbnRDb25maWd1cmF0aW9uIHRlc3RWYXJpYW50Q29uZmlnID0gbmV3IFZhcmlhbnRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgIGRlZmF1bHRDb25maWdEYXRhLnByb2R1Y3RGbGF2b3IsIGRlZmF1bHRDb25maWdEYXRhLnRlc3RTb3VyY2VTZXQsCi0gICAgICAgICAgICAgICAgZGVidWdCdWlsZFR5cGVEYXRhLmJ1aWxkVHlwZSwgbnVsbCwKKyAgICAgICAgICAgICAgICBkZWZhdWx0Q29uZmlnRGF0YS5wcm9kdWN0Rmxhdm9yLAorICAgICAgICAgICAgICAgIGRlZmF1bHRDb25maWdEYXRhLnRlc3RTb3VyY2VTZXQsCisgICAgICAgICAgICAgICAgZGVidWdCdWlsZFR5cGVEYXRhLmJ1aWxkVHlwZSwKKyAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgIFZhcmlhbnRDb25maWd1cmF0aW9uLlR5cGUuVEVTVCwKLSAgICAgICAgICAgICAgICBkZWJ1Z1ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLCBwcm9qZWN0Lm5hbWUpCisgICAgICAgICAgICAgICAgZGVidWdWYXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbikKIAogICAgICAgICBUZXN0VmFyaWFudERhdGEgdGVzdFZhcmlhbnREYXRhID0gbmV3IFRlc3RWYXJpYW50RGF0YSh0ZXN0VmFyaWFudENvbmZpZywgZGVidWdWYXJpYW50RGF0YSkKICAgICAgICAgLy8gbGluayB0aGUgdGVzdFZhcmlhbnQgdG8gdGhlIHRlc3RlZCB2YXJpYW50IGluIHRoZSBvdGhlciBkaXJlY3Rpb24KICAgICAgICAgZGVidWdWYXJpYW50RGF0YS5zZXRUZXN0VmFyaWFudERhdGEodGVzdFZhcmlhbnREYXRhKTsKIAogICAgICAgICAvLyBkZXBlbmRlbmNpZXMgZm9yIHRoZSB0ZXN0IHZhcmlhbnQKLSAgICAgICAgdmFyaWFudERlcCA9IFZhcmlhbnREZXBlbmRlbmNpZXMuY29tcHV0ZShwcm9qZWN0LCB0ZXN0VmFyaWFudERhdGEubmFtZSwKKyAgICAgICAgdmFyaWFudERlcCA9IFZhcmlhbnREZXBlbmRlbmNpZXMuY29tcHV0ZShwcm9qZWN0LAorICAgICAgICAgICAgICAgIHRlc3RWYXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZSwKICAgICAgICAgICAgICAgICBkZWZhdWx0Q29uZmlnRGF0YS50ZXN0UHJvdmlkZXIsIGRlYnVnVmFyaWFudERhdGEudmFyaWFudERlcGVuZGVuY3kpCiAgICAgICAgIHRlc3RWYXJpYW50RGF0YS5zZXRWYXJpYW50RGVwZW5kZW5jeSh2YXJpYW50RGVwKQogCkBAIC0xNTEsNiArMTU2LDkgQEAKIAogICAgICAgICBjcmVhdGVUZXN0VmFyaWFudCh0ZXN0VmFyaWFudERhdGEsIGRlYnVnVmFyaWFudERhdGEpCiAKKyAgICAgICAgLy8gY3JlYXRlIHRoZSBsaW50IHRhc2tzLgorICAgICAgICBjcmVhdGVMaW50VGFza3MoKQorCiAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdGVzdCB0YXNrcy4KICAgICAgICAgY3JlYXRlQ2hlY2tUYXNrcyhmYWxzZSAvKmhhc0ZsYXZvcnMqLywgdHJ1ZSAvKmlzTGlicmFyeSovKQogCkBAIC0xNjEsMTQgKzE2OSwxNiBAQAogICAgIHByb3RlY3RlZCBMaWJyYXJ5VmFyaWFudERhdGEgY3JlYXRlTGliVmFyaWFudChATm9uTnVsbCBQcm9kdWN0Rmxhdm9yRGF0YSBjb25maWdEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBCdWlsZFR5cGVEYXRhIGJ1aWxkVHlwZURhdGEpIHsKICAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24gdmFyaWFudENvbmZpZyA9IG5ldyBWYXJpYW50Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgICAgICBjb25maWdEYXRhLnByb2R1Y3RGbGF2b3IsIGNvbmZpZ0RhdGEuc291cmNlU2V0LAotICAgICAgICAgICAgICAgIGJ1aWxkVHlwZURhdGEuYnVpbGRUeXBlLCBidWlsZFR5cGVEYXRhLnNvdXJjZVNldCwKLSAgICAgICAgICAgICAgICBWYXJpYW50Q29uZmlndXJhdGlvbi5UeXBlLkxJQlJBUlksIHByb2plY3QubmFtZSkKKyAgICAgICAgICAgICAgICBjb25maWdEYXRhLnByb2R1Y3RGbGF2b3IsCisgICAgICAgICAgICAgICAgY29uZmlnRGF0YS5zb3VyY2VTZXQsCisgICAgICAgICAgICAgICAgYnVpbGRUeXBlRGF0YS5idWlsZFR5cGUsCisgICAgICAgICAgICAgICAgYnVpbGRUeXBlRGF0YS5zb3VyY2VTZXQsCisgICAgICAgICAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24uVHlwZS5MSUJSQVJZKQogCiAgICAgICAgIExpYnJhcnlWYXJpYW50RGF0YSB2YXJpYW50RGF0YSA9IG5ldyBMaWJyYXJ5VmFyaWFudERhdGEodmFyaWFudENvbmZpZykKIAogICAgICAgICBWYXJpYW50RGVwZW5kZW5jaWVzIGRlYnVnVmFyaWFudERlcCA9IFZhcmlhbnREZXBlbmRlbmNpZXMuY29tcHV0ZSgKLSAgICAgICAgICAgICAgICBwcm9qZWN0LCB2YXJpYW50RGF0YS5uYW1lLAorICAgICAgICAgICAgICAgIHByb2plY3QsIHZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLAogICAgICAgICAgICAgICAgIGJ1aWxkVHlwZURhdGEsIGNvbmZpZ0RhdGEubWFpblByb3ZpZGVyKQogICAgICAgICB2YXJpYW50RGF0YS5zZXRWYXJpYW50RGVwZW5kZW5jeShkZWJ1Z1ZhcmlhbnREZXApCiAKQEAgLTE4NSwxMiArMTk1LDcgQEAKICAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24gdmFyaWFudENvbmZpZyA9IHZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uCiAgICAgICAgIERlZmF1bHRCdWlsZFR5cGUgYnVpbGRUeXBlID0gdmFyaWFudENvbmZpZy5idWlsZFR5cGUKIAotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSB2YXJpYW50Q29uZmlnLmdldFBhY2thZ2VGcm9tTWFuaWZlc3QoKQotICAgICAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVhZCBtYW5pZmVzdCIsIG51bGwpCi0gICAgICAgIH0KLQotICAgICAgICBjcmVhdGVQcmVwYXJlRGVwZW5kZW5jaWVzVGFzayh2YXJpYW50RGF0YSkKKyAgICAgICAgY3JlYXRlQW5jaG9yVGFza3ModmFyaWFudERhdGEpCiAKICAgICAgICAgLy8gQWRkIGEgdGFzayB0byBwcm9jZXNzIHRoZSBtYW5pZmVzdChzKQogICAgICAgICBjcmVhdGVQcm9jZXNzTWFuaWZlc3RUYXNrKHZhcmlhbnREYXRhLCBESVJfQlVORExFUykKQEAgLTIwNiwxMyArMjExLDEzIEBACiAgICAgICAgIC8vIHRoZSBkZXBlbmRlbmNpZXMuIFRoaXMgaXMgd2hhdCBnZXRzIHBhY2thZ2VkIGluIHRoZSBhYXIuCiAgICAgICAgIE1lcmdlUmVzb3VyY2VzIHBhY2thZ2VSZXMgPSBiYXNpY0NyZWF0ZU1lcmdlUmVzb3VyY2VzVGFzayh2YXJpYW50RGF0YSwKICAgICAgICAgICAgICAgICAicGFja2FnZSIsCi0gICAgICAgICAgICAgICAgIiRwcm9qZWN0LmJ1aWxkRGlyLyRESVJfQlVORExFUy8ke3ZhcmlhbnREYXRhLmRpck5hbWV9L3JlcyIsCisgICAgICAgICAgICAgICAgIiRwcm9qZWN0LmJ1aWxkRGlyLyRESVJfQlVORExFUy8ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmRpck5hbWV9L3JlcyIsCiAgICAgICAgICAgICAgICAgZmFsc2UgLyppbmNsdWRlRGVwZW5kZW5jaWVzKi8sCiAgICAgICAgICAgICAgICAgZmFsc2UgLypwcm9jZXNzOVBhdGNoKi8pCiAKICAgICAgICAgLy8gQWRkIGEgdGFzayB0byBtZXJnZSB0aGUgYXNzZXRzIGZvbGRlcnMKICAgICAgICAgY3JlYXRlTWVyZ2VBc3NldHNUYXNrKHZhcmlhbnREYXRhLAotICAgICAgICAgICAgICAgICIkcHJvamVjdC5idWlsZERpci8kRElSX0JVTkRMRVMvJHt2YXJpYW50RGF0YS5kaXJOYW1lfS9hc3NldHMiLAorICAgICAgICAgICAgICAgICIkcHJvamVjdC5idWlsZERpci8kRElSX0JVTkRMRVMvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfS9hc3NldHMiLAogICAgICAgICAgICAgICAgIGZhbHNlIC8qaW5jbHVkZURlcGVuZGVuY2llcyovKQogCiAgICAgICAgIC8vIEFkZCBhIHRhc2sgdG8gY3JlYXRlIHRoZSBCdWlsZENvbmZpZyBjbGFzcwpAQCAtMjIwLDcgKzIyNSw4IEBACiAKICAgICAgICAgLy8gQWRkIGEgdGFzayB0byBnZW5lcmF0ZSByZXNvdXJjZSBzb3VyY2UgZmlsZXMsIGRpcmVjdGluZyB0aGUgbG9jYXRpb24KICAgICAgICAgLy8gb2YgdGhlIHIudHh0IGZpbGUgdG8gYmUgZGlyZWN0bHkgaW4gdGhlIGJ1bmRsZS4KLSAgICAgICAgY3JlYXRlUHJvY2Vzc1Jlc1Rhc2sodmFyaWFudERhdGEsICIkcHJvamVjdC5idWlsZERpci8kRElSX0JVTkRMRVMvJHt2YXJpYW50RGF0YS5kaXJOYW1lfSIpCisgICAgICAgIGNyZWF0ZVByb2Nlc3NSZXNUYXNrKHZhcmlhbnREYXRhLAorICAgICAgICAgICAgICAgICIkcHJvamVjdC5idWlsZERpci8kRElSX0JVTkRMRVMvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfSIpCiAKICAgICAgICAgLy8gcHJvY2VzcyBqYXZhIHJlc291cmNlcwogICAgICAgICBjcmVhdGVQcm9jZXNzSmF2YVJlc1Rhc2sodmFyaWFudERhdGEpCkBAIC0yMzAsNjEgKzIzNiwxMDEgQEAKICAgICAgICAgLy8gQWRkIGEgY29tcGlsZSB0YXNrCiAgICAgICAgIGNyZWF0ZUNvbXBpbGVUYXNrKHZhcmlhbnREYXRhLCBudWxsLyp0ZXN0ZWRWYXJpYW50Ki8pCiAKLSAgICAgICAgLy8gamFyIHRoZSBjbGFzc2VzLgotICAgICAgICBKYXIgamFyID0gcHJvamVjdC50YXNrcy5jcmVhdGUoInBhY2thZ2Uke2J1aWxkVHlwZS5uYW1lLmNhcGl0YWxpemUoKX1KYXIiLCBKYXIpOwotICAgICAgICBqYXIuZGVwZW5kc09uIHZhcmlhbnREYXRhLmphdmFDb21waWxlVGFzaywgdmFyaWFudERhdGEucHJvY2Vzc0phdmFSZXNvdXJjZXMKLSAgICAgICAgamFyLmZyb20odmFyaWFudERhdGEuamF2YUNvbXBpbGVUYXNrLm91dHB1dHMpOwotICAgICAgICBqYXIuZnJvbSh2YXJpYW50RGF0YS5wcm9jZXNzSmF2YVJlc291cmNlcy5kZXN0aW5hdGlvbkRpcikKLQotICAgICAgICBqYXIuZGVzdGluYXRpb25EaXIgPSBwcm9qZWN0LmZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyLyRESVJfQlVORExFUy8ke3ZhcmlhbnREYXRhLmRpck5hbWV9IikKLSAgICAgICAgamFyLmFyY2hpdmVOYW1lID0gImNsYXNzZXMuamFyIgotICAgICAgICBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCAnLycpOwotICAgICAgICBqYXIuZXhjbHVkZShwYWNrYWdlTmFtZSArICIvUi5jbGFzcyIpCi0gICAgICAgIGphci5leGNsdWRlKHBhY2thZ2VOYW1lICsgIi9SXCQqLmNsYXNzIikKLSAgICAgICAgamFyLmV4Y2x1ZGUocGFja2FnZU5hbWUgKyAiL01hbmlmZXN0LmNsYXNzIikKLSAgICAgICAgamFyLmV4Y2x1ZGUocGFja2FnZU5hbWUgKyAiL01hbmlmZXN0XCQqLmNsYXNzIikKLSAgICAgICAgamFyLmV4Y2x1ZGUocGFja2FnZU5hbWUgKyAiL0J1aWxkQ29uZmlnLmNsYXNzIikKKyAgICAgICAgLy8gQWRkIE5ESyB0YXNrcworICAgICAgICBjcmVhdGVOZGtUYXNrcygKKyAgICAgICAgICAgICAgICB2YXJpYW50RGF0YSwKKyAgICAgICAgICAgICAgICB7IHByb2plY3QuZmlsZSgiJHByb2plY3QuYnVpbGREaXIvJERJUl9CVU5ETEVTLyR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZGlyTmFtZX0vam5pIikgfSk7CiAKICAgICAgICAgLy8gcGFja2FnZSB0aGUgYWlkbCBmaWxlcyBpbnRvIHRoZSBidW5kbGUgZm9sZGVyCi0gICAgICAgIFN5bmMgcGFja2FnZUFpZGwgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgicGFja2FnZSR7dmFyaWFudERhdGEubmFtZX1BaWRsIiwgU3luYykKKyAgICAgICAgU3luYyBwYWNrYWdlQWlkbCA9IHByb2plY3QudGFza3MuY3JlYXRlKAorICAgICAgICAgICAgICAgICJwYWNrYWdlJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZS5jYXBpdGFsaXplKCl9QWlkbCIsCisgICAgICAgICAgICAgICAgU3luYykKICAgICAgICAgLy8gcGFja2FnZUFpZGwgZnJvbSAzIHNvdXJjZXMuIHRoZSBvcmRlciBpcyBpbXBvcnRhbnQgdG8gbWFrZSBzdXJlIHRoZSBvdmVycmlkZSB3b3JrcyB3ZWxsLgogICAgICAgICBwYWNrYWdlQWlkbC5mcm9tKHZhcmlhbnRDb25maWcuYWlkbFNvdXJjZUxpc3QpLmluY2x1ZGUoIioqLyouYWlkbCIpCiAgICAgICAgIHBhY2thZ2VBaWRsLmludG8ocHJvamVjdC5maWxlKAotICAgICAgICAgICAgICAgICIkcHJvamVjdC5idWlsZERpci8kRElSX0JVTkRMRVMvJHt2YXJpYW50RGF0YS5kaXJOYW1lfS8kU2RrQ29uc3RhbnRzLkZEX0FJREwiKSkKKyAgICAgICAgICAgICAgICAiJHByb2plY3QuYnVpbGREaXIvJERJUl9CVU5ETEVTLyR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZGlyTmFtZX0vJFNka0NvbnN0YW50cy5GRF9BSURMIikpCiAKICAgICAgICAgLy8gcGFja2FnZSB0aGUgcmVuZGVyc2NyaXB0IGhlYWRlciBmaWxlcyBmaWxlcyBpbnRvIHRoZSBidW5kbGUgZm9sZGVyCi0gICAgICAgIFN5bmMgcGFja2FnZVJlbmRlcnNjcmlwdCA9IHByb2plY3QudGFza3MuY3JlYXRlKCJwYWNrYWdlJHt2YXJpYW50RGF0YS5uYW1lfVJlbmRlcnNjcmlwdCIsCisgICAgICAgIFN5bmMgcGFja2FnZVJlbmRlcnNjcmlwdCA9IHByb2plY3QudGFza3MuY3JlYXRlKAorICAgICAgICAgICAgICAgICJwYWNrYWdlJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZS5jYXBpdGFsaXplKCl9UmVuZGVyc2NyaXB0IiwKICAgICAgICAgICAgICAgICBTeW5jKQogICAgICAgICAvLyBwYWNrYWdlIGZyb20gMyBzb3VyY2VzLiB0aGUgb3JkZXIgaXMgaW1wb3J0YW50IHRvIG1ha2Ugc3VyZSB0aGUgb3ZlcnJpZGUgd29ya3Mgd2VsbC4KICAgICAgICAgcGFja2FnZVJlbmRlcnNjcmlwdC5mcm9tKHZhcmlhbnRDb25maWcucmVuZGVyc2NyaXB0U291cmNlTGlzdCkuaW5jbHVkZSgiKiovKi5yc2giKQogICAgICAgICBwYWNrYWdlUmVuZGVyc2NyaXB0LmludG8ocHJvamVjdC5maWxlKAotICAgICAgICAgICAgICAgICIkcHJvamVjdC5idWlsZERpci8kRElSX0JVTkRMRVMvJHt2YXJpYW50RGF0YS5kaXJOYW1lfS8kU2RrQ29uc3RhbnRzLkZEX1JFTkRFUlNDUklQVCIpKQorICAgICAgICAgICAgICAgICIkcHJvamVjdC5idWlsZERpci8kRElSX0JVTkRMRVMvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfS8kU2RrQ29uc3RhbnRzLkZEX1JFTkRFUlNDUklQVCIpKQogCi0gICAgICAgIC8vIHBhY2thZ2UgdGhlIHJlbmRlcnNjcmlwdCBoZWFkZXIgZmlsZXMgZmlsZXMgaW50byB0aGUgYnVuZGxlIGZvbGRlcgotICAgICAgICBTeW5jIHBhY2thZ2VMb2NhbEphciA9IHByb2plY3QudGFza3MuY3JlYXRlKCJwYWNrYWdlJHt2YXJpYW50RGF0YS5uYW1lfUxvY2FsSmFyIiwgU3luYykKLSAgICAgICAgcGFja2FnZUxvY2FsSmFyLmZyb20oZ2V0TG9jYWxKYXJGaWxlTGlzdCh2YXJpYW50RGF0YS52YXJpYW50RGVwZW5kZW5jeSkpCi0gICAgICAgIHBhY2thZ2VMb2NhbEphci5pbnRvKHByb2plY3QuZmlsZSgKLSAgICAgICAgICAgICAgICAiJHByb2plY3QuYnVpbGREaXIvJERJUl9CVU5ETEVTLyR7dmFyaWFudERhdGEuZGlyTmFtZX0vJFNka0NvbnN0YW50cy5MSUJTX0ZPTERFUiIpKQotCi0gICAgICAgIC8vIG1lcmdlIHRoZSBwcm9ndWFyZCBmaWxlcyB0b2dldGhlcgotICAgICAgICBNZXJnZUZpbGVUYXNrIG1lcmdlRmlsZVRhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgibWVyZ2Uke3ZhcmlhbnREYXRhLm5hbWV9UHJvZ3VhcmRGaWxlcyIsCisgICAgICAgIC8vIG1lcmdlIGNvbnN1bWVyIHByb2d1YXJkIGZpbGVzIGZyb20gZGlmZmVyZW50IGJ1aWxkIHR5cGVzIGFuZCBmbGF2b3JzCisgICAgICAgIE1lcmdlRmlsZVRhc2sgbWVyZ2VQcm9HdWFyZEZpbGVUYXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoCisgICAgICAgICAgICAgICAgIm1lcmdlJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZS5jYXBpdGFsaXplKCl9UHJvZ3VhcmRGaWxlcyIsCiAgICAgICAgICAgICAgICAgTWVyZ2VGaWxlVGFzaykKLSAgICAgICAgbWVyZ2VGaWxlVGFzay5jb252ZW50aW9uTWFwcGluZy5pbnB1dEZpbGVzID0gewotICAgICAgICAgICAgcHJvamVjdC5maWxlcyh2YXJpYW50Q29uZmlnLmdldFByb2d1YXJkRmlsZXMoZmFsc2UpKS5maWxlcyB9Ci0gICAgICAgIG1lcmdlRmlsZVRhc2suY29udmVudGlvbk1hcHBpbmcub3V0cHV0RmlsZSA9IHsKKyAgICAgICAgbWVyZ2VQcm9HdWFyZEZpbGVUYXNrLmNvbnZlbnRpb25NYXBwaW5nLmlucHV0RmlsZXMgPSB7CisgICAgICAgICAgICBwcm9qZWN0LmZpbGVzKHZhcmlhbnRDb25maWcuZ2V0Q29uc3VtZXJQcm9ndWFyZEZpbGVzKCkpLmZpbGVzIH0KKyAgICAgICAgbWVyZ2VQcm9HdWFyZEZpbGVUYXNrLmNvbnZlbnRpb25NYXBwaW5nLm91dHB1dEZpbGUgPSB7CiAgICAgICAgICAgICBwcm9qZWN0LmZpbGUoCi0gICAgICAgICAgICAgICAgICAgICIkcHJvamVjdC5idWlsZERpci8kRElSX0JVTkRMRVMvJHt2YXJpYW50RGF0YS5kaXJOYW1lfS8kTGlicmFyeUJ1bmRsZS5GTl9QUk9HVUFSRF9UWFQiKQorICAgICAgICAgICAgICAgICAgICAiJHByb2plY3QuYnVpbGREaXIvJERJUl9CVU5ETEVTLyR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZGlyTmFtZX0vJExpYnJhcnlCdW5kbGUuRk5fUFJPR1VBUkRfVFhUIikKICAgICAgICAgfQogCi0gICAgICAgIFppcCBidW5kbGUgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgiYnVuZGxlJHt2YXJpYW50RGF0YS5uYW1lfSIsIFppcCkKLSAgICAgICAgYnVuZGxlLmRlcGVuZHNPbiBwYWNrYWdlUmVzLCBqYXIsIHBhY2thZ2VBaWRsLCBwYWNrYWdlUmVuZGVyc2NyaXB0LCBwYWNrYWdlTG9jYWxKYXIsIG1lcmdlRmlsZVRhc2sKLSAgICAgICAgYnVuZGxlLnNldERlc2NyaXB0aW9uKCJBc3NlbWJsZXMgYSBidW5kbGUgY29udGFpbmluZyB0aGUgbGlicmFyeSBpbiAke3ZhcmlhbnREYXRhLm5hbWV9LiIpOworICAgICAgICAvLyBjb3B5IGxpbnQuamFyIGludG8gdGhlIGJ1bmRsZSBmb2xkZXIKKyAgICAgICAgQ29weSBsaW50Q29weSA9IHByb2plY3QudGFza3MuY3JlYXRlKAorICAgICAgICAgICAgICAgICJjb3B5JHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZS5jYXBpdGFsaXplKCl9TGludCIsCisgICAgICAgICAgICAgICAgQ29weSkKKyAgICAgICAgbGludENvcHkuZGVwZW5kc09uIGxpbnRDb21waWxlCisgICAgICAgIGxpbnRDb3B5LmZyb20oIiRwcm9qZWN0LmJ1aWxkRGlyL2xpbnQvbGludC5qYXIiKQorICAgICAgICBsaW50Q29weS5pbnRvKCIkcHJvamVjdC5idWlsZERpci8kRElSX0JVTkRMRVMvJHZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmRpck5hbWUiKQorCisgICAgICAgIFppcCBidW5kbGUgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAiYnVuZGxlJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZS5jYXBpdGFsaXplKCl9IiwKKyAgICAgICAgICAgICAgICBaaXApCisKKyAgICAgICAgaWYgKHZhcmlhbnRDb25maWcuYnVpbGRUeXBlLnJ1blByb2d1YXJkKSB7CisgICAgICAgICAgICAvLyBydW4gcHJvZ3VhcmQgb24gb3V0cHV0IG9mIGNvbXBpbGUgdGFzaworICAgICAgICAgICAgY3JlYXRlUHJvZ3VhcmRUYXNrcyh2YXJpYW50RGF0YSwgbnVsbCkKKworICAgICAgICAgICAgLy8gaGFjayBzaW5jZSBidW5kbGUgY2FuJ3QgZGVwZW5kIG9uIHZhcmlhbnREYXRhLnByb2d1YXJkVGFzaworICAgICAgICAgICAgbWVyZ2VQcm9HdWFyZEZpbGVUYXNrLmRlcGVuZHNPbiB2YXJpYW50RGF0YS5wcm9ndWFyZFRhc2sKKworICAgICAgICAgICAgYnVuZGxlLmRlcGVuZHNPbiBwYWNrYWdlUmVzLCBwYWNrYWdlQWlkbCwgcGFja2FnZVJlbmRlcnNjcmlwdCwgbWVyZ2VQcm9HdWFyZEZpbGVUYXNrLCBsaW50Q29weSwgdmFyaWFudERhdGEubmRrQ29tcGlsZVRhc2sKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5bmMgcGFja2FnZUxvY2FsSmFyID0gcHJvamVjdC50YXNrcy5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5mdWxsTmFtZS5jYXBpdGFsaXplKCl9TG9jYWxKYXIiLAorICAgICAgICAgICAgICAgICAgICBTeW5jKQorICAgICAgICAgICAgcGFja2FnZUxvY2FsSmFyLmZyb20oZ2V0TG9jYWxKYXJGaWxlTGlzdCh2YXJpYW50RGF0YS52YXJpYW50RGVwZW5kZW5jeSkpCisgICAgICAgICAgICBwYWNrYWdlTG9jYWxKYXIuaW50byhwcm9qZWN0LmZpbGUoCisgICAgICAgICAgICAgICAgICAgICIkcHJvamVjdC5idWlsZERpci8kRElSX0JVTkRMRVMvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfS8kU2RrQ29uc3RhbnRzLkxJQlNfRk9MREVSIikpCisKKyAgICAgICAgICAgIC8vIGphciB0aGUgY2xhc3Nlcy4KKyAgICAgICAgICAgIEphciBqYXIgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgicGFja2FnZSR7YnVpbGRUeXBlLm5hbWUuY2FwaXRhbGl6ZSgpfUphciIsIEphcik7CisgICAgICAgICAgICBqYXIuZGVwZW5kc09uIHZhcmlhbnREYXRhLmphdmFDb21waWxlVGFzaywgdmFyaWFudERhdGEucHJvY2Vzc0phdmFSZXNvdXJjZXNUYXNrCisgICAgICAgICAgICBqYXIuZnJvbSh2YXJpYW50RGF0YS5qYXZhQ29tcGlsZVRhc2sub3V0cHV0cyk7CisgICAgICAgICAgICBqYXIuZnJvbSh2YXJpYW50RGF0YS5wcm9jZXNzSmF2YVJlc291cmNlc1Rhc2suZGVzdGluYXRpb25EaXIpCisKKyAgICAgICAgICAgIGphci5kZXN0aW5hdGlvbkRpciA9IHByb2plY3QuZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgIiRwcm9qZWN0LmJ1aWxkRGlyLyRESVJfQlVORExFUy8ke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmRpck5hbWV9IikKKyAgICAgICAgICAgIGphci5hcmNoaXZlTmFtZSA9ICJjbGFzc2VzLmphciIKKworICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gdmFyaWFudENvbmZpZy5nZXRQYWNrYWdlRnJvbU1hbmlmZXN0KCkKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVhZCBtYW5pZmVzdCIsIG51bGwpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCAnLycpOworCisgICAgICAgICAgICBqYXIuZXhjbHVkZShwYWNrYWdlTmFtZSArICIvUi5jbGFzcyIpCisgICAgICAgICAgICBqYXIuZXhjbHVkZShwYWNrYWdlTmFtZSArICIvUlwkKi5jbGFzcyIpCisgICAgICAgICAgICBqYXIuZXhjbHVkZShwYWNrYWdlTmFtZSArICIvTWFuaWZlc3QuY2xhc3MiKQorICAgICAgICAgICAgamFyLmV4Y2x1ZGUocGFja2FnZU5hbWUgKyAiL01hbmlmZXN0XCQqLmNsYXNzIikKKyAgICAgICAgICAgIGphci5leGNsdWRlKHBhY2thZ2VOYW1lICsgIi9CdWlsZENvbmZpZy5jbGFzcyIpCisKKyAgICAgICAgICAgIGJ1bmRsZS5kZXBlbmRzT24gcGFja2FnZVJlcywgamFyLCBwYWNrYWdlQWlkbCwgcGFja2FnZVJlbmRlcnNjcmlwdCwgcGFja2FnZUxvY2FsSmFyLAorICAgICAgICAgICAgICAgICAgICBtZXJnZVByb0d1YXJkRmlsZVRhc2ssIGxpbnRDb3B5LCB2YXJpYW50RGF0YS5uZGtDb21waWxlVGFzaworICAgICAgICB9CisKKyAgICAgICAgYnVuZGxlLnNldERlc2NyaXB0aW9uKCJBc3NlbWJsZXMgYSBidW5kbGUgY29udGFpbmluZyB0aGUgbGlicmFyeSBpbiAke3ZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lLmNhcGl0YWxpemUoKX0uIik7CiAgICAgICAgIGJ1bmRsZS5kZXN0aW5hdGlvbkRpciA9IHByb2plY3QuZmlsZSgiJHByb2plY3QuYnVpbGREaXIvbGlicyIpCiAgICAgICAgIGJ1bmRsZS5leHRlbnNpb24gPSBCdWlsZGVyQ29uc3RhbnRzLkVYVF9MSUJfQVJDSElWRQotICAgICAgICBpZiAodmFyaWFudERhdGEuYmFzZU5hbWUgIT0gQnVpbGRlckNvbnN0YW50cy5SRUxFQVNFKSB7Ci0gICAgICAgICAgICBidW5kbGUuY2xhc3NpZmllciA9IHZhcmlhbnREYXRhLmJhc2VOYW1lCisgICAgICAgIGlmICh2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5iYXNlTmFtZSAhPSBCdWlsZGVyQ29uc3RhbnRzLlJFTEVBU0UpIHsKKyAgICAgICAgICAgIGJ1bmRsZS5jbGFzc2lmaWVyID0gdmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uYmFzZU5hbWUKICAgICAgICAgfQotICAgICAgICBidW5kbGUuZnJvbShwcm9qZWN0LmZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyLyRESVJfQlVORExFUy8ke3ZhcmlhbnREYXRhLmRpck5hbWV9IikpCisgICAgICAgIGJ1bmRsZS5mcm9tKHByb2plY3QuZmlsZSgiJHByb2plY3QuYnVpbGREaXIvJERJUl9CVU5ETEVTLyR7dmFyaWFudERhdGEudmFyaWFudENvbmZpZ3VyYXRpb24uZGlyTmFtZX0iKSkKIAogICAgICAgICB2YXJpYW50RGF0YS5wYWNrYWdlTGliVGFzayA9IGJ1bmRsZQogICAgICAgICB2YXJpYW50RGF0YS5vdXRwdXRGaWxlID0gYnVuZGxlLmFyY2hpdmVQYXRoCkBAIC0zMDIsNyArMzQ4LDcgQEAKICAgICAgICAgLy8gY29uZmlndXJlIHRoZSB2YXJpYW50IHRvIGJlIHRlc3RhYmxlLgogICAgICAgICB2YXJpYW50Q29uZmlnLm91dHB1dCA9IG5ldyBMaWJyYXJ5QnVuZGxlKAogICAgICAgICAgICAgICAgIGJ1bmRsZS5hcmNoaXZlUGF0aCwKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyLyRESVJfQlVORExFUy8ke3ZhcmlhbnREYXRhLmRpck5hbWV9IiksCisgICAgICAgICAgICAgICAgcHJvamVjdC5maWxlKCIkcHJvamVjdC5idWlsZERpci8kRElSX0JVTkRMRVMvJHt2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5kaXJOYW1lfSIpLAogICAgICAgICAgICAgICAgIHZhcmlhbnREYXRhLmdldE5hbWUoKSkgewogCiAgICAgICAgICAgICBATnVsbGFibGUKZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2FwaS9BcGtWYXJpYW50LmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9hcGkvQXBrVmFyaWFudC5qYXZhCmluZGV4IGQyOGI2ZGQuLjQwNDYyNWUgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2FwaS9BcGtWYXJpYW50LmphdmEKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvYXBpL0Fwa1ZhcmlhbnQuamF2YQpAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5EZXg7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLlBhY2thZ2VBcHBsaWNhdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuWmlwQWxpZ247Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5EZWZhdWx0QnVpbGRUeXBlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuRGVmYXVsdFByb2R1Y3RGbGF2b3I7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5TaWduaW5nQ29uZmlnOwogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLkRlZmF1bHRUYXNrOwpAQCAtMzMsMTEgKzMyLDYgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBBcGtWYXJpYW50IGV4dGVuZHMgQmFzZVZhcmlhbnQgewogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIGNvbS5hbmRyb2lkLmJ1aWxkZXIuRGVmYXVsdEJ1aWxkVHlwZX0gZm9yIHRoaXMgYnVpbGQgdmFyaWFudC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIERlZmF1bHRCdWlsZFR5cGUgZ2V0QnVpbGRUeXBlKCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHtAbGluayBjb20uYW5kcm9pZC5idWlsZGVyLkRlZmF1bHRQcm9kdWN0Rmxhdm9yfSBmb3IgdGhpcyBidWlsZCB2YXJpYW50LgpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvYXBpL0Jhc2VWYXJpYW50LmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9hcGkvQmFzZVZhcmlhbnQuamF2YQppbmRleCAxOTBiZjQ3Li40MzU3NDU2IDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9hcGkvQmFzZVZhcmlhbnQuamF2YQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9hcGkvQmFzZVZhcmlhbnQuamF2YQpAQCAtMjUsMTEgKzI1LDE0IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLlByb2Nlc3NBbmRyb2lkUmVzb3VyY2VzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5Qcm9jZXNzTWFuaWZlc3Q7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLlJlbmRlcnNjcmlwdENvbXBpbGU7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5EZWZhdWx0QnVpbGRUeXBlOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuRGVmYXVsdFByb2R1Y3RGbGF2b3I7CiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkuVGFzazsKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5Db3B5OwogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLmNvbXBpbGUuSmF2YUNvbXBpbGU7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKIC8qKgogICogQSBCdWlsZCB2YXJpYW50IGFuZCBhbGwgaXRzIHB1YmxpYyBkYXRhLiBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBpdGVtcyBjb21tb24gdG8gYXBwcywKQEAgLTY4LDYgKzcxLDI3IEBACiAgICAgU3RyaW5nIGdldEJhc2VOYW1lKCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmbGF2b3IgbmFtZSBvZiB0aGUgdmFyaWFudC4gVGhpcyBpcyBhIGNvbmNhdGVuYXRpb24gb2YgYWxsIHRoZQorICAgICAqIGFwcGxpZWQgZmxhdm9ycworICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZsYXZvcnMsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSBpcyBub3QgZmxhdm9ycy4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIFN0cmluZyBnZXRGbGF2b3JOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgY29tLmFuZHJvaWQuYnVpbGRlci5EZWZhdWx0QnVpbGRUeXBlfSBmb3IgdGhpcyBidWlsZCB2YXJpYW50LgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgRGVmYXVsdEJ1aWxkVHlwZSBnZXRCdWlsZFR5cGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgY29tLmFuZHJvaWQuYnVpbGRlci5EZWZhdWx0UHJvZHVjdEZsYXZvcn0gdGhhdCByZXByZXNlbnRzIHRoZSBtZXJnaW5nCisgICAgICogb2YgdGhlIGRlZmF1bHQgY29uZmlnIGFuZCB0aGUgZmxhdm9ycyBvZiB0aGlzIGJ1aWxkIHZhcmlhbnQuCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBEZWZhdWx0UHJvZHVjdEZsYXZvciBnZXRDb25maWcoKTsKKworICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG91dHB1dCBmaWxlIGZvciB0aGlzIGJ1aWxkIHZhcmlhbnRzLiBEZXBlbmRpbmcgb24gdGhlIGNvbmZpZ3VyYXRpb24sIHRoaXMgY291bGQKICAgICAgKiBiZSBhbiBhcGsgKHJlZ3VsYXIgYW5kIHRlc3QgcHJvamVjdCkgb3IgYSBidW5kbGVkIGxpYnJhcnkgKGxpYnJhcnkgcHJvamVjdCkuCiAgICAgICoKQEAgLTEzNyw0ICsxNjEsNTIgQEAKICAgICAgKi8KICAgICBATnVsbGFibGUKICAgICBUYXNrIGdldEFzc2VtYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIG5ldyBKYXZhIHNvdXJjZSBmb2xkZXJzIHRvIHRoZSBtb2RlbC4KKyAgICAgKgorICAgICAqIFRoZXNlIHNvdXJjZSBmb2xkZXJzIHdpbGwgbm90IGJlIHVzZWQgZm9yIHRoZSBkZWZhdWx0IGJ1aWxkCisgICAgICogc3lzdGVtLCBidXQgd2lsbCBiZSBwYXNzZWQgYWxvbmcgdGhlIGRlZmF1bHQgSmF2YSBzb3VyY2UgZm9sZGVycworICAgICAqIHRvIHdob2V2ZXIgcXVlcmllcyB0aGUgbW9kZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlRm9sZGVycyB0aGUgc291cmNlIGZvbGRlcnMgd2hlcmUgdGhlIGdlbmVyYXRlZCBzb3VyY2UgY29kZSBpcy4KKyAgICAgKi8KKyAgICB2b2lkIGFkZEphdmFTb3VyY2VGb2xkZXJzVG9Nb2RlbChATm9uTnVsbCBGaWxlLi4uIHNvdXJjZUZvbGRlcnMpOworCisgICAgLyoqCisgICAgICogQWRkcyBuZXcgSmF2YSBzb3VyY2UgZm9sZGVycyB0byB0aGUgbW9kZWwuCisgICAgICoKKyAgICAgKiBUaGVzZSBzb3VyY2UgZm9sZGVycyB3aWxsIG5vdCBiZSB1c2VkIGZvciB0aGUgZGVmYXVsdCBidWlsZAorICAgICAqIHN5c3RlbSwgYnV0IHdpbGwgYmUgcGFzc2VkIGFsb25nIHRoZSBkZWZhdWx0IEphdmEgc291cmNlIGZvbGRlcnMKKyAgICAgKiB0byB3aG9ldmVyIHF1ZXJpZXMgdGhlIG1vZGVsLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZUZvbGRlcnMgdGhlIHNvdXJjZSBmb2xkZXJzIHdoZXJlIHRoZSBnZW5lcmF0ZWQgc291cmNlIGNvZGUgaXMuCisgICAgICovCisgICAgdm9pZCBhZGRKYXZhU291cmNlRm9sZGVyc1RvTW9kZWwoQE5vbk51bGwgQ29sbGVjdGlvbjxGaWxlPiBzb3VyY2VGb2xkZXJzKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgdG8gdGhlIHZhcmlhbnQgYSB0YXNrIHRoYXQgZ2VuZXJhdGVzIEphdmEgc291cmNlIGNvZGUuCisgICAgICoKKyAgICAgKiBUaGlzIHdpbGwgbWFrZSB0aGUgY29tcGlsZUphdmEgdGFzayBkZXBlbmQgb24gdGhpcyB0YXNrIGFuZCBhZGQgdGhlCisgICAgICogbmV3IHNvdXJjZSBmb2xkZXJzIGFzIGNvbXBpbGF0aW9uIGlucHV0cy4KKyAgICAgKgorICAgICAqIFRoZSBuZXcgc291cmNlIGZvbGRlcnMgYXJlIGFsc28gYWRkZWQgdG8gdGhlIG1vZGVsLgorICAgICAqCisgICAgICogQHBhcmFtIHRhc2sgdGhlIHRhc2sKKyAgICAgKiBAcGFyYW0gc291cmNlRm9sZGVycyB0aGUgc291cmNlIGZvbGRlcnMgd2hlcmUgdGhlIGdlbmVyYXRlZCBzb3VyY2UgY29kZSBpcy4KKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVySmF2YUdlbmVyYXRpbmdUYXNrKEBOb25OdWxsIFRhc2sgdGFzaywgQE5vbk51bGwgRmlsZS4uLiBzb3VyY2VGb2xkZXJzKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgdG8gdGhlIHZhcmlhbnQgYSB0YXNrIHRoYXQgZ2VuZXJhdGVzIEphdmEgc291cmNlIGNvZGUuCisgICAgICoKKyAgICAgKiBUaGlzIHdpbGwgbWFrZSB0aGUgY29tcGlsZUphdmEgdGFzayBkZXBlbmQgb24gdGhpcyB0YXNrIGFuZCBhZGQgdGhlCisgICAgICogbmV3IHNvdXJjZSBmb2xkZXJzIGFzIGNvbXBpbGF0aW9uIGlucHV0cy4KKyAgICAgKgorICAgICAqIFRoZSBuZXcgc291cmNlIGZvbGRlcnMgYXJlIGFsc28gYWRkZWQgdG8gdGhlIG1vZGVsLgorICAgICAqCisgICAgICogQHBhcmFtIHRhc2sgdGhlIHRhc2sKKyAgICAgKiBAcGFyYW0gc291cmNlRm9sZGVycyB0aGUgc291cmNlIGZvbGRlcnMgd2hlcmUgdGhlIGdlbmVyYXRlZCBzb3VyY2UgY29kZSBpcy4KKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVySmF2YUdlbmVyYXRpbmdUYXNrKEBOb25OdWxsIFRhc2sgdGFzaywgQE5vbk51bGwgQ29sbGVjdGlvbjxGaWxlPiBzb3VyY2VGb2xkZXJzKTsKIH0KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2FwaS9MaWJyYXJ5VmFyaWFudC5qYXZhIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvYXBpL0xpYnJhcnlWYXJpYW50LmphdmEKaW5kZXggNWJjZmQ5Zi4uOGRiMDc3ZCAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvYXBpL0xpYnJhcnlWYXJpYW50LmphdmEKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvYXBpL0xpYnJhcnlWYXJpYW50LmphdmEKQEAgLTE2LDEwICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmFwaTsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5EZWZhdWx0QnVpbGRUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuRGVmYXVsdFByb2R1Y3RGbGF2b3I7CiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuYnVuZGxpbmcuWmlwOwogCiAvKioKQEAgLTI4LDE5ICsyNSw2IEBACiBwdWJsaWMgaW50ZXJmYWNlIExpYnJhcnlWYXJpYW50IGV4dGVuZHMgQmFzZVZhcmlhbnQgewogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIGNvbS5hbmRyb2lkLmJ1aWxkZXIuRGVmYXVsdEJ1aWxkVHlwZX0gZm9yIHRoaXMgYnVpbGQgdmFyaWFudC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIERlZmF1bHRCdWlsZFR5cGUgZ2V0QnVpbGRUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIGNvbS5hbmRyb2lkLmJ1aWxkZXIuRGVmYXVsdFByb2R1Y3RGbGF2b3J9IHRoYXQgcmVwcmVzZW50cyB0aGUgbWVyZ2luZwotICAgICAqIG9mIHRoZSBkZWZhdWx0IGNvbmZpZyBhbmQgdGhlIGZsYXZvcnMgb2YgdGhpcyBidWlsZCB2YXJpYW50LgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgRGVmYXVsdFByb2R1Y3RGbGF2b3IgZ2V0Q29uZmlnKCk7Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBidWlsZCB2YXJpYW50IHRoYXQgd2lsbCB0ZXN0IHRoaXMgYnVpbGQgdmFyaWFudC4KICAgICAgKgogICAgICAqIFdpbGwgcmV0dXJuIG51bGwgaWYgdGhpcyBidWlsZCB2YXJpYW50IGlzIGEgdGVzdCBidWlsZCBhbHJlYWR5LgpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvQW5kcm9pZEFzY2lpUmVwb3J0UmVuZGVyZXIuamF2YSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL0FuZHJvaWRBc2NpaVJlcG9ydFJlbmRlcmVyLmphdmEKaW5kZXggMmRlNWFkMC4uNjcwNDEyOSAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvQW5kcm9pZEFzY2lpUmVwb3J0UmVuZGVyZXIuamF2YQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9BbmRyb2lkQXNjaWlSZXBvcnRSZW5kZXJlci5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgb3JnLmdyYWRsZS51dGlsLkdVdGlsOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuZ3JhZGxlLmxvZ2dpbmcuU3R5bGVkVGV4dE91dHB1dC5TdHlsZS5EZXNjcmlwdGlvbjsKQEAgLTY5LDcgKzcwLDggQEAKICAgICAgICAgcmVuZGVyZXIudmlzaXQobmV3IEFjdGlvbjxTdHlsZWRUZXh0T3V0cHV0PigpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShTdHlsZWRUZXh0T3V0cHV0IHN0eWxlZFRleHRPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBnZXRUZXh0T3V0cHV0KCkud2l0aFN0eWxlKElkZW50aWZpZXIpLnRleHQodmFyaWFudERhdGEuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBnZXRUZXh0T3V0cHV0KCkud2l0aFN0eWxlKElkZW50aWZpZXIpLnRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50RGF0YS5nZXRWYXJpYW50Q29uZmlndXJhdGlvbigpLmdldEZ1bGxOYW1lKCkpOwogICAgICAgICAgICAgICAgIGdldFRleHRPdXRwdXQoKS53aXRoU3R5bGUoRGVzY3JpcHRpb24pLnRleHQoIiIpOwogICAgICAgICAgICAgfQogICAgICAgICB9LCB0cnVlKTsKQEAgLTEzMSwxNSArMTMzLDE2IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlbmRlckNoaWxkcmVuKEBOb25OdWxsIExpc3Q8TGlicmFyeURlcGVuZGVuY3k+IGxpYnJhcmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIExpc3Q8SmFyRGVwZW5kZW5jeT4gbG9jYWxKYXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBDb2xsZWN0aW9uPEphckRlcGVuZGVuY3k+IGxvY2FsSmFycykgewogICAgICAgICByZW5kZXJlci5zdGFydENoaWxkcmVuKCk7CiAgICAgICAgIGlmIChsb2NhbEphcnMgIT0gbnVsbCkgewogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBlbXB0eUNoaWxkcmVuID0gbGlicmFyaWVzLmlzRW1wdHkoKTsKICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGxvY2FsSmFycy5zaXplKCk7CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIEphckRlcGVuZGVuY3kgamFyRGVwZW5kZW5jeSA9IGxvY2FsSmFycy5nZXQoaSk7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKEphckRlcGVuZGVuY3kgamFyRGVwZW5kZW5jeSA6IGxvY2FsSmFycykgewogICAgICAgICAgICAgICAgIHJlbmRlcihqYXJEZXBlbmRlbmN5LCBlbXB0eUNoaWxkcmVuICYmIGkgPT0gY291bnQgLSAxKTsKKyAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvQ29tcGlsZU9wdGlvbnMuZ3Jvb3Z5IGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvQ29tcGlsZU9wdGlvbnMuZ3Jvb3Z5CmluZGV4IDllZTExMGMuLmRlNzBlMzEgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL0NvbXBpbGVPcHRpb25zLmdyb292eQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9Db21waWxlT3B0aW9ucy5ncm9vdnkKQEAgLTI1LDQgKzI1LDUgQEAKIAogICAgIEphdmFWZXJzaW9uIHNvdXJjZUNvbXBhdGliaWxpdHkgPSBKYXZhVmVyc2lvbi5WRVJTSU9OXzFfNgogICAgIEphdmFWZXJzaW9uIHRhcmdldENvbXBhdGliaWxpdHkgPSBKYXZhVmVyc2lvbi5WRVJTSU9OXzFfNgorICAgIFN0cmluZyBlbmNvZGluZyA9ICJVVEYtOCIKIH0KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL0xpbnRHcmFkbGVDbGllbnQuamF2YSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL0xpbnRHcmFkbGVDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY3YjhkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvTGludEdyYWRsZUNsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5CYXNlUGx1Z2luOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQW5kcm9pZFByb2plY3Q7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5WYXJpYW50OworaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuTGludENsaUNsaWVudDsKK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50LkxpbnRDbGlGbGFnczsKK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50Lldhcm5pbmc7CitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5jbGllbnQuYXBpLklzc3VlUmVnaXN0cnk7CitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5jbGllbnQuYXBpLkxpbnRSZXF1ZXN0OworaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuZGV0ZWN0b3IuYXBpLklzc3VlOworaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuZGV0ZWN0b3IuYXBpLlByb2plY3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIExpbnRHcmFkbGVDbGllbnQgZXh0ZW5kcyBMaW50Q2xpQ2xpZW50IHsKKyAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRQcm9qZWN0IG1Nb2RlbFByb2plY3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVZhcmlhbnROYW1lOworICAgIHByaXZhdGUgZmluYWwgQmFzZVBsdWdpbiBtUGx1Z2luOworICAgIHByaXZhdGUgTGlzdDxGaWxlPiBtQ3VzdG9tUnVsZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIHB1YmxpYyBMaW50R3JhZGxlQ2xpZW50KAorICAgICAgICAgICAgQE5vbk51bGwgSXNzdWVSZWdpc3RyeSByZWdpc3RyeSwKKyAgICAgICAgICAgIEBOb25OdWxsIExpbnRDbGlGbGFncyBmbGFncywKKyAgICAgICAgICAgIEBOb25OdWxsIEJhc2VQbHVnaW4gcGx1Z2luLAorICAgICAgICAgICAgQE5vbk51bGwgQW5kcm9pZFByb2plY3QgbW9kZWxQcm9qZWN0LAorICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyB2YXJpYW50TmFtZSkgeworICAgICAgICBzdXBlcihmbGFncyk7CisgICAgICAgIG1QbHVnaW4gPSBwbHVnaW47CisgICAgICAgIG1Nb2RlbFByb2plY3QgPSBtb2RlbFByb2plY3Q7CisgICAgICAgIG1WYXJpYW50TmFtZSA9IHZhcmlhbnROYW1lOworICAgICAgICBtUmVnaXN0cnkgPSByZWdpc3RyeTsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBCYXNlUGx1Z2luIGdldFBsdWdpbigpIHsKKyAgICAgICAgcmV0dXJuIG1QbHVnaW47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tUnVsZXMoTGlzdDxGaWxlPiBjdXN0b21SdWxlcykgeworICAgICAgICBtQ3VzdG9tUnVsZXMgPSBjdXN0b21SdWxlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxGaWxlPiBmaW5kUnVsZUphcnMoQE5vbk51bGwgUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHJldHVybiBtQ3VzdG9tUnVsZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFByb2plY3QgY3JlYXRlUHJvamVjdChATm9uTnVsbCBGaWxlIGRpciwgQE5vbk51bGwgRmlsZSByZWZlcmVuY2VEaXIpIHsKKyAgICAgICAgLy8gU2hvdWxkIG5vdCBiZSBjYWxsZWQgYnkgbGludCBzaW5jZSB3ZSBzdXBwbHkgYW4gZXhwbGljaXQgc2V0IG9mIHByb2plY3RzCisgICAgICAgIC8vIHRvIHRoZSBMaW50UmVxdWVzdAorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpbGUgZ2V0U2RrSG9tZSgpIHsKKyAgICAgICAgRmlsZSBzZGtIb21lID0gbVBsdWdpbi5nZXRTZGtEaXJlY3RvcnkoKTsKKyAgICAgICAgaWYgKHNka0hvbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHNka0hvbWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFNka0hvbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATm9uTnVsbAorICAgIHByb3RlY3RlZCBMaW50UmVxdWVzdCBjcmVhdGVMaW50UmVxdWVzdChATm9uTnVsbCBMaXN0PEZpbGU+IGZpbGVzKSB7CisgICAgICAgIHJldHVybiBuZXcgTGludEdyYWRsZVJlcXVlc3QodGhpcywgbU1vZGVsUHJvamVjdCwgbVBsdWdpbiwgbVZhcmlhbnROYW1lLCBmaWxlcyk7CisgICAgfQorCisgICAgLyoqIFJ1biBsaW50IHdpdGggdGhlIGdpdmVuIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyB3YXJuaW5ncyAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIExpc3Q8V2FybmluZz4gcnVuKEBOb25OdWxsIElzc3VlUmVnaXN0cnkgcmVnaXN0cnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJ1bihyZWdpc3RyeSwgQ29sbGVjdGlvbnMuPEZpbGU+ZW1wdHlMaXN0KCkpOworICAgICAgICByZXR1cm4gbVdhcm5pbmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgbGlzdCBvZiByZXN1bHRzIGZyb20gc2VwYXJhdGUgdmFyaWFudHMsIG1lcmdlIHRoZW0gaW50byBhIHNpbmdsZQorICAgICAqIGxpc3Qgb2Ygd2FybmluZ3MsIGFuZCBtYXJrIHRoZWlyCisgICAgICogQHBhcmFtIHdhcm5pbmdNYXAgYSBtYXAgZnJvbSB2YXJpYW50IHRvIGNvcnJlc3BvbmRpbmcgd2FybmluZ3MKKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCBtb2RlbAorICAgICAqIEByZXR1cm4gYSBtZXJnZWQgbGlzdCBvZiBpc3N1ZXMKKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxXYXJuaW5nPiBtZXJnZSgKKyAgICAgICAgICAgIEBOb25OdWxsIE1hcDxWYXJpYW50LExpc3Q8V2FybmluZz4+IHdhcm5pbmdNYXAsCisgICAgICAgICAgICBATm9uTnVsbCBBbmRyb2lkUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIC8vIEVhc3kgbWVyZ2U/CisgICAgICAgIGlmICh3YXJuaW5nTWFwLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gd2FybmluZ01hcC52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgbWF4Q291bnQgPSAwOworICAgICAgICBmb3IgKExpc3Q8V2FybmluZz4gd2FybmluZ3MgOiB3YXJuaW5nTWFwLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IHdhcm5pbmdzLnNpemUoKTsKKyAgICAgICAgICAgIG1heENvdW50ID0gTWF0aC5tYXgoc2l6ZSwgbWF4Q291bnQpOworICAgICAgICB9CisgICAgICAgIGlmIChtYXhDb3VudCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgdG90YWxWYXJpYW50Q291bnQgPSBwcm9qZWN0LmdldFZhcmlhbnRzKCkuc2l6ZSgpOworCisgICAgICAgIExpc3Q8V2FybmluZz4gbWVyZ2VkID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aEV4cGVjdGVkU2l6ZSgyICogbWF4Q291bnQpOworCisgICAgICAgIC8vIE1hcCBmcm8gaXNzdWUgdG8gbWVzc2FnZSB0byBsaW5lIG51bWJlciB0byBmaWxlIG5hbWUgdG8gY2Fub25pY2FsIHdhcm5pbmcKKyAgICAgICAgTWFwPElzc3VlLE1hcDxTdHJpbmcsIE1hcDxJbnRlZ2VyLCBNYXA8U3RyaW5nLCBXYXJuaW5nPj4+PiBtYXAgPQorICAgICAgICAgICAgICAgIE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoMiAqIG1heENvdW50KTsKKworICAgICAgICBmb3IgKE1hcC5FbnRyeTxWYXJpYW50LExpc3Q8V2FybmluZz4+IGVudHJ5IDogd2FybmluZ01hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBWYXJpYW50IHZhcmlhbnQgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgIExpc3Q8V2FybmluZz4gd2FybmluZ3MgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgZm9yIChXYXJuaW5nIHdhcm5pbmcgOiB3YXJuaW5ncykgeworICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsTWFwPEludGVnZXIsTWFwPFN0cmluZyxXYXJuaW5nPj4+IG1lc3NhZ2VNYXAgPSBtYXAuZ2V0KHdhcm5pbmcuaXNzdWUpOworICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlTWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU1hcCA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgICAgICAgICAgICAgICAgICBtYXAucHV0KHdhcm5pbmcuaXNzdWUsIG1lc3NhZ2VNYXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNYXA8SW50ZWdlciwgTWFwPFN0cmluZywgV2FybmluZz4+IGxpbmVNYXAgPSBtZXNzYWdlTWFwLmdldCh3YXJuaW5nLm1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGlmIChsaW5lTWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZU1hcCA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTWFwLnB1dCh3YXJuaW5nLm1lc3NhZ2UsIGxpbmVNYXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBXYXJuaW5nPiBmaWxlTWFwID0gbGluZU1hcC5nZXQod2FybmluZy5saW5lKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZU1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVNYXAgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgbGluZU1hcC5wdXQod2FybmluZy5saW5lLCBmaWxlTWFwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gd2FybmluZy5maWxlICE9IG51bGwgPyB3YXJuaW5nLmZpbGUuZ2V0TmFtZSgpIDogIjx1bmtub3duPiI7CisgICAgICAgICAgICAgICAgV2FybmluZyBjYW5vbmljYWwgPSBmaWxlTWFwLmdldChmaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGNhbm9uaWNhbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbCA9IHdhcm5pbmc7CisgICAgICAgICAgICAgICAgICAgIGZpbGVNYXAucHV0KGZpbGVOYW1lLCBjYW5vbmljYWwpOworICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWwudmFyaWFudHMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsLmdyYWRsZVByb2plY3QgPSBwcm9qZWN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZXJnZWQuYWRkKGNhbm9uaWNhbCk7CisgICAgICAgICAgICAgICAgY2Fub25pY2FsLnZhcmlhbnRzLmFkZCh2YXJpYW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENsZWFyIG91dCB2YXJpYW50cyBvbiBhbnkgbm9kZXMgdGhhdCBkb24ndCBkZWZpbmUgYWxsCisgICAgICAgIGZvciAoV2FybmluZyB3YXJuaW5nIDogbWVyZ2VkKSB7CisgICAgICAgICAgICBpZiAod2FybmluZy52YXJpYW50cyAhPSBudWxsICYmIHdhcm5pbmcudmFyaWFudHMuc2l6ZSgpID09IHRvdGFsVmFyaWFudENvdW50KSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBlcnJvciBpcyBwcmVzZW50IGluIGFsbCB2YXJpYW50cywganVzdCBjbGVhciBpdCBvdXQKKyAgICAgICAgICAgICAgICB3YXJuaW5nLnZhcmlhbnRzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChtZXJnZWQpOworICAgICAgICByZXR1cm4gbWVyZ2VkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL0xpbnRHcmFkbGVQcm9qZWN0LmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9MaW50R3JhZGxlUHJvamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MzA0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9MaW50R3JhZGxlUHJvamVjdC5qYXZhCkBAIC0wLDAgKzEsNDYwIEBACitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uRmlsZXM7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQW5kcm9pZEFydGlmYWN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQW5kcm9pZExpYnJhcnk7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5BbmRyb2lkUHJvamVjdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkJ1aWxkVHlwZUNvbnRhaW5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkRlcGVuZGVuY2llczsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLlByb2R1Y3RGbGF2b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Qcm9kdWN0Rmxhdm9yQ29udGFpbmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuU291cmNlUHJvdmlkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5WYXJpYW50OworaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5BbmRyb2lkVGFyZ2V0SGFzaDsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZGtsaWIuQW5kcm9pZFZlcnNpb247CitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5kZXRlY3Rvci5hcGkuUHJvamVjdDsKK2ltcG9ydCBjb20uYW5kcm9pZC51dGlscy5QYWlyOworaW1wb3J0IGNvbS5hbmRyb2lkLnV0aWxzLlhtbFV0aWxzOworCitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgc3RhdGljIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIExpbnQncyB7QGxpbmsgUHJvamVjdH0gY2xhc3Mgd3JhcHBpbmcgYSBHcmFkbGUgbW9kZWwgKHByb2plY3Qgb3IKKyAqIGxpYnJhcnkpCisgKi8KK3B1YmxpYyBjbGFzcyBMaW50R3JhZGxlUHJvamVjdCBleHRlbmRzIFByb2plY3QgeworICAgIHByaXZhdGUgTGludEdyYWRsZVByb2plY3QoCisgICAgICAgICAgICBATm9uTnVsbCBMaW50R3JhZGxlQ2xpZW50IGNsaWVudCwKKyAgICAgICAgICAgIEBOb25OdWxsIEZpbGUgZGlyLAorICAgICAgICAgICAgQE5vbk51bGwgRmlsZSByZWZlcmVuY2VEaXIsCisgICAgICAgICAgICBATm9uTnVsbCBGaWxlIG1hbmlmZXN0KSB7CisgICAgICAgIHN1cGVyKGNsaWVudCwgZGlyLCByZWZlcmVuY2VEaXIpOworICAgICAgICBtR3JhZGxlUHJvamVjdCA9IHRydWU7CisgICAgICAgIG1NZXJnZU1hbmlmZXN0cyA9IHRydWU7CisgICAgICAgIG1EaXJlY3RMaWJyYXJpZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgcmVhZE1hbmlmZXN0KG1hbmlmZXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC5MaW50R3JhZGxlUHJvamVjdH0gZnJvbQorICAgICAqIHRoZSBnaXZlbiB7QGxpbmsgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5BbmRyb2lkUHJvamVjdH0gZGVmaW5pdGlvbiBmb3IKKyAgICAgKiBhIGdpdmVuIHtAbGluayBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLlZhcmlhbnR9LCBhbmQgcmV0dXJucyBpdCBhbG9uZyB3aXRoCisgICAgICogYSBzZXQgb2YgbGludCBjdXN0b20gcnVsZSBqYXJzIGFwcGxpY2FibGUgZm9yIHRoZSBnaXZlbiBtb2RlbCBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudCB0aGUgY2xpZW50CisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIG1vZGVsIHByb2plY3QKKyAgICAgKiBAcGFyYW0gdmFyaWFudCB0aGUgdmFyaWFudAorICAgICAqIEBwYXJhbSBncmFkbGVQcm9qZWN0IHRoZSBncmFkbGUgcHJvamVjdAorICAgICAqIEByZXR1cm4gYSBwYWlyIG9mIG5ldyBwcm9qZWN0IGFuZCBsaXN0IG9mIGN1c3RvbSBydWxlIGphcnMKKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBzdGF0aWMgUGFpcjxMaW50R3JhZGxlUHJvamVjdCwgTGlzdDxGaWxlPj4gY3JlYXRlKAorICAgICAgICAgICAgQE5vbk51bGwgTGludEdyYWRsZUNsaWVudCBjbGllbnQsCisgICAgICAgICAgICBATm9uTnVsbCBBbmRyb2lkUHJvamVjdCBwcm9qZWN0LAorICAgICAgICAgICAgQE5vbk51bGwgVmFyaWFudCB2YXJpYW50LAorICAgICAgICAgICAgQE5vbk51bGwgb3JnLmdyYWRsZS5hcGkuUHJvamVjdCBncmFkbGVQcm9qZWN0KSB7CisgICAgICAgIEZpbGUgZGlyID0gZ3JhZGxlUHJvamVjdC5nZXRSb290RGlyKCk7CisgICAgICAgIEFwcEdyYWRsZVByb2plY3QgbGludFByb2plY3QgPSBuZXcgQXBwR3JhZGxlUHJvamVjdChjbGllbnQsIGRpciwKKyAgICAgICAgICAgICAgICBkaXIsIHByb2plY3QsIHZhcmlhbnQpOworCisgICAgICAgIExpc3Q8RmlsZT4gY3VzdG9tUnVsZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgRmlsZSBhcHBMaW50SmFyID0gbmV3IEZpbGUoZ3JhZGxlUHJvamVjdC5nZXRCdWlsZERpcigpLAorICAgICAgICAgICAgICAgICJsaW50IiArIHNlcGFyYXRvckNoYXIgKyAibGludC5qYXIiKTsKKyAgICAgICAgaWYgKGFwcExpbnRKYXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGN1c3RvbVJ1bGVzLmFkZChhcHBMaW50SmFyKTsKKyAgICAgICAgfQorCisgICAgICAgIFNldDxBbmRyb2lkTGlicmFyeT4gbGlicmFyaWVzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICAgIERlcGVuZGVuY2llcyBkZXBlbmRlbmNpZXMgPSB2YXJpYW50LmdldE1haW5BcnRpZmFjdCgpLmdldERlcGVuZGVuY2llcygpOworICAgICAgICBmb3IgKEFuZHJvaWRMaWJyYXJ5IGxpYnJhcnkgOiBkZXBlbmRlbmNpZXMuZ2V0TGlicmFyaWVzKCkpIHsKKyAgICAgICAgICAgIGxpbnRQcm9qZWN0LmFkZERpcmVjdExpYnJhcnkoY3JlYXRlTGlicmFyeShjbGllbnQsIGxpYnJhcnksIGxpYnJhcmllcywgY3VzdG9tUnVsZXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBQYWlyLjxMaW50R3JhZGxlUHJvamVjdCxMaXN0PEZpbGU+Pm9mKGxpbnRQcm9qZWN0LCBjdXN0b21SdWxlcyk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICAvLyBEZWxpYmVyYXRlbHkgbm90IGNhbGxpbmcgc3VwZXI7IHRoYXQgY29kZSBpcyBmb3IgQURUIGNvbXBhdGliaWxpdHkKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZWFkTWFuaWZlc3QoRmlsZSBtYW5pZmVzdCkgeworICAgICAgICBpZiAobWFuaWZlc3QuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHhtbCA9IEZpbGVzLnRvU3RyaW5nKG1hbmlmZXN0LCBDaGFyc2V0cy5VVEZfOCk7CisgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBYbWxVdGlscy5wYXJzZURvY3VtZW50U2lsZW50bHkoeG1sLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByZWFkTWFuaWZlc3QoZG9jdW1lbnQpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIG1DbGllbnQubG9nKGUsICJDb3VsZCBub3QgcmVhZCBtYW5pZmVzdCAlMSRzIiwgbWFuaWZlc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNHcmFkbGVQcm9qZWN0KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIGFkZERpcmVjdExpYnJhcnkoQE5vbk51bGwgUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIG1EaXJlY3RMaWJyYXJpZXMuYWRkKHByb2plY3QpOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlicmFyeVByb2plY3QgY3JlYXRlTGlicmFyeShATm9uTnVsbCBMaW50R3JhZGxlQ2xpZW50IGNsaWVudCwKKyAgICAgICAgICAgIEBOb25OdWxsIEFuZHJvaWRMaWJyYXJ5IGxpYnJhcnksCisgICAgICAgICAgICBATm9uTnVsbCBTZXQ8QW5kcm9pZExpYnJhcnk+IHNlZW4sIExpc3Q8RmlsZT4gY3VzdG9tUnVsZXMpIHsKKyAgICAgICAgc2Vlbi5hZGQobGlicmFyeSk7CisgICAgICAgIEZpbGUgZGlyID0gbGlicmFyeS5nZXRGb2xkZXIoKTsKKyAgICAgICAgTGlicmFyeVByb2plY3QgcHJvamVjdCA9IG5ldyBMaWJyYXJ5UHJvamVjdChjbGllbnQsIGRpciwgZGlyLCBsaWJyYXJ5KTsKKworICAgICAgICBGaWxlIHJ1bGVKYXIgPSBsaWJyYXJ5LmdldExpbnRKYXIoKTsKKyAgICAgICAgaWYgKHJ1bGVKYXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGN1c3RvbVJ1bGVzLmFkZChydWxlSmFyKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoQW5kcm9pZExpYnJhcnkgZGVwZW5kZW50IDogbGlicmFyeS5nZXRMaWJyYXJ5RGVwZW5kZW5jaWVzKCkpIHsKKyAgICAgICAgICAgIGlmICghc2Vlbi5jb250YWlucyhkZXBlbmRlbnQpKSB7CisgICAgICAgICAgICAgICAgcHJvamVjdC5hZGREaXJlY3RMaWJyYXJ5KGNyZWF0ZUxpYnJhcnkoY2xpZW50LCBkZXBlbmRlbnQsIHNlZW4sIGN1c3RvbVJ1bGVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvamVjdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcHBHcmFkbGVQcm9qZWN0IGV4dGVuZHMgTGludEdyYWRsZVByb2plY3QgeworICAgICAgICBwcml2YXRlIEFuZHJvaWRQcm9qZWN0IG1Qcm9qZWN0OworICAgICAgICBwcml2YXRlIFZhcmlhbnQgbVZhcmlhbnQ7CisgICAgICAgIHByaXZhdGUgTGlzdDxTb3VyY2VQcm92aWRlcj4gbVByb3ZpZGVyczsKKworICAgICAgICBwcml2YXRlIEFwcEdyYWRsZVByb2plY3QoCisgICAgICAgICAgICAgICAgQE5vbk51bGwgTGludEdyYWRsZUNsaWVudCBjbGllbnQsCisgICAgICAgICAgICAgICAgQE5vbk51bGwgRmlsZSBkaXIsCisgICAgICAgICAgICAgICAgQE5vbk51bGwgRmlsZSByZWZlcmVuY2VEaXIsCisgICAgICAgICAgICAgICAgQE5vbk51bGwgQW5kcm9pZFByb2plY3QgcHJvamVjdCwKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBWYXJpYW50IHZhcmlhbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNsaWVudCwgZGlyLCByZWZlcmVuY2VEaXIsIHZhcmlhbnQuZ2V0TWFpbkFydGlmYWN0KCkuZ2V0R2VuZXJhdGVkTWFuaWZlc3QoKSk7CisKKyAgICAgICAgICAgIG1Qcm9qZWN0ID0gcHJvamVjdDsKKyAgICAgICAgICAgIG1WYXJpYW50ID0gdmFyaWFudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0xpYnJhcnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbVByb2plY3QuaXNMaWJyYXJ5KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFuZHJvaWRQcm9qZWN0IGdldEdyYWRsZVByb2plY3RNb2RlbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUHJvamVjdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmFyaWFudCBnZXRDdXJyZW50VmFyaWFudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVmFyaWFudDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTGlzdDxTb3VyY2VQcm92aWRlcj4gZ2V0U291cmNlUHJvdmlkZXJzKCkgeworICAgICAgICAgICAgaWYgKG1Qcm92aWRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExpc3Q8U291cmNlUHJvdmlkZXI+IHByb3ZpZGVycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIEFuZHJvaWRBcnRpZmFjdCBtYWluQXJ0aWZhY3QgPSBtVmFyaWFudC5nZXRNYWluQXJ0aWZhY3QoKTsKKworICAgICAgICAgICAgICAgIFNvdXJjZVByb3ZpZGVyIGRlZmF1bHRQcm92aWRlciA9IG1Qcm9qZWN0LmdldERlZmF1bHRDb25maWcoKS5nZXRTb3VyY2VQcm92aWRlcigpOworICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0UHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnMuYWRkKGRlZmF1bHRQcm92aWRlcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZmxhdm9yTmFtZSA6IG1WYXJpYW50LmdldFByb2R1Y3RGbGF2b3JzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChQcm9kdWN0Rmxhdm9yQ29udGFpbmVyIGZsYXZvciA6IG1Qcm9qZWN0LmdldFByb2R1Y3RGbGF2b3JzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGF2b3JOYW1lLmVxdWFscyhmbGF2b3IuZ2V0UHJvZHVjdEZsYXZvcigpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VQcm92aWRlciBwcm92aWRlciA9IGZsYXZvci5nZXRTb3VyY2VQcm92aWRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVycy5hZGQocHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNvdXJjZVByb3ZpZGVyIG11bHRpUHJvdmlkZXIgPSBtYWluQXJ0aWZhY3QuZ2V0TXVsdGlGbGF2b3JTb3VyY2VQcm92aWRlcigpOworICAgICAgICAgICAgICAgIGlmIChtdWx0aVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzLmFkZChtdWx0aVByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgYnVpbGRUeXBlTmFtZSA9IG1WYXJpYW50LmdldEJ1aWxkVHlwZSgpOworICAgICAgICAgICAgICAgIGZvciAoQnVpbGRUeXBlQ29udGFpbmVyIGJ1aWxkVHlwZSA6IG1Qcm9qZWN0LmdldEJ1aWxkVHlwZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnVpbGRUeXBlTmFtZS5lcXVhbHMoYnVpbGRUeXBlLmdldEJ1aWxkVHlwZSgpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVByb3ZpZGVyIHByb3ZpZGVyID0gYnVpbGRUeXBlLmdldFNvdXJjZVByb3ZpZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVycy5hZGQocHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTb3VyY2VQcm92aWRlciB2YXJpYW50UHJvdmlkZXIgPSAgbWFpbkFydGlmYWN0LmdldFZhcmlhbnRTb3VyY2VQcm92aWRlcigpOworICAgICAgICAgICAgICAgIGlmICh2YXJpYW50UHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnMuYWRkKHZhcmlhbnRQcm92aWRlcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVByb3ZpZGVycyA9IHByb3ZpZGVyczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlcnM7CisgICAgICAgIH0KKworICAgICAgICBATm9uTnVsbAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8RmlsZT4gZ2V0TWFuaWZlc3RGaWxlcygpIHsKKyAgICAgICAgICAgIGlmIChtTWFuaWZlc3RGaWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbU1hbmlmZXN0RmlsZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBmb3IgKFNvdXJjZVByb3ZpZGVyIHByb3ZpZGVyIDogZ2V0U291cmNlUHJvdmlkZXJzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBtYW5pZmVzdEZpbGUgPSBwcm92aWRlci5nZXRNYW5pZmVzdEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hbmlmZXN0RmlsZS5leGlzdHMoKSkgeyAvLyBtb2RlbCByZXR1cm5zIHBhdGggd2hldGhlciBvciBub3QgaXQgZXhpc3RzCisgICAgICAgICAgICAgICAgICAgICAgICBtTWFuaWZlc3RGaWxlcy5hZGQobWFuaWZlc3RGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG1NYW5pZmVzdEZpbGVzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PEZpbGU+IGdldFByb2d1YXJkRmlsZXMoKSB7CisgICAgICAgICAgICBpZiAobVByb2d1YXJkRmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFByb2R1Y3RGbGF2b3IgZmxhdm9yID0gbVByb2plY3QuZ2V0RGVmYXVsdENvbmZpZygpLmdldFByb2R1Y3RGbGF2b3IoKTsKKyAgICAgICAgICAgICAgICBtUHJvZ3VhcmRGaWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIG1Qcm9ndWFyZEZpbGVzLmFkZEFsbChmbGF2b3IuZ2V0UHJvZ3VhcmRGaWxlcygpKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIGlzIGN1cnJlbnRseSBicm9rZW46CisgICAgICAgICAgICAgICAgLy9tUHJvZ3VhcmRGaWxlcy5hZGRBbGwoZmxhdm9yLmdldENvbnN1bWVyUHJvZ3VhcmRGaWxlcygpKTsKKyAgICAgICAgICAgICAgICAvLyBJdCB3aWxsIHRocm93CisgICAgICAgICAgICAgICAgLy9vcmcuZ3JhZGxlLnRvb2xpbmcubW9kZWwuVW5zdXBwb3J0ZWRNZXRob2RFeGNlcHRpb246IFVuc3VwcG9ydGVkIG1ldGhvZDogQmFzZUNvbmZpZy5nZXRDb25zdW1lclByb2d1YXJkRmlsZXMoKS4KKyAgICAgICAgICAgICAgICAvLyAgVGhlIHZlcnNpb24gb2YgR3JhZGxlIHlvdSBjb25uZWN0IHRvIGRvZXMgbm90IHN1cHBvcnQgdGhhdCBtZXRob2QuCisgICAgICAgICAgICAgICAgLy8gIFRvIHJlc29sdmUgdGhlIHByb2JsZW0geW91IGNhbiBjaGFuZ2UvdXBncmFkZSB0aGUgdGFyZ2V0IHZlcnNpb24gb2YgR3JhZGxlIHlvdSBjb25uZWN0IHRvLgorICAgICAgICAgICAgICAgIC8vICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGlnbm9yZSB0aGlzIGV4Y2VwdGlvbiBhbmQgcmVhZCBvdGhlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtb2RlbC4KKyAgICAgICAgICAgICAgICAvL2F0IG9yZy5ncmFkbGUudG9vbGluZy5tb2RlbC5pbnRlcm5hbC5FeGNlcHRpb25zLnVuc3VwcG9ydGVkTWV0aG9kKEV4Y2VwdGlvbnMuamF2YTozMykKKyAgICAgICAgICAgICAgICAvL2F0IG9yZy5ncmFkbGUudG9vbGluZy5pbnRlcm5hbC5hZGFwdGVyLlByb3RvY29sVG9Nb2RlbEFkYXB0ZXIkSW52b2NhdGlvbkhhbmRsZXJJbXBsLmludm9rZShQcm90b2NvbFRvTW9kZWxBZGFwdGVyLmphdmE6MjM5KQorICAgICAgICAgICAgICAgIC8vYXQgY29tLnN1bi5wcm94eS4kUHJveHkxMjkuZ2V0Q29uc3VtZXJQcm9ndWFyZEZpbGVzKFVua25vd24gU291cmNlKQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbVByb2d1YXJkRmlsZXM7CisgICAgICAgIH0KKworICAgICAgICBATm9uTnVsbAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8RmlsZT4gZ2V0UmVzb3VyY2VGb2xkZXJzKCkgeworICAgICAgICAgICAgaWYgKG1SZXNvdXJjZUZvbGRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1SZXNvdXJjZUZvbGRlcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBmb3IgKFNvdXJjZVByb3ZpZGVyIHByb3ZpZGVyIDogZ2V0U291cmNlUHJvdmlkZXJzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxGaWxlPiByZXNEaXJzID0gcHJvdmlkZXIuZ2V0UmVzRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChGaWxlIHJlcyA6IHJlc0RpcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZXhpc3RzKCkpIHsgLy8gbW9kZWwgcmV0dXJucyBwYXRoIHdoZXRoZXIgb3Igbm90IGl0IGV4aXN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZUZvbGRlcnMuYWRkKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBtUmVzb3VyY2VGb2xkZXJzOworICAgICAgICB9CisKKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PEZpbGU+IGdldEphdmFTb3VyY2VGb2xkZXJzKCkgeworICAgICAgICAgICAgaWYgKG1KYXZhU291cmNlRm9sZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUphdmFTb3VyY2VGb2xkZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgZm9yIChTb3VyY2VQcm92aWRlciBwcm92aWRlciA6IGdldFNvdXJjZVByb3ZpZGVycygpKSB7CisgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248RmlsZT4gcmVzRGlycyA9IHByb3ZpZGVyLmdldEphdmFEaXJlY3RvcmllcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKEZpbGUgcmVzIDogcmVzRGlycykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5leGlzdHMoKSkgeyAvLyBtb2RlbCByZXR1cm5zIHBhdGggd2hldGhlciBvciBub3QgaXQgZXhpc3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUphdmFTb3VyY2VGb2xkZXJzLmFkZChyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbUphdmFTb3VyY2VGb2xkZXJzOworICAgICAgICB9CisKKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PEZpbGU+IGdldEphdmFDbGFzc0ZvbGRlcnMoKSB7CisgICAgICAgICAgICBpZiAobUphdmFDbGFzc0ZvbGRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1KYXZhQ2xhc3NGb2xkZXJzID0gbmV3IEFycmF5TGlzdDxGaWxlPigxKTsKKyAgICAgICAgICAgICAgICBGaWxlIG91dHB1dENsYXNzRm9sZGVyID0gbVZhcmlhbnQuZ2V0TWFpbkFydGlmYWN0KCkuZ2V0Q2xhc3Nlc0ZvbGRlcigpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRDbGFzc0ZvbGRlciAhPSBudWxsICYmIG91dHB1dENsYXNzRm9sZGVyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1KYXZhQ2xhc3NGb2xkZXJzLmFkZChvdXRwdXRDbGFzc0ZvbGRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbUphdmFDbGFzc0ZvbGRlcnM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8RmlsZT4gZ2V0SmF2YUxpYnJhcmllcygpIHsKKyAgICAgICAgICAgIGlmIChtSmF2YUxpYnJhcmllcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxGaWxlPiBqYXJzID0gbVZhcmlhbnQuZ2V0TWFpbkFydGlmYWN0KCkuZ2V0RGVwZW5kZW5jaWVzKCkuZ2V0SmFycygpOworICAgICAgICAgICAgICAgIG1KYXZhTGlicmFyaWVzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aEV4cGVjdGVkU2l6ZShqYXJzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChGaWxlIGphciA6IGphcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGphci5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUphdmFMaWJyYXJpZXMuYWRkKGphcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUphdmFMaWJyYXJpZXM7CisgICAgICAgIH0KKworICAgICAgICBATnVsbGFibGUKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZSgpIHsKKyAgICAgICAgICAgIC8vIEZvciBub3csIGxpbnQgb25seSBuZWVkcyB0aGUgbWFuaWZlc3QgcGFja2FnZTsgbm90IHRoZSBwb3RlbnRpYWxseSB2YXJpYW50IHNwZWNpZmljCisgICAgICAgICAgICAvLyBwYWNrYWdlLiBBcyBwYXJ0IG9mIHRoZSBHcmFkbGUgd29yayBvbiB0aGUgTGludCBBUEkgd2Ugc2hvdWxkIG1ha2UgdHdvIHNlcGFyYXRlCisgICAgICAgICAgICAvLyBwYWNrYWdlIGxvb2t1cCBtZXRob2RzIC0tIG9uZSBmb3IgdGhlIG1hbmlmZXN0IHBhY2thZ2UsIG9uZSBmb3IgdGhlIGJ1aWxkIHBhY2thZ2UKKyAgICAgICAgICAgIGlmIChtUGFja2FnZSA9PSBudWxsKSB7IC8vIG9ubHkgdXNlZCBhcyBhIGZhbGxiYWNrIGluIGNhc2UgbWFuaWZlc3Qgc29tZWhvdyBpcyBudWxsCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbVByb2plY3QuZ2V0RGVmYXVsdENvbmZpZygpLmdldFByb2R1Y3RGbGF2b3IoKS5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWNrYWdlTmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBtUGFja2FnZTsgLy8gZnJvbSBtYW5pZmVzdAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TWluU2RrKCkgeworICAgICAgICAgICAgaW50IG1pblNkayA9IG1Qcm9qZWN0LmdldERlZmF1bHRDb25maWcoKS5nZXRQcm9kdWN0Rmxhdm9yKCkuZ2V0TWluU2RrVmVyc2lvbigpOworICAgICAgICAgICAgaWYgKG1pblNkayAhPSAtMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtaW5TZGs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBtTWluU2RrOyAvLyBmcm9tIG1hbmlmZXN0CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRUYXJnZXRTZGsoKSB7CisgICAgICAgICAgICBpbnQgdGFyZ2V0U2RrID0gbVByb2plY3QuZ2V0RGVmYXVsdENvbmZpZygpLmdldFByb2R1Y3RGbGF2b3IoKS5nZXRUYXJnZXRTZGtWZXJzaW9uKCk7CisgICAgICAgICAgICBpZiAodGFyZ2V0U2RrICE9IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFNkazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRhcmdldFNkazsgLy8gZnJvbSBtYW5pZmVzdAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QnVpbGRTZGsoKSB7CisgICAgICAgICAgICBTdHJpbmcgY29tcGlsZVRhcmdldCA9IG1Qcm9qZWN0LmdldENvbXBpbGVUYXJnZXQoKTsKKyAgICAgICAgICAgIGlmIChjb21waWxlVGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBbmRyb2lkVmVyc2lvbiB2ZXJzaW9uID0gQW5kcm9pZFRhcmdldEhhc2guZ2V0UGxhdGZvcm1WZXJzaW9uKGNvbXBpbGVUYXJnZXQpOworICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24uZ2V0QXBpTGV2ZWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRCdWlsZFNkaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlicmFyeVByb2plY3QgZXh0ZW5kcyBMaW50R3JhZGxlUHJvamVjdCB7CisgICAgICAgIHByaXZhdGUgQW5kcm9pZExpYnJhcnkgbUxpYnJhcnk7CisKKyAgICAgICAgcHJpdmF0ZSBMaWJyYXJ5UHJvamVjdCgKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBMaW50R3JhZGxlQ2xpZW50IGNsaWVudCwKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBGaWxlIGRpciwKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBGaWxlIHJlZmVyZW5jZURpciwKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBBbmRyb2lkTGlicmFyeSBsaWJyYXJ5KSB7CisgICAgICAgICAgICBzdXBlcihjbGllbnQsIGRpciwgcmVmZXJlbmNlRGlyLCBsaWJyYXJ5LmdldE1hbmlmZXN0KCkpOworICAgICAgICAgICAgbUxpYnJhcnkgPSBsaWJyYXJ5OworCisgICAgICAgICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgZG9uJ3QgdXNlIHRoaXMgcHJvamVjdCBmb3IgYW55IHNvdXJjZSBsaWJyYXJ5IHByb2plY3RzIQorICAgICAgICAgICAgbVJlcG9ydElzc3VlcyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTGlicmFyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBbmRyb2lkTGlicmFyeSBnZXRHcmFkbGVMaWJyYXJ5TW9kZWwoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxpYnJhcnk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZhcmlhbnQgZ2V0Q3VycmVudFZhcmlhbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBOb25OdWxsCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxGaWxlPiBnZXRNYW5pZmVzdEZpbGVzKCkgeworICAgICAgICAgICAgaWYgKG1NYW5pZmVzdEZpbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGaWxlIG1hbmlmZXN0ID0gbUxpYnJhcnkuZ2V0TWFuaWZlc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3QuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmlmZXN0RmlsZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG1hbmlmZXN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTWFuaWZlc3RGaWxlcyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG1NYW5pZmVzdEZpbGVzOworICAgICAgICB9CisKKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PEZpbGU+IGdldFJlc291cmNlRm9sZGVycygpIHsKKyAgICAgICAgICAgIGlmIChtUmVzb3VyY2VGb2xkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGZvbGRlciA9IG1MaWJyYXJ5LmdldFJlc0ZvbGRlcigpOworICAgICAgICAgICAgICAgIGlmIChmb2xkZXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlRm9sZGVycyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZm9sZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VGb2xkZXJzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbVJlc291cmNlRm9sZGVyczsKKyAgICAgICAgfQorCisgICAgICAgIEBOb25OdWxsCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxGaWxlPiBnZXRKYXZhU291cmNlRm9sZGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBOb25OdWxsCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxGaWxlPiBnZXRKYXZhQ2xhc3NGb2xkZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICB9CisKKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PEZpbGU+IGdldEphdmFMaWJyYXJpZXMoKSB7CisgICAgICAgICAgICBpZiAobUphdmFMaWJyYXJpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZpbGUgamFyRmlsZSA9IG1MaWJyYXJ5LmdldEphckZpbGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoamFyRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBtSmF2YUxpYnJhcmllcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoamFyRmlsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUphdmFMaWJyYXJpZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBtSmF2YUxpYnJhcmllczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL0xpbnRHcmFkbGVSZXF1ZXN0LmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9MaW50R3JhZGxlUmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Njc0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9MaW50R3JhZGxlUmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsOworCitpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuQmFzZVBsdWdpbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkFuZHJvaWRQcm9qZWN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuVmFyaWFudDsKK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50LmNsaWVudC5hcGkuTGludFJlcXVlc3Q7CitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5kZXRlY3Rvci5hcGkuUHJvamVjdDsKK2ltcG9ydCBjb20uYW5kcm9pZC51dGlscy5QYWlyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworY2xhc3MgTGludEdyYWRsZVJlcXVlc3QgZXh0ZW5kcyBMaW50UmVxdWVzdCB7CisgICAgQE5vbk51bGwgcHJpdmF0ZSBmaW5hbCBMaW50R3JhZGxlQ2xpZW50IG1MaW50Q2xpZW50OworICAgIEBOb25OdWxsIHByaXZhdGUgZmluYWwgQmFzZVBsdWdpbiBtUGx1Z2luOworICAgIEBOb25OdWxsIHByaXZhdGUgZmluYWwgU3RyaW5nIG1WYXJpYW50TmFtZTsKKyAgICBATm9uTnVsbCBwcml2YXRlIGZpbmFsIEFuZHJvaWRQcm9qZWN0IG1Nb2RlbFByb2plY3Q7CisKKyAgICBwdWJsaWMgTGludEdyYWRsZVJlcXVlc3QoCisgICAgICAgICAgICBATm9uTnVsbCBMaW50R3JhZGxlQ2xpZW50IGNsaWVudCwKKyAgICAgICAgICAgIEBOb25OdWxsIEFuZHJvaWRQcm9qZWN0IG1vZGVsUHJvamVjdCwKKyAgICAgICAgICAgIEBOb25OdWxsIEJhc2VQbHVnaW4gcGx1Z2luLAorICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyB2YXJpYW50TmFtZSwKKyAgICAgICAgICAgIEBOb25OdWxsIExpc3Q8RmlsZT4gZmlsZXMpIHsKKyAgICAgICAgc3VwZXIoY2xpZW50LCBmaWxlcyk7CisgICAgICAgIG1MaW50Q2xpZW50ID0gY2xpZW50OworICAgICAgICBtTW9kZWxQcm9qZWN0ID0gbW9kZWxQcm9qZWN0OworICAgICAgICBtUGx1Z2luID0gcGx1Z2luOworICAgICAgICBtVmFyaWFudE5hbWUgPSB2YXJpYW50TmFtZTsKKyAgICB9CisKKyAgICBATnVsbGFibGUKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxQcm9qZWN0PiBnZXRQcm9qZWN0cygpIHsKKyAgICAgICAgaWYgKG1Qcm9qZWN0cyA9PSBudWxsKSB7CisgICAgICAgICAgICBWYXJpYW50IHZhcmlhbnQgPSBmaW5kVmFyaWFudChtTW9kZWxQcm9qZWN0LCBtVmFyaWFudE5hbWUpOworICAgICAgICAgICAgYXNzZXJ0IHZhcmlhbnQgIT0gbnVsbCA6IG1WYXJpYW50TmFtZTsKKyAgICAgICAgICAgIFBhaXI8TGludEdyYWRsZVByb2plY3QsTGlzdDxGaWxlPj4gcmVzdWx0ID0gTGludEdyYWRsZVByb2plY3QuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICBtTGludENsaWVudCwgbU1vZGVsUHJvamVjdCwgdmFyaWFudCwgbVBsdWdpbi5nZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgbVByb2plY3RzID0gQ29sbGVjdGlvbnMuPFByb2plY3Q+c2luZ2xldG9uTGlzdChyZXN1bHQuZ2V0Rmlyc3QoKSk7CisgICAgICAgICAgICBtTGludENsaWVudC5zZXRDdXN0b21SdWxlcyhyZXN1bHQuZ2V0U2Vjb25kKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1Qcm9qZWN0czsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBWYXJpYW50IGZpbmRWYXJpYW50KEBOb25OdWxsIEFuZHJvaWRQcm9qZWN0IHByb2plY3QsCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgdmFyaWFudE5hbWUpIHsKKyAgICAgICAgaWYgKHZhcmlhbnROYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoVmFyaWFudCB2YXJpYW50IDogcHJvamVjdC5nZXRWYXJpYW50cygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhcmlhbnROYW1lLmVxdWFscyh2YXJpYW50LmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvTG9nZ2VyV3JhcHBlci5ncm9vdnkgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9Mb2dnZXJXcmFwcGVyLmdyb292eQppbmRleCBjNTdmMWU4Li41NzVjMDdlIDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9Mb2dnZXJXcmFwcGVyLmdyb292eQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9Mb2dnZXJXcmFwcGVyLmdyb292eQpAQCAtMTUsNiArMTUsNyBAQAogICovCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbAogCitpbXBvcnQgY29tLmFuZHJvaWQuaWRlLmNvbW1vbi5yZXMyLk1lcmdpbmdFeGNlcHRpb24KIGltcG9ydCBjb20uYW5kcm9pZC51dGlscy5JTG9nZ2VyCiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkubG9nZ2luZy5Mb2dMZXZlbAogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLmxvZ2dpbmcuTG9nZ2VyCkBAIC0zMiw2ICszMywxNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgdm9pZCBlcnJvcihUaHJvd2FibGUgdGhyb3dhYmxlLCBTdHJpbmcgcywgT2JqZWN0Li4uIG9iamVjdHMpIHsKKyAgICAgICAgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIE1lcmdpbmdFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIC8vIE1lcmdpbmdFeGNlcHRpb25zIGhhdmUgYSBrbm93biBjYXVzZTogdGhleSBhcmVuJ3QgaW50ZXJuYWwgZXJyb3JzLCB0aGV5CisgICAgICAgICAgICAvLyBhcmUgZXJyb3JzIGluIHRoZSB1c2VyJ3MgY29kZSwgc28gYSBmdWxsIGV4Y2VwdGlvbiBpcyBub3QgaGVscGZ1bCAoYW5kCisgICAgICAgICAgICAvLyB0aGVzZSBleGNlcHRpb25zIHNob3VsZCBpbmNsdWRlIGEgcG9pbnRlciB0byB0aGUgdXNlcidzIGVycm9yIHJpZ2h0IGluCisgICAgICAgICAgICAvLyB0aGUgbWVzc2FnZSkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gRnVydGhlcm1vcmUsIHRoZXNlIGV4Y2VwdGlvbnMgYXJlIGFscmVhZHkgY2F1Z2h0IGJ5IHRoZSBNZXJnZVJlc291cmNlcworICAgICAgICAgICAgLy8gYW5kIE1lcmdlQXNzZXQgdGFza3MsIHNvIGRvbid0IGR1cGxpY2F0ZSB0aGUgb3V0cHV0CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChvYmplY3RzICE9IG51bGwgJiYgb2JqZWN0cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICBzID0gU3RyaW5nLmZvcm1hdChzLCBvYmplY3RzKQogICAgICAgICB9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9TZGsuZ3Jvb3Z5IGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvU2RrLmdyb292eQppbmRleCAwMjIyMzljLi44OGM4NzI2IDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9TZGsuZ3Jvb3Z5CisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL1Nkay5ncm9vdnkKQEAgLTQzLDYgKzQzLDcgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBpc1Nka1BhcnNlckluaXRpYWxpemVkID0gZmFsc2UKICAgICBwcml2YXRlIEZpbGUgYW5kcm9pZFNka0RpcgorICAgIHByaXZhdGUgRmlsZSBhbmRyb2lkTmRrRGlyCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzUGxhdGZvcm1TZGsgPSBmYWxzZQogICAgIHByaXZhdGUgQmFzZUV4dGVuc2lvbiBleHRlbnNpb24KIApAQCAtODAsNyArODEsNyBAQAogICAgICAgICBpZiAoaXNQbGF0Zm9ybVNkaykgewogICAgICAgICAgICAgcGFyc2VyID0gbmV3IFBsYXRmb3JtU2RrUGFyc2VyKGFuZHJvaWRTZGtEaXIuYWJzb2x1dGVQYXRoKQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyc2VyID0gbmV3IERlZmF1bHRTZGtQYXJzZXIoYW5kcm9pZFNka0Rpci5hYnNvbHV0ZVBhdGgpCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgRGVmYXVsdFNka1BhcnNlcihhbmRyb2lkU2RrRGlyLmFic29sdXRlUGF0aCwgYW5kcm9pZE5ka0RpcikKICAgICAgICAgfQogCiAgICAgICAgIExpc3Q8RmlsZT4gcmVwb3NpdG9yaWVzID0gcGFyc2VyLnJlcG9zaXRvcmllcwpAQCAtMTMwLDExICsxMzEsMTYgQEAKICAgICAgICAgcmV0dXJuIHRoZVBhcnNlcgogICAgIH0KIAotICAgIHB1YmxpYyBGaWxlIGdldERpcmVjdG9yeSgpIHsKKyAgICBwdWJsaWMgRmlsZSBnZXRTZGtEaXJlY3RvcnkoKSB7CiAgICAgICAgIGNoZWNrTG9jYXRpb24oKQogICAgICAgICByZXR1cm4gYW5kcm9pZFNka0RpcgogICAgIH0KIAorICAgIHB1YmxpYyBGaWxlIGdldE5ka0RpcmVjdG9yeSgpIHsKKyAgICAgICAgY2hlY2tMb2NhdGlvbigpCisgICAgICAgIHJldHVybiBhbmRyb2lkTmRrRGlyCisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrTG9jYXRpb24oKSB7CiAgICAgICAgIC8vIGRvbid0IGNvbXBsYWluIGluIHRlc3QgbW9kZQogICAgICAgICBpZiAoVEVTVF9TREtfRElSICE9IG51bGwpIHsKQEAgLTE3OSw2ICsxODUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gc2RrLmRpciBwcm9wZXJ0eSBkZWZpbmVkIGluIGxvY2FsLnByb3BlcnRpZXMgZmlsZS4iKQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmIG5ka0RpclByb3AgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCduZGsuZGlyJykKKyAgICAgICAgICAgIGlmIChuZGtEaXJQcm9wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhbmRyb2lkTmRrRGlyID0gbmV3IEZpbGUobmRrRGlyUHJvcCkKKyAgICAgICAgICAgIH0KKwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgU3RyaW5nIGVudlZhciA9IFN5c3RlbS5nZXRlbnYoIkFORFJPSURfSE9NRSIpCiAgICAgICAgICAgICBpZiAoZW52VmFyICE9IG51bGwpIHsKQEAgLTE4OSw2ICsyMDEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZFNka0RpciA9IG5ldyBGaWxlKHByb3BlcnR5KQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW52VmFyID0gU3lzdGVtLmdldGVudigiQU5EUk9JRF9OREtfSE9NRSIpCisgICAgICAgICAgICBpZiAoZW52VmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhbmRyb2lkTmRrRGlyID0gbmV3IEZpbGUoZW52VmFyKQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvU291cmNlU2V0U291cmNlUHJvdmlkZXJXcmFwcGVyLmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9Tb3VyY2VTZXRTb3VyY2VQcm92aWRlcldyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2MzZjdjCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvU291cmNlU2V0U291cmNlUHJvdmlkZXJXcmFwcGVyLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsOworCitpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLlNvdXJjZVByb3ZpZGVyOworaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLlNvdXJjZVNldDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgU291cmNlUHJvdmlkZXIgdGhhdCdzIHdyYXBwZXIgYXJvdW5kIGEgSmF2YSBTb3VyY2VTZXQuCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGhlIGNhc2Ugd2hlcmUgd2Ugc3RvcmUgU291cmNlUHJvdmlkZXJzIGJ1dCBkb24ndCB3YW50IHRvCisgKiBxdWVyeSB0aGUgY29udGVudCBvZiB0aGUgU291cmNlU2V0IGF0IHRoZSBtb21lbnQgdGhlIFNvdXJjZVByb3ZpZGVyIGlzIGNyZWF0ZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBTb3VyY2VTZXRTb3VyY2VQcm92aWRlcldyYXBwZXIgaW1wbGVtZW50cyBTb3VyY2VQcm92aWRlciB7CisKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgU291cmNlU2V0IHNvdXJjZVNldDsKKworICAgIHB1YmxpYyBTb3VyY2VTZXRTb3VyY2VQcm92aWRlcldyYXBwZXIoQE5vbk51bGwgU291cmNlU2V0IHNvdXJjZVNldCkgeworCisgICAgICAgIHRoaXMuc291cmNlU2V0ID0gc291cmNlU2V0OworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpbGUgZ2V0TWFuaWZlc3RGaWxlKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFjY2Vzc0Vycm9yKCJTaG91bGRuJ3QgYWNjZXNzIG1hbmlmZXN0IGZyb20gU291cmNlU2V0U291cmNlUHJvdmlkZXJXcmFwcGVyIik7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxGaWxlPiBnZXRKYXZhRGlyZWN0b3JpZXMoKSB7CisgICAgICAgIHJldHVybiBzb3VyY2VTZXQuZ2V0QWxsSmF2YSgpLmdldFNyY0RpcnMoKTsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPEZpbGU+IGdldFJlc291cmNlc0RpcmVjdG9yaWVzKCkgeworICAgICAgICByZXR1cm4gc291cmNlU2V0LmdldFJlc291cmNlcygpLmdldFNyY0RpcnMoKTsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPEZpbGU+IGdldEFpZGxEaXJlY3RvcmllcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248RmlsZT4gZ2V0UmVuZGVyc2NyaXB0RGlyZWN0b3JpZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPEZpbGU+IGdldEpuaURpcmVjdG9yaWVzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxGaWxlPiBnZXRSZXNEaXJlY3RvcmllcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248RmlsZT4gZ2V0QXNzZXRzRGlyZWN0b3JpZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9hcGkvQXBwbGljYXRpb25WYXJpYW50SW1wbC5qYXZhIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvYXBpL0FwcGxpY2F0aW9uVmFyaWFudEltcGwuamF2YQppbmRleCBlZmJiYWQzLi5mY2MzZDBiIDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9hcGkvQXBwbGljYXRpb25WYXJpYW50SW1wbC5qYXZhCisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL2FwaS9BcHBsaWNhdGlvblZhcmlhbnRJbXBsLmphdmEKQEAgLTIxLDIzICsyMSwxMyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5hcGkuQXBwbGljYXRpb25WYXJpYW50OwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5hcGkuVGVzdFZhcmlhbnQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLnZhcmlhbnQuQXBwbGljYXRpb25WYXJpYW50RGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuQWlkbENvbXBpbGU7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLnZhcmlhbnQuQmFzZVZhcmlhbnREYXRhOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5EZXg7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLkdlbmVyYXRlQnVpbGRDb25maWc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLk1lcmdlQXNzZXRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5NZXJnZVJlc291cmNlczsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuUGFja2FnZUFwcGxpY2F0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5Qcm9jZXNzQW5kcm9pZFJlc291cmNlczsKLWltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuUHJvY2Vzc01hbmlmZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5SZW5kZXJzY3JpcHRDb21waWxlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5aaXBBbGlnbjsKLWltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLkRlZmF1bHRCdWlsZFR5cGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5EZWZhdWx0UHJvZHVjdEZsYXZvcjsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLlNpZ25pbmdDb25maWc7CiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkuRGVmYXVsdFRhc2s7Ci1pbXBvcnQgb3JnLmdyYWRsZS5hcGkuVGFzazsKLWltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5Db3B5OwotaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLmNvbXBpbGUuSmF2YUNvbXBpbGU7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC00Niw3ICszNiw3IEBACiAgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIEFwcGxpY2F0aW9uVmFyaWFudH0gaW50ZXJmYWNlIGFyb3VuZCBhbgogICoge0BsaW5rIEFwcGxpY2F0aW9uVmFyaWFudERhdGF9IG9iamVjdC4KICAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uVmFyaWFudEltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvblZhcmlhbnQgeworcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uVmFyaWFudEltcGwgZXh0ZW5kcyBCYXNlVmFyaWFudEltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvblZhcmlhbnQgewogCiAgICAgQE5vbk51bGwKICAgICBwcml2YXRlIGZpbmFsIEFwcGxpY2F0aW9uVmFyaWFudERhdGEgdmFyaWFudERhdGE7CkBAIC01Nyw0MiArNDcsMTcgQEAKICAgICAgICAgdGhpcy52YXJpYW50RGF0YSA9IHZhcmlhbnREYXRhOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBCYXNlVmFyaWFudERhdGEgZ2V0VmFyaWFudERhdGEoKSB7CisgICAgICAgIHJldHVybiB2YXJpYW50RGF0YTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBzZXRUZXN0VmFyaWFudChATnVsbGFibGUgVGVzdFZhcmlhbnQgdGVzdFZhcmlhbnQpIHsKICAgICAgICAgdGhpcy50ZXN0VmFyaWFudCA9IHRlc3RWYXJpYW50OwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIEBOb25OdWxsCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBOb25OdWxsCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgU3RyaW5nIGdldERpck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5nZXREaXJOYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEuZ2V0QmFzZU5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBEZWZhdWx0QnVpbGRUeXBlIGdldEJ1aWxkVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLmdldFZhcmlhbnRDb25maWd1cmF0aW9uKCkuZ2V0QnVpbGRUeXBlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKICAgICBwdWJsaWMgTGlzdDxEZWZhdWx0UHJvZHVjdEZsYXZvcj4gZ2V0UHJvZHVjdEZsYXZvcnMoKSB7CiAgICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5nZXRWYXJpYW50Q29uZmlndXJhdGlvbigpLmdldEZsYXZvckNvbmZpZ3MoKTsKICAgICB9CkBAIC0xMDQsMTIgKzY5LDYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBGaWxlIGdldE91dHB1dEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5nZXRPdXRwdXRGaWxlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RmlsZShATm9uTnVsbCBGaWxlIG91dHB1dEZpbGUpIHsKICAgICAgICAgaWYgKHZhcmlhbnREYXRhLnppcEFsaWduVGFzayAhPSBudWxsKSB7CiAgICAgICAgICAgICB2YXJpYW50RGF0YS56aXBBbGlnblRhc2suc2V0T3V0cHV0RmlsZShvdXRwdXRGaWxlKTsKQEAgLTEyNSw1NyArODQsNiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIEBOb25OdWxsCi0gICAgcHVibGljIFByb2Nlc3NNYW5pZmVzdCBnZXRQcm9jZXNzTWFuaWZlc3QoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5wcm9jZXNzTWFuaWZlc3RUYXNrOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBOb25OdWxsCi0gICAgcHVibGljIEFpZGxDb21waWxlIGdldEFpZGxDb21waWxlKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEuYWlkbENvbXBpbGVUYXNrOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBOb25OdWxsCi0gICAgcHVibGljIFJlbmRlcnNjcmlwdENvbXBpbGUgZ2V0UmVuZGVyc2NyaXB0Q29tcGlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLnJlbmRlcnNjcmlwdENvbXBpbGVUYXNrOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZXJnZVJlc291cmNlcyBnZXRNZXJnZVJlc291cmNlcygpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLm1lcmdlUmVzb3VyY2VzVGFzazsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVyZ2VBc3NldHMgZ2V0TWVyZ2VBc3NldHMoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5tZXJnZUFzc2V0c1Rhc2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgUHJvY2Vzc0FuZHJvaWRSZXNvdXJjZXMgZ2V0UHJvY2Vzc1Jlc291cmNlcygpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLnByb2Nlc3NSZXNvdXJjZXNUYXNrOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBHZW5lcmF0ZUJ1aWxkQ29uZmlnIGdldEdlbmVyYXRlQnVpbGRDb25maWcoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5nZW5lcmF0ZUJ1aWxkQ29uZmlnVGFzazsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBKYXZhQ29tcGlsZSBnZXRKYXZhQ29tcGlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLmphdmFDb21waWxlVGFzazsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBDb3B5IGdldFByb2Nlc3NKYXZhUmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEucHJvY2Vzc0phdmFSZXNvdXJjZXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERleCBnZXREZXgoKSB7CiAgICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5kZXhUYXNrOwogICAgIH0KQEAgLTE5MSwxMSArOTksNiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUYXNrIGdldEFzc2VtYmxlKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEuYXNzZW1ibGVUYXNrOwotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBEZWZhdWx0VGFzayBnZXRJbnN0YWxsKCkgewogICAgICAgICByZXR1cm4gdmFyaWFudERhdGEuaW5zdGFsbFRhc2s7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvYXBpL0Jhc2VWYXJpYW50SW1wbC5qYXZhIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvYXBpL0Jhc2VWYXJpYW50SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NGZlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9hcGkvQmFzZVZhcmlhbnRJbXBsLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC5hcGk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5hcGkuQmFzZVZhcmlhbnQ7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLnZhcmlhbnQuQmFzZVZhcmlhbnREYXRhOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5BaWRsQ29tcGlsZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuR2VuZXJhdGVCdWlsZENvbmZpZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuTWVyZ2VBc3NldHM7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLk1lcmdlUmVzb3VyY2VzOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5Qcm9jZXNzQW5kcm9pZFJlc291cmNlczsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuUHJvY2Vzc01hbmlmZXN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5SZW5kZXJzY3JpcHRDb21waWxlOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuRGVmYXVsdEJ1aWxkVHlwZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLkRlZmF1bHRQcm9kdWN0Rmxhdm9yOworaW1wb3J0IG9yZy5ncmFkbGUuYXBpLlRhc2s7CitpbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuQ29weTsKK2ltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5jb21waWxlLkphdmFDb21waWxlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCithYnN0cmFjdCBjbGFzcyBCYXNlVmFyaWFudEltcGwgaW1wbGVtZW50cyBCYXNlVmFyaWFudCB7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQmFzZVZhcmlhbnREYXRhIGdldFZhcmlhbnREYXRhKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhcmlhbnREYXRhKCkuZ2V0VmFyaWFudENvbmZpZ3VyYXRpb24oKS5nZXRGdWxsTmFtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOb25OdWxsCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhcmlhbnREYXRhKCkuZ2V0RGVzY3JpcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhcmlhbnREYXRhKCkuZ2V0VmFyaWFudENvbmZpZ3VyYXRpb24oKS5nZXREaXJOYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0VmFyaWFudERhdGEoKS5nZXRWYXJpYW50Q29uZmlndXJhdGlvbigpLmdldEJhc2VOYW1lKCk7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZsYXZvck5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRWYXJpYW50RGF0YSgpLmdldFZhcmlhbnRDb25maWd1cmF0aW9uKCkuZ2V0Rmxhdm9yTmFtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOb25OdWxsCisgICAgcHVibGljIERlZmF1bHRCdWlsZFR5cGUgZ2V0QnVpbGRUeXBlKCkgeworICAgICAgICByZXR1cm4gZ2V0VmFyaWFudERhdGEoKS5nZXRWYXJpYW50Q29uZmlndXJhdGlvbigpLmdldEJ1aWxkVHlwZSgpOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERlZmF1bHRQcm9kdWN0Rmxhdm9yIGdldENvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhcmlhbnREYXRhKCkuZ2V0VmFyaWFudENvbmZpZ3VyYXRpb24oKS5nZXREZWZhdWx0Q29uZmlnKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgRmlsZSBnZXRPdXRwdXRGaWxlKCkgeworICAgICAgICByZXR1cm4gZ2V0VmFyaWFudERhdGEoKS5nZXRPdXRwdXRGaWxlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgUHJvY2Vzc01hbmlmZXN0IGdldFByb2Nlc3NNYW5pZmVzdCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhcmlhbnREYXRhKCkucHJvY2Vzc01hbmlmZXN0VGFzazsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBBaWRsQ29tcGlsZSBnZXRBaWRsQ29tcGlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhcmlhbnREYXRhKCkuYWlkbENvbXBpbGVUYXNrOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOb25OdWxsCisgICAgcHVibGljIFJlbmRlcnNjcmlwdENvbXBpbGUgZ2V0UmVuZGVyc2NyaXB0Q29tcGlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhcmlhbnREYXRhKCkucmVuZGVyc2NyaXB0Q29tcGlsZVRhc2s7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lcmdlUmVzb3VyY2VzIGdldE1lcmdlUmVzb3VyY2VzKCkgeworICAgICAgICByZXR1cm4gZ2V0VmFyaWFudERhdGEoKS5tZXJnZVJlc291cmNlc1Rhc2s7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lcmdlQXNzZXRzIGdldE1lcmdlQXNzZXRzKCkgeworICAgICAgICByZXR1cm4gZ2V0VmFyaWFudERhdGEoKS5tZXJnZUFzc2V0c1Rhc2s7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgUHJvY2Vzc0FuZHJvaWRSZXNvdXJjZXMgZ2V0UHJvY2Vzc1Jlc291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhcmlhbnREYXRhKCkucHJvY2Vzc1Jlc291cmNlc1Rhc2s7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEdlbmVyYXRlQnVpbGRDb25maWcgZ2V0R2VuZXJhdGVCdWlsZENvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhcmlhbnREYXRhKCkuZ2VuZXJhdGVCdWlsZENvbmZpZ1Rhc2s7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgSmF2YUNvbXBpbGUgZ2V0SmF2YUNvbXBpbGUoKSB7CisgICAgICAgIHJldHVybiBnZXRWYXJpYW50RGF0YSgpLmphdmFDb21waWxlVGFzazsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBDb3B5IGdldFByb2Nlc3NKYXZhUmVzb3VyY2VzKCkgeworICAgICAgICByZXR1cm4gZ2V0VmFyaWFudERhdGEoKS5wcm9jZXNzSmF2YVJlc291cmNlc1Rhc2s7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFRhc2sgZ2V0QXNzZW1ibGUoKSB7CisgICAgICAgIHJldHVybiBnZXRWYXJpYW50RGF0YSgpLmFzc2VtYmxlVGFzazsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRKYXZhU291cmNlRm9sZGVyc1RvTW9kZWwoQE5vbk51bGwgRmlsZS4uLiBnZW5lcmF0ZWRTb3VyY2VGb2xkZXJzKSB7CisgICAgICAgIGdldFZhcmlhbnREYXRhKCkuYWRkSmF2YVNvdXJjZUZvbGRlcnNUb01vZGVsKGdlbmVyYXRlZFNvdXJjZUZvbGRlcnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZEphdmFTb3VyY2VGb2xkZXJzVG9Nb2RlbChATm9uTnVsbCBDb2xsZWN0aW9uPEZpbGU+IGdlbmVyYXRlZFNvdXJjZUZvbGRlcnMpIHsKKyAgICAgICAgZ2V0VmFyaWFudERhdGEoKS5hZGRKYXZhU291cmNlRm9sZGVyc1RvTW9kZWwoZ2VuZXJhdGVkU291cmNlRm9sZGVycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJKYXZhR2VuZXJhdGluZ1Rhc2soQE5vbk51bGwgVGFzayB0YXNrLCBATm9uTnVsbCBGaWxlLi4uIHNvdXJjZUZvbGRlcnMpIHsKKyAgICAgICAgZ2V0VmFyaWFudERhdGEoKS5yZWdpc3RlckphdmFHZW5lcmF0aW5nVGFzayh0YXNrLCBzb3VyY2VGb2xkZXJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckphdmFHZW5lcmF0aW5nVGFzayhATm9uTnVsbCBUYXNrIHRhc2ssIEBOb25OdWxsIENvbGxlY3Rpb248RmlsZT4gc291cmNlRm9sZGVycykgeworICAgICAgICBnZXRWYXJpYW50RGF0YSgpLnJlZ2lzdGVySmF2YUdlbmVyYXRpbmdUYXNrKHRhc2ssIHNvdXJjZUZvbGRlcnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL2FwaS9EZWZhdWx0QW5kcm9pZFNvdXJjZVNldC5qYXZhIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvYXBpL0RlZmF1bHRBbmRyb2lkU291cmNlU2V0LmphdmEKaW5kZXggYWFiNDE0Ni4uMDUyMGZhNSAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvYXBpL0RlZmF1bHRBbmRyb2lkU291cmNlU2V0LmphdmEKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvYXBpL0RlZmF1bHRBbmRyb2lkU291cmNlU2V0LmphdmEKQEAgLTI2Nyw3ICsyNjcsNiBAQAogCiAgICAgLy8gLS0tIFNvdXJjZVByb3ZpZGVyCiAKLQogICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNldDxGaWxlPiBnZXRKYXZhRGlyZWN0b3JpZXMoKSB7CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9hcGkvTGlicmFyeVZhcmlhbnRJbXBsLmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9hcGkvTGlicmFyeVZhcmlhbnRJbXBsLmphdmEKaW5kZXggYTRhY2ZkNi4uZjQ4YTUyOSAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvYXBpL0xpYnJhcnlWYXJpYW50SW1wbC5qYXZhCisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL2FwaS9MaWJyYXJ5VmFyaWFudEltcGwuamF2YQpAQCAtMjAsMjAgKzIwLDkgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuYXBpLkxpYnJhcnlWYXJpYW50OwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5hcGkuVGVzdFZhcmlhbnQ7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLnZhcmlhbnQuQmFzZVZhcmlhbnREYXRhOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC52YXJpYW50LkxpYnJhcnlWYXJpYW50RGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuQWlkbENvbXBpbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLkdlbmVyYXRlQnVpbGRDb25maWc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLk1lcmdlQXNzZXRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5NZXJnZVJlc291cmNlczsKLWltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuUHJvY2Vzc0FuZHJvaWRSZXNvdXJjZXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLlByb2Nlc3NNYW5pZmVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuUmVuZGVyc2NyaXB0Q29tcGlsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLkRlZmF1bHRCdWlsZFR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5EZWZhdWx0UHJvZHVjdEZsYXZvcjsKLWltcG9ydCBvcmcuZ3JhZGxlLmFwaS5UYXNrOwotaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLkNvcHk7CiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuYnVuZGxpbmcuWmlwOwotaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLmNvbXBpbGUuSmF2YUNvbXBpbGU7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiAKQEAgLTQxLDcgKzMwLDcgQEAKICAqIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgTGlicmFyeVZhcmlhbnR9IGludGVyZmFjZSBhcm91bmQgYQogICoge0BsaW5rIExpYnJhcnlWYXJpYW50RGF0YX0gb2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZhcmlhbnRJbXBsIGltcGxlbWVudHMgTGlicmFyeVZhcmlhbnQgeworcHVibGljIGNsYXNzIExpYnJhcnlWYXJpYW50SW1wbCBleHRlbmRzIEJhc2VWYXJpYW50SW1wbCBpbXBsZW1lbnRzIExpYnJhcnlWYXJpYW50IHsKIAogICAgIEBOb25OdWxsCiAgICAgcHJpdmF0ZSBmaW5hbCBMaWJyYXJ5VmFyaWFudERhdGEgdmFyaWFudERhdGE7CkBAIC01Miw0OCArNDEsMTcgQEAKICAgICAgICAgdGhpcy52YXJpYW50RGF0YSA9IHZhcmlhbnREYXRhOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBCYXNlVmFyaWFudERhdGEgZ2V0VmFyaWFudERhdGEoKSB7CisgICAgICAgIHJldHVybiB2YXJpYW50RGF0YTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBzZXRUZXN0VmFyaWFudChATnVsbGFibGUgVGVzdFZhcmlhbnQgdGVzdFZhcmlhbnQpIHsKICAgICAgICAgdGhpcy50ZXN0VmFyaWFudCA9IHRlc3RWYXJpYW50OwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIEBOb25OdWxsCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBOb25OdWxsCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgU3RyaW5nIGdldERpck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5nZXREaXJOYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEuZ2V0QmFzZU5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBEZWZhdWx0QnVpbGRUeXBlIGdldEJ1aWxkVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLmdldFZhcmlhbnRDb25maWd1cmF0aW9uKCkuZ2V0QnVpbGRUeXBlKCk7Ci0gICAgfQotCi0gICAgQE5vbk51bGwKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRGVmYXVsdFByb2R1Y3RGbGF2b3IgZ2V0Q29uZmlnKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEuZ2V0VmFyaWFudENvbmZpZ3VyYXRpb24oKS5nZXREZWZhdWx0Q29uZmlnKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKICAgICBwdWJsaWMgRmlsZSBnZXRPdXRwdXRGaWxlKCkgewogICAgICAgICByZXR1cm4gdmFyaWFudERhdGEucGFja2FnZUxpYlRhc2suZ2V0QXJjaGl2ZVBhdGgoKTsKICAgICB9CkBAIC0xMTEsNjMgKzY5LDcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBQcm9jZXNzTWFuaWZlc3QgZ2V0UHJvY2Vzc01hbmlmZXN0KCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEucHJvY2Vzc01hbmlmZXN0VGFzazsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBBaWRsQ29tcGlsZSBnZXRBaWRsQ29tcGlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLmFpZGxDb21waWxlVGFzazsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSZW5kZXJzY3JpcHRDb21waWxlIGdldFJlbmRlcnNjcmlwdENvbXBpbGUoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5yZW5kZXJzY3JpcHRDb21waWxlVGFzazsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVyZ2VSZXNvdXJjZXMgZ2V0TWVyZ2VSZXNvdXJjZXMoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5tZXJnZVJlc291cmNlc1Rhc2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lcmdlQXNzZXRzIGdldE1lcmdlQXNzZXRzKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEubWVyZ2VBc3NldHNUYXNrOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBOb25OdWxsCi0gICAgcHVibGljIFByb2Nlc3NBbmRyb2lkUmVzb3VyY2VzIGdldFByb2Nlc3NSZXNvdXJjZXMoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5wcm9jZXNzUmVzb3VyY2VzVGFzazsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgR2VuZXJhdGVCdWlsZENvbmZpZyBnZXRHZW5lcmF0ZUJ1aWxkQ29uZmlnKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEuZ2VuZXJhdGVCdWlsZENvbmZpZ1Rhc2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgSmF2YUNvbXBpbGUgZ2V0SmF2YUNvbXBpbGUoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5qYXZhQ29tcGlsZVRhc2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgQ29weSBnZXRQcm9jZXNzSmF2YVJlc291cmNlcygpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLnByb2Nlc3NKYXZhUmVzb3VyY2VzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBaaXAgZ2V0UGFja2FnZUxpYnJhcnkoKSB7CiAgICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5wYWNrYWdlTGliVGFzazsKICAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGFzayBnZXRBc3NlbWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLmFzc2VtYmxlVGFzazsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9hcGkvVGVzdFZhcmlhbnRJbXBsLmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9hcGkvVGVzdFZhcmlhbnRJbXBsLmphdmEKaW5kZXggMzA1YzJlNS4uMDczYzQ5ZCAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvYXBpL1Rlc3RWYXJpYW50SW1wbC5qYXZhCisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL2FwaS9UZXN0VmFyaWFudEltcGwuamF2YQpAQCAtMTksMjQgKzE5LDE0IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuYXBpLkJhc2VWYXJpYW50OwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5hcGkuVGVzdFZhcmlhbnQ7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLnZhcmlhbnQuQmFzZVZhcmlhbnREYXRhOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC52YXJpYW50LlRlc3RWYXJpYW50RGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuQWlkbENvbXBpbGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLkRleDsKLWltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuR2VuZXJhdGVCdWlsZENvbmZpZzsKLWltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuTWVyZ2VBc3NldHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLk1lcmdlUmVzb3VyY2VzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5QYWNrYWdlQXBwbGljYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLlByb2Nlc3NBbmRyb2lkUmVzb3VyY2VzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5Qcm9jZXNzTWFuaWZlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLlJlbmRlcnNjcmlwdENvbXBpbGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLlppcEFsaWduOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuRGVmYXVsdEJ1aWxkVHlwZTsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLkRlZmF1bHRQcm9kdWN0Rmxhdm9yOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuU2lnbmluZ0NvbmZpZzsKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS5EZWZhdWx0VGFzazsKLWltcG9ydCBvcmcuZ3JhZGxlLmFwaS5UYXNrOwotaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLkNvcHk7Ci1pbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuY29tcGlsZS5KYXZhQ29tcGlsZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTQ0LDcgKzM0LDcgQEAKIC8qKgogICogaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBUZXN0VmFyaWFudH0gaW50ZXJmYWNlIGFyb3VuZCBhbiB7QGxpbmsgVGVzdFZhcmlhbnREYXRhfSBvYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBUZXN0VmFyaWFudEltcGwgaW1wbGVtZW50cyBUZXN0VmFyaWFudCB7CitwdWJsaWMgY2xhc3MgVGVzdFZhcmlhbnRJbXBsIGV4dGVuZHMgQmFzZVZhcmlhbnRJbXBsIGltcGxlbWVudHMgVGVzdFZhcmlhbnQgewogCiAgICAgQE5vbk51bGwKICAgICBwcml2YXRlIGZpbmFsIFRlc3RWYXJpYW50RGF0YSB2YXJpYW50RGF0YTsKQEAgLTU2LDMzICs0Niw4IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLmdldERpck5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5nZXRCYXNlTmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBOb25OdWxsCi0gICAgcHVibGljIERlZmF1bHRCdWlsZFR5cGUgZ2V0QnVpbGRUeXBlKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEuZ2V0VmFyaWFudENvbmZpZ3VyYXRpb24oKS5nZXRCdWlsZFR5cGUoKTsKKyAgICBwcm90ZWN0ZWQgQmFzZVZhcmlhbnREYXRhIGdldFZhcmlhbnREYXRhKCkgeworICAgICAgICByZXR1cm4gdmFyaWFudERhdGE7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC05OCwxMiArNjMsNiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIEBOb25OdWxsCi0gICAgcHVibGljIEZpbGUgZ2V0T3V0cHV0RmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLmdldE91dHB1dEZpbGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWxlKEBOb25OdWxsIEZpbGUgb3V0cHV0RmlsZSkgewogICAgICAgICBpZiAodmFyaWFudERhdGEuemlwQWxpZ25UYXNrICE9IG51bGwpIHsKICAgICAgICAgICAgIHZhcmlhbnREYXRhLnppcEFsaWduVGFzay5zZXRPdXRwdXRGaWxlKG91dHB1dEZpbGUpOwpAQCAtMTIzLDU3ICs4Miw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgUHJvY2Vzc01hbmlmZXN0IGdldFByb2Nlc3NNYW5pZmVzdCgpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLnByb2Nlc3NNYW5pZmVzdFRhc2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgQWlkbENvbXBpbGUgZ2V0QWlkbENvbXBpbGUoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5haWRsQ29tcGlsZVRhc2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgUmVuZGVyc2NyaXB0Q29tcGlsZSBnZXRSZW5kZXJzY3JpcHRDb21waWxlKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEucmVuZGVyc2NyaXB0Q29tcGlsZVRhc2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lcmdlUmVzb3VyY2VzIGdldE1lcmdlUmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEubWVyZ2VSZXNvdXJjZXNUYXNrOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZXJnZUFzc2V0cyBnZXRNZXJnZUFzc2V0cygpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLm1lcmdlQXNzZXRzVGFzazsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBQcm9jZXNzQW5kcm9pZFJlc291cmNlcyBnZXRQcm9jZXNzUmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEucHJvY2Vzc1Jlc291cmNlc1Rhc2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEdlbmVyYXRlQnVpbGRDb25maWcgZ2V0R2VuZXJhdGVCdWlsZENvbmZpZygpIHsKLSAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLmdlbmVyYXRlQnVpbGRDb25maWdUYXNrOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBOb25OdWxsCi0gICAgcHVibGljIEphdmFDb21waWxlIGdldEphdmFDb21waWxlKCkgewotICAgICAgICByZXR1cm4gdmFyaWFudERhdGEuamF2YUNvbXBpbGVUYXNrOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBOb25OdWxsCi0gICAgcHVibGljIENvcHkgZ2V0UHJvY2Vzc0phdmFSZXNvdXJjZXMoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5wcm9jZXNzSmF2YVJlc291cmNlczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRGV4IGdldERleCgpIHsKICAgICAgICAgcmV0dXJuIHZhcmlhbnREYXRhLmRleFRhc2s7CiAgICAgfQpAQCAtMTg5LDExICs5Nyw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFRhc2sgZ2V0QXNzZW1ibGUoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5hc3NlbWJsZVRhc2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERlZmF1bHRUYXNrIGdldEluc3RhbGwoKSB7CiAgICAgICAgIHJldHVybiB2YXJpYW50RGF0YS5pbnN0YWxsVGFzazsKICAgICB9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9kc2wvQWFwdE9wdGlvbnNJbXBsLmdyb292eSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL2RzbC9BYXB0T3B0aW9uc0ltcGwuZ3Jvb3Z5CmluZGV4IDQ0OWE0M2YuLmQ1MDM3MWUgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL2RzbC9BYXB0T3B0aW9uc0ltcGwuZ3Jvb3Z5CisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL2RzbC9BYXB0T3B0aW9uc0ltcGwuZ3Jvb3Z5CkBAIC00NSw3ICs0NSw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgTGlzdDxTdHJpbmc+IGdldE5vQ29tcHJlc3MoKSB7CisgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGdldE5vQ29tcHJlc3MoKSB7CiAgICAgICAgIHJldHVybiBub0NvbXByZXNzTGlzdAogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvZHNsL0J1aWxkVHlwZURzbC5ncm9vdnkgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9kc2wvQnVpbGRUeXBlRHNsLmdyb292eQppbmRleCA2YzRmOTdmLi42YjUxYmM0IDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9kc2wvQnVpbGRUeXBlRHNsLmdyb292eQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9kc2wvQnVpbGRUeXBlRHNsLmdyb292eQpAQCAtMTYsMTEgKzE2LDE2IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLmRzbAogaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGwKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5OdWxsYWJsZQoraW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5BbmRyb2lkQnVpbGRlcgogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuQnVpbGRlckNvbnN0YW50cwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuRGVmYXVsdEJ1aWxkVHlwZQoraW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuTmRrQ29uZmlnCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5TaWduaW5nQ29uZmlnCitpbXBvcnQgb3JnLmdyYWRsZS5hcGkuQWN0aW9uCiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkuaW50ZXJuYWwuZmlsZS5GaWxlUmVzb2x2ZXIKLQoraW1wb3J0IG9yZy5ncmFkbGUuaW50ZXJuYWwucmVmbGVjdC5JbnN0YW50aWF0b3IKIC8qKgogICogRFNMIG92ZXJsYXkgdG8gbWFrZSBtZXRob2RzIHRoYXQgYWNjZXB0IFN0cmluZy4uLiB3b3JrLgogICovCkBAIC0zMCw5ICszNSwyOCBAQAogICAgIEBOb25OdWxsCiAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlUmVzb2x2ZXIgZmlsZVJlc29sdmVyCiAKLSAgICBCdWlsZFR5cGVEc2woQE5vbk51bGwgU3RyaW5nIG5hbWUsIEBOb25OdWxsIEZpbGVSZXNvbHZlciBmaWxlUmVzb2x2ZXIpIHsKKyAgICBwcml2YXRlIGZpbmFsIE5ka0NvbmZpZ0RzbCBuZGtDb25maWcKKworICAgIHB1YmxpYyBCdWlsZFR5cGVEc2woQE5vbk51bGwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgIEBOb25OdWxsIEZpbGVSZXNvbHZlciBmaWxlUmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgIEBOb25OdWxsIEluc3RhbnRpYXRvciBpbnN0YW50aWF0b3IpIHsKICAgICAgICAgc3VwZXIobmFtZSkKICAgICAgICAgdGhpcy5maWxlUmVzb2x2ZXIgPSBmaWxlUmVzb2x2ZXIKKyAgICAgICAgbmRrQ29uZmlnID0gaW5zdGFudGlhdG9yLm5ld0luc3RhbmNlKE5ka0NvbmZpZ0RzbC5jbGFzcykKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBCdWlsZFR5cGVEc2woQE5vbk51bGwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgIEBOb25OdWxsIEZpbGVSZXNvbHZlciBmaWxlUmVzb2x2ZXIpIHsKKyAgICAgICAgc3VwZXIobmFtZSkKKyAgICAgICAgdGhpcy5maWxlUmVzb2x2ZXIgPSBmaWxlUmVzb2x2ZXIKKyAgICAgICAgbmRrQ29uZmlnID0gbnVsbAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBOZGtDb25maWcgZ2V0TmRrQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gbmRrQ29uZmlnOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGluaXQoU2lnbmluZ0NvbmZpZyBkZWJ1Z1NpZ25pbmdDb25maWcpIHsKQEAgLTU4LDEyICs4MiwxMSBAQAogCiAgICAgLy8gLS0gRFNMIE1ldGhvZHMuIFRPRE8gcmVtb3ZlIG9uY2UgdGhlIGluc3RhbnRpYXRvciBkb2VzIHdoYXQgSSBleHBlY3QgaXQgdG8gZG8uCiAKLSAgICBwdWJsaWMgdm9pZCBidWlsZENvbmZpZyhTdHJpbmcuLi4gbGluZXMpIHsKLSAgICAgICAgc2V0QnVpbGRDb25maWcobGluZXMpCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYnVpbGRDb25maWcoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgc2V0QnVpbGRDb25maWcobGluZSkKKyAgICBwdWJsaWMgdm9pZCBidWlsZENvbmZpZ0ZpZWxkKAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHR5cGUsCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBhZGRCdWlsZENvbmZpZ0ZpZWxkKEFuZHJvaWRCdWlsZGVyLmNyZWF0ZUNsYXNzRmllbGQodHlwZSwgbmFtZSwgdmFsdWUpKTsKICAgICB9CiAKICAgICBATm9uTnVsbApAQCAtODYsNCArMTA5LDIzIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgQnVpbGRUeXBlRHNsIGNvbnN1bWVyUHJvZ3VhcmRGaWxlcyhPYmplY3QuLi4gcHJvZ3VhcmRGaWxlQXJyYXkpIHsKKyAgICAgICAgY29uc3VtZXJQcm9ndWFyZEZpbGVzLmFkZEFsbChmaWxlUmVzb2x2ZXIucmVzb2x2ZUZpbGVzKHByb2d1YXJkRmlsZUFycmF5KS5maWxlcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgcHVibGljIEJ1aWxkVHlwZURzbCBzZXRDb25zdW1lclByb2d1YXJkRmlsZXMoSXRlcmFibGU8Pz4gcHJvZ3VhcmRGaWxlSXRlcmFibGUpIHsKKyAgICAgICAgY29uc3VtZXJQcm9ndWFyZEZpbGVzLmNsZWFyKCk7CisgICAgICAgIGZvciAoT2JqZWN0IHByb2d1YXJkRmlsZSA6IHByb2d1YXJkRmlsZUl0ZXJhYmxlKSB7CisgICAgICAgICAgICBjb25zdW1lclByb2d1YXJkRmlsZXMuYWRkKGZpbGVSZXNvbHZlci5yZXNvbHZlKHByb2d1YXJkRmlsZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHZvaWQgbmRrKEFjdGlvbjxOZGtDb25maWdEc2w+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uZXhlY3V0ZShuZGtDb25maWcpCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvZHNsL0J1aWxkVHlwZUZhY3RvcnkuamF2YSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL2RzbC9CdWlsZFR5cGVGYWN0b3J5LmphdmEKaW5kZXggM2JkZmUxOS4uNDg2NzI3ZSAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvZHNsL0J1aWxkVHlwZUZhY3RvcnkuamF2YQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9kc2wvQnVpbGRUeXBlRmFjdG9yeS5qYXZhCkBAIC00MCw2ICs0MCw2IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRGVmYXVsdEJ1aWxkVHlwZSBjcmVhdGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRvci5uZXdJbnN0YW5jZShCdWlsZFR5cGVEc2wuY2xhc3MsIG5hbWUsIGZpbGVSZXNvbHZlcik7CisgICAgICAgIHJldHVybiBpbnN0YW50aWF0b3IubmV3SW5zdGFuY2UoQnVpbGRUeXBlRHNsLmNsYXNzLCBuYW1lLCBmaWxlUmVzb2x2ZXIsIGluc3RhbnRpYXRvcik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvZHNsL0RleE9wdGlvbnNJbXBsLmdyb292eSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL2RzbC9EZXhPcHRpb25zSW1wbC5ncm9vdnkKaW5kZXggODk5MzM3YS4uNzY3YjlkMyAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvZHNsL0RleE9wdGlvbnNJbXBsLmdyb292eQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9kc2wvRGV4T3B0aW9uc0ltcGwuZ3Jvb3Z5CkBAIC0yNiw3ICsyNiwxMyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBjb3JlTGlicmFyeUZsYWcKIAogICAgIEBJbnB1dAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luY3JlbWVudGFsRmxhZyA9IHRydWUKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNJbmNyZW1lbnRhbEZsYWcgPSBmYWxzZQorCisgICAgQElucHV0CisgICAgcHJpdmF0ZSBib29sZWFuIGlzUHJlRGV4TGlicmFyaWVzRmxhZyA9IHRydWUKKworICAgIEBJbnB1dAorICAgIHByaXZhdGUgYm9vbGVhbiBpc0p1bWJvTW9kZUZsYWcgPSBmYWxzZQogCiAgICAgQElucHV0CiAgICAgQE9wdGlvbmFsCkBAIC01MCw2ICs1NiwyNCBAQAogICAgICAgICByZXR1cm4gaXNJbmNyZW1lbnRhbEZsYWcKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBib29sZWFuIGdldFByZURleExpYnJhcmllcygpIHsKKyAgICAgICAgcmV0dXJuIGlzUHJlRGV4TGlicmFyaWVzRmxhZworICAgIH0KKworICAgIHZvaWQgc2V0UHJlRGV4TGlicmFyaWVzKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpc1ByZURleExpYnJhcmllc0ZsYWcgPSBmbGFnCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SnVtYm9Nb2RlKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpc0p1bWJvTW9kZUZsYWcgPSBmbGFnCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgYm9vbGVhbiBnZXRKdW1ib01vZGUoKSB7CisgICAgICAgIHJldHVybiBpc0p1bWJvTW9kZUZsYWcKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBzZXRKYXZhTWF4SGVhcFNpemUoU3RyaW5nIHRoZUphdmFNYXhIZWFwU2l6ZSkgewogICAgICAgICBpZiAodGhlSmF2YU1heEhlYXBTaXplLm1hdGNoZXMoIlxcZCtba0ttTWdHdFRdPyIpKSB7CiAgICAgICAgICAgICBqYXZhTWF4SGVhcFNpemUgPSB0aGVKYXZhTWF4SGVhcFNpemUKZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL2RzbC9Hcm91cGFibGVQcm9kdWN0Rmxhdm9yRHNsLmdyb292eSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL2RzbC9Hcm91cGFibGVQcm9kdWN0Rmxhdm9yRHNsLmdyb292eQppbmRleCBkNjAzMzRiLi42MjFhYzg1IDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9kc2wvR3JvdXBhYmxlUHJvZHVjdEZsYXZvckRzbC5ncm9vdnkKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvZHNsL0dyb3VwYWJsZVByb2R1Y3RGbGF2b3JEc2wuZ3Jvb3Z5CkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsCiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkuaW50ZXJuYWwuZmlsZS5GaWxlUmVzb2x2ZXIKK2ltcG9ydCBvcmcuZ3JhZGxlLmludGVybmFsLnJlZmxlY3QuSW5zdGFudGlhdG9yCiAKIC8qKgogICogQSB2ZXJzaW9uIG9mIFByb2R1Y3RGbGF2b3JEc2wgdGhhdCBjYW4gcmVjZWl2ZSBhIGdyb3VwIG5hbWUKQEAgLTI3LDcgKzI4LDEwIEBACiAKICAgICBTdHJpbmcgZmxhdm9yR3JvdXAKIAotICAgIHB1YmxpYyBHcm91cGFibGVQcm9kdWN0Rmxhdm9yRHNsKEBOb25OdWxsIFN0cmluZyBuYW1lLCBATm9uTnVsbCBGaWxlUmVzb2x2ZXIgZmlsZVJlc29sdmVyKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUsIGZpbGVSZXNvbHZlcikKKyAgICBwdWJsaWMgR3JvdXBhYmxlUHJvZHVjdEZsYXZvckRzbCgKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgQE5vbk51bGwgRmlsZVJlc29sdmVyIGZpbGVSZXNvbHZlciwKKyAgICAgICAgICAgIEBOb25OdWxsIEluc3RhbnRpYXRvciBpbnN0YW50aWF0b3IpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgZmlsZVJlc29sdmVyLCBpbnN0YW50aWF0b3IpCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvZHNsL0dyb3VwYWJsZVByb2R1Y3RGbGF2b3JGYWN0b3J5LmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9kc2wvR3JvdXBhYmxlUHJvZHVjdEZsYXZvckZhY3RvcnkuamF2YQppbmRleCA3YWQ5MDQzLi5lZDQyMmQ5IDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9kc2wvR3JvdXBhYmxlUHJvZHVjdEZsYXZvckZhY3RvcnkuamF2YQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9kc2wvR3JvdXBhYmxlUHJvZHVjdEZsYXZvckZhY3RvcnkuamF2YQpAQCAtNDAsNiArNDAsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEdyb3VwYWJsZVByb2R1Y3RGbGF2b3JEc2wgY3JlYXRlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBpbnN0YW50aWF0b3IubmV3SW5zdGFuY2UoR3JvdXBhYmxlUHJvZHVjdEZsYXZvckRzbC5jbGFzcywgbmFtZSwgZmlsZVJlc29sdmVyKTsKKyAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRvci5uZXdJbnN0YW5jZShHcm91cGFibGVQcm9kdWN0Rmxhdm9yRHNsLmNsYXNzLAorICAgICAgICAgICAgICAgIG5hbWUsIGZpbGVSZXNvbHZlciwgaW5zdGFudGlhdG9yKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9kc2wvTmRrQ29uZmlnRHNsLmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9kc2wvTmRrQ29uZmlnRHNsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3MDhlNQotLS0gL2Rldi9udWxsCisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL2RzbC9OZGtDb25maWdEc2wuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLmRzbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CitpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5OZGtDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLklucHV0OworaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLk9wdGlvbmFsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgTmRrQ29uZmlnIHRvIGJlIHVzZWQgaW4gdGhlIGdyYWRsZSBEU0wuCisgKi8KK3B1YmxpYyBjbGFzcyBOZGtDb25maWdEc2wgaW1wbGVtZW50cyBOZGtDb25maWcsIFNlcmlhbGl6YWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICBwcml2YXRlIFN0cmluZyBtb2R1bGVOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIGNGbGFnczsKKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IGxkTGliczsKKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IGFiaUZpbHRlcnM7CisgICAgcHJpdmF0ZSBTdHJpbmcgc3RsOworCisgICAgcHVibGljIE5ka0NvbmZpZ0RzbCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTmRrQ29uZmlnRHNsKEBOb25OdWxsIE5ka0NvbmZpZ0RzbCBuZGtDb25maWcpIHsKKyAgICAgICAgbW9kdWxlTmFtZSA9IG5ka0NvbmZpZy5tb2R1bGVOYW1lOworICAgICAgICBjRmxhZ3MgPSBuZGtDb25maWcuY0ZsYWdzOworICAgICAgICBzZXRMZExpYnMobmRrQ29uZmlnLmxkTGlicyk7CisgICAgICAgIHNldEFiaUZpbHRlcnMobmRrQ29uZmlnLmFiaUZpbHRlcnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBJbnB1dCBAT3B0aW9uYWwKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1vZHVsZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBtb2R1bGVOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vZHVsZU5hbWUoU3RyaW5nIG1vZHVsZU5hbWUpIHsKKyAgICAgICAgdGhpcy5tb2R1bGVOYW1lID0gbW9kdWxlTmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBASW5wdXQgQE9wdGlvbmFsCisgICAgcHVibGljIFN0cmluZyBnZXRjRmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBjRmxhZ3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Y0ZsYWdzKFN0cmluZyBjRmxhZ3MpIHsKKyAgICAgICAgdGhpcy5jRmxhZ3MgPSBjRmxhZ3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQElucHV0IEBPcHRpb25hbAorICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRMZExpYnMoKSB7CisgICAgICAgIHJldHVybiBsZExpYnM7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgTmRrQ29uZmlnRHNsIGxkTGlicyhTdHJpbmcgbGliKSB7CisgICAgICAgIGlmIChsZExpYnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbGRMaWJzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgbGRMaWJzLmFkZChsaWIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBOZGtDb25maWdEc2wgbGRMaWJzKFN0cmluZy4uLiBsaWJzKSB7CisgICAgICAgIGlmIChsZExpYnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbGRMaWJzID0gU2V0cy5uZXdIYXNoU2V0V2l0aEV4cGVjdGVkU2l6ZShsaWJzLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKGxkTGlicywgbGlicyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgcHVibGljIE5ka0NvbmZpZ0RzbCBzZXRMZExpYnMoQ29sbGVjdGlvbjxTdHJpbmc+IGxpYnMpIHsKKyAgICAgICAgaWYgKGxpYnMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGFiaUZpbHRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFiaUZpbHRlcnMgPSBTZXRzLm5ld0hhc2hTZXRXaXRoRXhwZWN0ZWRTaXplKGxpYnMuc2l6ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWJpRmlsdGVycy5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChTdHJpbmcgZmlsdGVyIDogbGlicykgeworICAgICAgICAgICAgICAgIGFiaUZpbHRlcnMuYWRkKGZpbHRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhYmlGaWx0ZXJzID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIEBJbnB1dCBAT3B0aW9uYWwKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0QWJpRmlsdGVycygpIHsKKyAgICAgICAgcmV0dXJuIGFiaUZpbHRlcnM7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgTmRrQ29uZmlnRHNsIGFiaUZpbHRlcihTdHJpbmcgZmlsdGVyKSB7CisgICAgICAgIGlmIChhYmlGaWx0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIGFiaUZpbHRlcnMgPSBTZXRzLm5ld0hhc2hTZXRXaXRoRXhwZWN0ZWRTaXplKDIpOworICAgICAgICB9CisgICAgICAgIGFiaUZpbHRlcnMuYWRkKGZpbHRlcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgcHVibGljIE5ka0NvbmZpZ0RzbCBhYmlGaWx0ZXJzKFN0cmluZy4uLiBmaWx0ZXJzKSB7CisgICAgICAgIGlmIChhYmlGaWx0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIGFiaUZpbHRlcnMgPSBTZXRzLm5ld0hhc2hTZXRXaXRoRXhwZWN0ZWRTaXplKDIpOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChhYmlGaWx0ZXJzLCBmaWx0ZXJzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgTmRrQ29uZmlnRHNsIHNldEFiaUZpbHRlcnMoQ29sbGVjdGlvbjxTdHJpbmc+IGZpbHRlcnMpIHsKKyAgICAgICAgaWYgKGZpbHRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGFiaUZpbHRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFiaUZpbHRlcnMgPSBTZXRzLm5ld0hhc2hTZXRXaXRoRXhwZWN0ZWRTaXplKGZpbHRlcnMuc2l6ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWJpRmlsdGVycy5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChTdHJpbmcgZmlsdGVyIDogZmlsdGVycykgeworICAgICAgICAgICAgICAgIGFiaUZpbHRlcnMuYWRkKGZpbHRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhYmlGaWx0ZXJzID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0bCgpIHsKKyAgICAgICAgcmV0dXJuIHN0bDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGwoU3RyaW5nIHN0bCkgeworICAgICAgICB0aGlzLnN0bCA9IHN0bDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9kc2wvUHJvZHVjdEZsYXZvckRzbC5ncm9vdnkgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9kc2wvUHJvZHVjdEZsYXZvckRzbC5ncm9vdnkKaW5kZXggOTFhMjdiMS4uNjY5ZmM4ZiAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvZHNsL1Byb2R1Y3RGbGF2b3JEc2wuZ3Jvb3Z5CisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL2RzbC9Qcm9kdWN0Rmxhdm9yRHNsLmdyb292eQpAQCAtMTUsMTAgKzE1LDE1IEBACiAgKi8KIAogcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwuZHNsCi1pbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbAotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuRGVmYXVsdFByb2R1Y3RGbGF2b3IKLWltcG9ydCBvcmcuZ3JhZGxlLmFwaS5pbnRlcm5hbC5maWxlLkZpbGVSZXNvbHZlcgogCitpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbAoraW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5BbmRyb2lkQnVpbGRlcgoraW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuRGVmYXVsdFByb2R1Y3RGbGF2b3IKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLk5ka0NvbmZpZworaW1wb3J0IG9yZy5ncmFkbGUuYXBpLkFjdGlvbgoraW1wb3J0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLmZpbGUuRmlsZVJlc29sdmVyCitpbXBvcnQgb3JnLmdyYWRsZS5pbnRlcm5hbC5yZWZsZWN0Lkluc3RhbnRpYXRvcgogLyoqCiAgKiBEU0wgb3ZlcmxheSB0byBtYWtlIG1ldGhvZHMgdGhhdCBhY2NlcHQgU3RyaW5nLi4uIHdvcmsuCiAgKi8KQEAgLTI4LDM5ICszMyw4MCBAQAogICAgIEBOb25OdWxsCiAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlUmVzb2x2ZXIgZmlsZVJlc29sdmVyCiAKLSAgICBQcm9kdWN0Rmxhdm9yRHNsKFN0cmluZyBuYW1lLCBATm9uTnVsbCBGaWxlUmVzb2x2ZXIgZmlsZVJlc29sdmVyKSB7CisgICAgcHJpdmF0ZSBmaW5hbCBOZGtDb25maWdEc2wgbmRrQ29uZmlnCisKKyAgICBQcm9kdWN0Rmxhdm9yRHNsKEBOb25OdWxsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgRmlsZVJlc29sdmVyIGZpbGVSZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIEluc3RhbnRpYXRvciBpbnN0YW50aWF0b3IpIHsKICAgICAgICAgc3VwZXIobmFtZSkKICAgICAgICAgdGhpcy5maWxlUmVzb2x2ZXIgPSBmaWxlUmVzb2x2ZXIKKworICAgICAgICBuZGtDb25maWcgPSBpbnN0YW50aWF0b3IubmV3SW5zdGFuY2UoTmRrQ29uZmlnRHNsLmNsYXNzKQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBOZGtDb25maWcgZ2V0TmRrQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gbmRrQ29uZmlnOwogICAgIH0KIAogICAgIC8vIC0tIERTTCBNZXRob2RzLiBUT0RPIHJlbW92ZSBvbmNlIHRoZSBpbnN0YW50aWF0b3IgZG9lcyB3aGF0IEkgZXhwZWN0IGl0IHRvIGRvLgogCi0gICAgcHVibGljIHZvaWQgYnVpbGRDb25maWcoU3RyaW5nLi4uIGxpbmVzKSB7Ci0gICAgICAgIHNldEJ1aWxkQ29uZmlnKGxpbmVzKQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkQ29uZmlnKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIHNldEJ1aWxkQ29uZmlnKGxpbmUpCisgICAgcHVibGljIHZvaWQgYnVpbGRDb25maWdGaWVsZCgKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyB0eXBlLAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgYWRkQnVpbGRDb25maWdGaWVsZChBbmRyb2lkQnVpbGRlci5jcmVhdGVDbGFzc0ZpZWxkKHR5cGUsIG5hbWUsIHZhbHVlKSk7CiAgICAgfQogCiAgICAgQE5vbk51bGwKICAgICBwdWJsaWMgUHJvZHVjdEZsYXZvckRzbCBwcm9ndWFyZEZpbGUoT2JqZWN0IHByb2d1YXJkRmlsZSkgewotICAgICAgICBwcm9ndWFyZEZpbGVzLmFkZChmaWxlUmVzb2x2ZXIucmVzb2x2ZShwcm9ndWFyZEZpbGUpKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIHByb2d1YXJkRmlsZXMuYWRkKGZpbGVSZXNvbHZlci5yZXNvbHZlKHByb2d1YXJkRmlsZSkpCisgICAgICAgIHJldHVybiB0aGlzCiAgICAgfQogCiAgICAgQE5vbk51bGwKICAgICBwdWJsaWMgUHJvZHVjdEZsYXZvckRzbCBwcm9ndWFyZEZpbGVzKE9iamVjdC4uLiBwcm9ndWFyZEZpbGVBcnJheSkgewotICAgICAgICBwcm9ndWFyZEZpbGVzLmFkZEFsbChmaWxlUmVzb2x2ZXIucmVzb2x2ZUZpbGVzKHByb2d1YXJkRmlsZUFycmF5KS5maWxlcyk7Ci0gICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBwcm9ndWFyZEZpbGVzLmFkZEFsbChmaWxlUmVzb2x2ZXIucmVzb2x2ZUZpbGVzKHByb2d1YXJkRmlsZUFycmF5KS5maWxlcykKKyAgICAgICAgcmV0dXJuIHRoaXMKICAgICB9CiAKICAgICBATm9uTnVsbAogICAgIHB1YmxpYyBQcm9kdWN0Rmxhdm9yRHNsIHNldFByb2d1YXJkRmlsZXMoSXRlcmFibGU8Pz4gcHJvZ3VhcmRGaWxlSXRlcmFibGUpIHsKLSAgICAgICAgcHJvZ3VhcmRGaWxlcy5jbGVhcigpOworICAgICAgICBwcm9ndWFyZEZpbGVzLmNsZWFyKCkKICAgICAgICAgZm9yIChPYmplY3QgcHJvZ3VhcmRGaWxlIDogcHJvZ3VhcmRGaWxlSXRlcmFibGUpIHsKLSAgICAgICAgICAgIHByb2d1YXJkRmlsZXMuYWRkKGZpbGVSZXNvbHZlci5yZXNvbHZlKHByb2d1YXJkRmlsZSkpOworICAgICAgICAgICAgcHJvZ3VhcmRGaWxlcy5hZGQoZmlsZVJlc29sdmVyLnJlc29sdmUocHJvZ3VhcmRGaWxlKSkKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgcmV0dXJuIHRoaXMKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBQcm9kdWN0Rmxhdm9yRHNsIGNvbnN1bWVyUHJvZ3VhcmRGaWxlcyhPYmplY3QuLi4gcHJvZ3VhcmRGaWxlQXJyYXkpIHsKKyAgICAgICAgY29uc3VtZXJQcm9ndWFyZEZpbGVzLmFkZEFsbChmaWxlUmVzb2x2ZXIucmVzb2x2ZUZpbGVzKHByb2d1YXJkRmlsZUFycmF5KS5maWxlcykKKyAgICAgICAgcmV0dXJuIHRoaXMKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBQcm9kdWN0Rmxhdm9yRHNsIHNldGNvbnN1bWVyUHJvZ3VhcmRGaWxlcyhJdGVyYWJsZTw/PiBwcm9ndWFyZEZpbGVJdGVyYWJsZSkgeworICAgICAgICBjb25zdW1lclByb2d1YXJkRmlsZXMuY2xlYXIoKQorICAgICAgICBmb3IgKE9iamVjdCBwcm9ndWFyZEZpbGUgOiBwcm9ndWFyZEZpbGVJdGVyYWJsZSkgeworICAgICAgICAgICAgY29uc3VtZXJQcm9ndWFyZEZpbGVzLmFkZChmaWxlUmVzb2x2ZXIucmVzb2x2ZShwcm9ndWFyZEZpbGUpKQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzCisgICAgfQorCisgICAgdm9pZCBuZGsoQWN0aW9uPE5ka0NvbmZpZ0RzbD4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5leGVjdXRlKG5ka0NvbmZpZykKKyAgICB9CisKKyAgICB2b2lkIHJlc0NvbmZpZyhATm9uTnVsbCBTdHJpbmcgY29uZmlnKSB7CisgICAgICAgIGFkZFJlc291cmNlQ29uZmlndXJhdGlvbihjb25maWcpOworICAgIH0KKworICAgIHZvaWQgcmVzQ29uZmlncyhATm9uTnVsbCBTdHJpbmcuLi4gY29uZmlnKSB7CisgICAgICAgIGFkZFJlc291cmNlQ29uZmlndXJhdGlvbnMoY29uZmlnKTsKKyAgICB9CisgICAgdm9pZCByZXNDb25maWdzKEBOb25OdWxsIENvbGxlY3Rpb248U3RyaW5nPiBjb25maWcpIHsKKyAgICAgICAgYWRkUmVzb3VyY2VDb25maWd1cmF0aW9ucyhjb25maWcpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL0FuZHJvaWRBcnRpZmFjdEltcGwuamF2YSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL0FuZHJvaWRBcnRpZmFjdEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjdhMDU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvQW5kcm9pZEFydGlmYWN0SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwubW9kZWw7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQW5kcm9pZEFydGlmYWN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuRGVwZW5kZW5jaWVzOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuU291cmNlUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgQW5kcm9pZEFydGlmYWN0IHRoYXQgaXMgc2VyaWFsaXphYmxlCisgKi8KK3B1YmxpYyBjbGFzcyBBbmRyb2lkQXJ0aWZhY3RJbXBsIGV4dGVuZHMgQmFzZUFydGlmYWN0SW1wbCBpbXBsZW1lbnRzIEFuZHJvaWRBcnRpZmFjdCwgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIG91dHB1dEZpbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzU2lnbmVkOworICAgIEBOdWxsYWJsZQorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHNpZ25pbmdDb25maWdOYW1lOworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWU7CisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzb3VyY2VHZW5UYXNrTmFtZTsKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgRmlsZSBnZW5lcmF0ZWRNYW5pZmVzdDsKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgTGlzdDxGaWxlPiBnZW5lcmF0ZWRTb3VyY2VGb2xkZXJzOworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEZpbGU+IGdlbmVyYXRlZFJlc291cmNlRm9sZGVyczsKKworICAgIEFuZHJvaWRBcnRpZmFjdEltcGwoQE5vbk51bGwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgYXNzZW1ibGVUYXNrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIEZpbGUgb3V0cHV0RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIHNpZ25pbmdDb25maWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHNvdXJjZUdlblRhc2tOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIGphdmFDb21waWxlVGFza05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBGaWxlIGdlbmVyYXRlZE1hbmlmZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxGaWxlPiBnZW5lcmF0ZWRTb3VyY2VGb2xkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxGaWxlPiBnZW5lcmF0ZWRSZXNvdXJjZUZvbGRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBGaWxlIGNsYXNzZXNGb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBEZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIFNvdXJjZVByb3ZpZGVyIHZhcmlhbnRTb3VyY2VQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTb3VyY2VQcm92aWRlciBtdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVycykgeworICAgICAgICBzdXBlcihuYW1lLCBhc3NlbWJsZVRhc2tOYW1lLCBqYXZhQ29tcGlsZVRhc2tOYW1lLCBjbGFzc2VzRm9sZGVyLCBkZXBlbmRlbmNpZXMsCisgICAgICAgICAgICAgICAgdmFyaWFudFNvdXJjZVByb3ZpZGVyLCBtdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVycyk7CisKKyAgICAgICAgdGhpcy5vdXRwdXRGaWxlID0gb3V0cHV0RmlsZTsKKyAgICAgICAgdGhpcy5pc1NpZ25lZCA9IGlzU2lnbmVkOworICAgICAgICB0aGlzLnNpZ25pbmdDb25maWdOYW1lID0gc2lnbmluZ0NvbmZpZ05hbWU7CisgICAgICAgIHRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKKyAgICAgICAgdGhpcy5zb3VyY2VHZW5UYXNrTmFtZSA9IHNvdXJjZUdlblRhc2tOYW1lOworICAgICAgICB0aGlzLmdlbmVyYXRlZE1hbmlmZXN0ID0gZ2VuZXJhdGVkTWFuaWZlc3Q7CisgICAgICAgIHRoaXMuZ2VuZXJhdGVkU291cmNlRm9sZGVycyA9IGdlbmVyYXRlZFNvdXJjZUZvbGRlcnM7CisgICAgICAgIHRoaXMuZ2VuZXJhdGVkUmVzb3VyY2VGb2xkZXJzID0gZ2VuZXJhdGVkUmVzb3VyY2VGb2xkZXJzOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpbGUgZ2V0T3V0cHV0RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dEZpbGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNTaWduZWQoKSB7CisgICAgICAgIHJldHVybiBpc1NpZ25lZDsKKyAgICB9CisKKyAgICBATnVsbGFibGUKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNpZ25pbmdDb25maWdOYW1lKCkgeworICAgICAgICByZXR1cm4gc2lnbmluZ0NvbmZpZ05hbWU7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICByZXR1cm4gcGFja2FnZU5hbWU7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUdlblRhc2tOYW1lKCkgeworICAgICAgICByZXR1cm4gc291cmNlR2VuVGFza05hbWU7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsZSBnZXRHZW5lcmF0ZWRNYW5pZmVzdCgpIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlZE1hbmlmZXN0OworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8RmlsZT4gZ2V0R2VuZXJhdGVkU291cmNlRm9sZGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlZFNvdXJjZUZvbGRlcnM7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxGaWxlPiBnZXRHZW5lcmF0ZWRSZXNvdXJjZUZvbGRlcnMoKSB7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZWRSZXNvdXJjZUZvbGRlcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvQW5kcm9pZExpYnJhcnlJbXBsLmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9BbmRyb2lkTGlicmFyeUltcGwuamF2YQppbmRleCBkOTMxZTI4Li44NjM1Y2U4IDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9BbmRyb2lkTGlicmFyeUltcGwuamF2YQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9BbmRyb2lkTGlicmFyeUltcGwuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBwdWJsaWMgY2xhc3MgQW5kcm9pZExpYnJhcnlJbXBsIGltcGxlbWVudHMgQW5kcm9pZExpYnJhcnksIFNlcmlhbGl6YWJsZSB7CkBAIC0zNSw5ICszNiwxMSBAQAogICAgIEBOb25OdWxsCiAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGZvbGRlcjsKICAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgRmlsZSBtYW5pZmVzdDsKKyAgICBATm9uTnVsbAogICAgIHByaXZhdGUgZmluYWwgRmlsZSBqYXJGaWxlOwogICAgIEBOb25OdWxsCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEZpbGU+IGxvY2FsSmFyczsKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248RmlsZT4gbG9jYWxKYXJzOwogICAgIEBOb25OdWxsCiAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIHJlc0ZvbGRlcjsKICAgICBATm9uTnVsbApAQCAtNjEsNiArNjQsNyBAQAogICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llczsKICAgICAgICAgYnVuZGxlID0gbGlicmFyeURlcGVuZGVuY3kuZ2V0QnVuZGxlKCk7CiAgICAgICAgIGZvbGRlciA9IGxpYnJhcnlEZXBlbmRlbmN5LmdldEZvbGRlcigpOworICAgICAgICBtYW5pZmVzdCA9IGxpYnJhcnlEZXBlbmRlbmN5LmdldE1hbmlmZXN0KCk7CiAgICAgICAgIGphckZpbGUgPSBsaWJyYXJ5RGVwZW5kZW5jeS5nZXRKYXJGaWxlKCk7CiAgICAgICAgIGxvY2FsSmFycyA9IGxpYnJhcnlEZXBlbmRlbmN5LmdldExvY2FsSmFycygpOwogICAgICAgICByZXNGb2xkZXIgPSBsaWJyYXJ5RGVwZW5kZW5jeS5nZXRSZXNGb2xkZXIoKTsKQEAgLTEwMCwxMyArMTA0LDE5IEBACiAKICAgICBATm9uTnVsbAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWxlIGdldE1hbmlmZXN0KCkgeworICAgICAgICByZXR1cm4gbWFuaWZlc3Q7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRmlsZSBnZXRKYXJGaWxlKCkgewogICAgICAgICByZXR1cm4gamFyRmlsZTsKICAgICB9CiAKICAgICBATm9uTnVsbAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PEZpbGU+IGdldExvY2FsSmFycygpIHsKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxGaWxlPiBnZXRMb2NhbEphcnMoKSB7CiAgICAgICAgIHJldHVybiBsb2NhbEphcnM7CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9BcnRpZmFjdEluZm9JbXBsLmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9BcnRpZmFjdEluZm9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MDAyNjEuLjAwMDAwMDAKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvQXJ0aWZhY3RJbmZvSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5BcnRpZmFjdEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5EZXBlbmRlbmNpZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgQXJ0aWZhY3RJbmZvIHRoYXQgaXMgc2VyaWFsaXphYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEluZm9JbXBsIGltcGxlbWVudHMgQXJ0aWZhY3RJbmZvLCBTZXJpYWxpemFibGUgewotCi0gICAgQE5vbk51bGwKLSAgICBwcml2YXRlIGZpbmFsIEZpbGUgb3V0cHV0RmlsZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNTaWduZWQ7Ci0gICAgQE51bGxhYmxlCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2lnbmluZ0NvbmZpZ05hbWU7Ci0gICAgQE5vbk51bGwKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhc3NlbWJsZVRhc2tOYW1lOwotICAgIEBOb25OdWxsCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWU7Ci0gICAgQE5vbk51bGwKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8RmlsZT4gZ2VuZXJhdGVkU291cmNlRm9sZGVyczsKLSAgICBATm9uTnVsbAotICAgIHByaXZhdGUgZmluYWwgTGlzdDxGaWxlPiBnZW5lcmF0ZWRSZXNvdXJjZUZvbGRlcnM7Ci0gICAgQE5vbk51bGwKLSAgICBwcml2YXRlIGZpbmFsIEZpbGUgY2xhc3Nlc0ZvbGRlcjsKLSAgICBATm9uTnVsbAotICAgIHByaXZhdGUgZmluYWwgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llczsKLQotCi0gICAgQXJ0aWZhY3RJbmZvSW1wbChATm9uTnVsbCAgU3RyaW5nIGFzc2VtYmxlVGFza05hbWUsCi0gICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCAgRmlsZSBvdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTaWduZWQsCi0gICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIHNpZ25pbmdDb25maWdOYW1lLAotICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsICBMaXN0PEZpbGU+IGdlbmVyYXRlZFNvdXJjZUZvbGRlcnMsCi0gICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCAgTGlzdDxGaWxlPiBnZW5lcmF0ZWRSZXNvdXJjZUZvbGRlcnMsCi0gICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCAgRmlsZSBjbGFzc2VzRm9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgIERlcGVuZGVuY2llcyBkZXBlbmRlbmNpZXMpIHsKLSAgICAgICAgdGhpcy5hc3NlbWJsZVRhc2tOYW1lID0gYXNzZW1ibGVUYXNrTmFtZTsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlID0gb3V0cHV0RmlsZTsKLSAgICAgICAgdGhpcy5pc1NpZ25lZCA9IGlzU2lnbmVkOwotICAgICAgICB0aGlzLnNpZ25pbmdDb25maWdOYW1lID0gc2lnbmluZ0NvbmZpZ05hbWU7Ci0gICAgICAgIHRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZWRTb3VyY2VGb2xkZXJzID0gZ2VuZXJhdGVkU291cmNlRm9sZGVyczsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZWRSZXNvdXJjZUZvbGRlcnMgPSBnZW5lcmF0ZWRSZXNvdXJjZUZvbGRlcnM7Ci0gICAgICAgIHRoaXMuY2xhc3Nlc0ZvbGRlciA9IGNsYXNzZXNGb2xkZXI7Ci0gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzOwotICAgIH0KLQotICAgIEBOb25OdWxsCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEZpbGUgZ2V0T3V0cHV0RmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dEZpbGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNTaWduZWQoKSB7Ci0gICAgICAgIHJldHVybiBpc1NpZ25lZDsKLSAgICB9Ci0KLSAgICBATnVsbGFibGUKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNpZ25pbmdDb25maWdOYW1lKCkgewotICAgICAgICByZXR1cm4gc2lnbmluZ0NvbmZpZ05hbWU7Ci0gICAgfQotCi0gICAgQE5vbk51bGwKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgQE5vbk51bGwKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUdlblRhc2tOYW1lKCkgewotICAgICAgICByZXR1cm4gIlRPRE8iOwotICAgIH0KLQotICAgIEBOb25OdWxsCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRBc3NlbWJsZVRhc2tOYW1lKCkgewotICAgICAgICByZXR1cm4gYXNzZW1ibGVUYXNrTmFtZTsKLSAgICB9Ci0KLSAgICBATm9uTnVsbAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PEZpbGU+IGdldEdlbmVyYXRlZFNvdXJjZUZvbGRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZWRTb3VyY2VGb2xkZXJzOwotICAgIH0KLQotICAgIEBOb25OdWxsCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8RmlsZT4gZ2V0R2VuZXJhdGVkUmVzb3VyY2VGb2xkZXJzKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVkUmVzb3VyY2VGb2xkZXJzOwotICAgIH0KLQotICAgIEBOb25OdWxsCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEZpbGUgZ2V0Q2xhc3Nlc0ZvbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzZXNGb2xkZXI7Ci0gICAgfQotCi0gICAgQE5vbk51bGwKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRGVwZW5kZW5jaWVzIGdldERlcGVuZGVuY2llcygpIHsKLSAgICAgICAgcmV0dXJuIGRlcGVuZGVuY2llczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9BcnRpZmFjdE1ldGFEYXRhSW1wbC5qYXZhIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvQXJ0aWZhY3RNZXRhRGF0YUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjMzYzJkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvQXJ0aWZhY3RNZXRhRGF0YUltcGwuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwubW9kZWw7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQXJ0aWZhY3RNZXRhRGF0YTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIEFydGlmYWN0TWV0YURhdGEgdGhhdCBpcyBzZXJpYWxpemFibGUKKyAqLworcHVibGljIGNsYXNzIEFydGlmYWN0TWV0YURhdGFJbXBsIGltcGxlbWVudHMgQXJ0aWZhY3RNZXRhRGF0YSwgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNUZXN0OworICAgIHByaXZhdGUgZmluYWwgaW50IHR5cGU7CisKKyAgICBwdWJsaWMgQXJ0aWZhY3RNZXRhRGF0YUltcGwoQE5vbk51bGwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNUZXN0LCBpbnQgdHlwZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmlzVGVzdCA9IGlzVGVzdDsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNUZXN0KCkgeworICAgICAgICByZXR1cm4gaXNUZXN0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvQmFzZUFydGlmYWN0SW1wbC5qYXZhIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvQmFzZUFydGlmYWN0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YzBjODcKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9CYXNlQXJ0aWZhY3RJbXBsLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC5tb2RlbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CitpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5CYXNlQXJ0aWZhY3Q7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5EZXBlbmRlbmNpZXM7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Tb3VyY2VQcm92aWRlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBCYXNlQXJ0aWZhY3QgdGhhdCBpcyBzZXJpYWxpemFibGUKKyAqLworY2xhc3MgQmFzZUFydGlmYWN0SW1wbCBpbXBsZW1lbnRzIEJhc2VBcnRpZmFjdCwgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhc3NlbWJsZVRhc2tOYW1lOworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgamF2YUNvbXBpbGVUYXNrTmFtZTsKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgRmlsZSBjbGFzc2VzRm9sZGVyOworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBEZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzOworICAgIEBOdWxsYWJsZQorICAgIHByaXZhdGUgZmluYWwgU291cmNlUHJvdmlkZXIgdmFyaWFudFNvdXJjZVByb3ZpZGVyOworICAgIEBOdWxsYWJsZQorICAgIHByaXZhdGUgZmluYWwgU291cmNlUHJvdmlkZXIgbXVsdGlGbGF2b3JTb3VyY2VQcm92aWRlcnM7CisKKworICAgIEJhc2VBcnRpZmFjdEltcGwoQE5vbk51bGwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgYXNzZW1ibGVUYXNrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBqYXZhQ29tcGlsZVRhc2tOYW1lLAorICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgRmlsZSBjbGFzc2VzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcywKKyAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTb3VyY2VQcm92aWRlciB2YXJpYW50U291cmNlUHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgU291cmNlUHJvdmlkZXIgbXVsdGlGbGF2b3JTb3VyY2VQcm92aWRlcnMpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5hc3NlbWJsZVRhc2tOYW1lID0gYXNzZW1ibGVUYXNrTmFtZTsKKyAgICAgICAgdGhpcy5qYXZhQ29tcGlsZVRhc2tOYW1lID0gamF2YUNvbXBpbGVUYXNrTmFtZTsKKyAgICAgICAgdGhpcy5jbGFzc2VzRm9sZGVyID0gY2xhc3Nlc0ZvbGRlcjsKKyAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXM7CisgICAgICAgIHRoaXMudmFyaWFudFNvdXJjZVByb3ZpZGVyID0gdmFyaWFudFNvdXJjZVByb3ZpZGVyOworICAgICAgICB0aGlzLm11bHRpRmxhdm9yU291cmNlUHJvdmlkZXJzID0gbXVsdGlGbGF2b3JTb3VyY2VQcm92aWRlcnM7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRKYXZhQ29tcGlsZVRhc2tOYW1lKCkgeworICAgICAgICByZXR1cm4gamF2YUNvbXBpbGVUYXNrTmFtZTsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXNzZW1ibGVUYXNrTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VtYmxlVGFza05hbWU7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsZSBnZXRDbGFzc2VzRm9sZGVyKCkgeworICAgICAgICByZXR1cm4gY2xhc3Nlc0ZvbGRlcjsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZXBlbmRlbmNpZXMgZ2V0RGVwZW5kZW5jaWVzKCkgeworICAgICAgICByZXR1cm4gZGVwZW5kZW5jaWVzOworICAgIH0KKworICAgIEBOdWxsYWJsZQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTb3VyY2VQcm92aWRlciBnZXRWYXJpYW50U291cmNlUHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiB2YXJpYW50U291cmNlUHJvdmlkZXI7CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNvdXJjZVByb3ZpZGVyIGdldE11bHRpRmxhdm9yU291cmNlUHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiBtdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9CdWlsZFR5cGVDb250YWluZXJJbXBsLmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9CdWlsZFR5cGVDb250YWluZXJJbXBsLmphdmEKaW5kZXggZGI4ZGMxNy4uYTRjMzAyZiAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvQnVpbGRUeXBlQ29udGFpbmVySW1wbC5qYXZhCisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL0J1aWxkVHlwZUNvbnRhaW5lckltcGwuamF2YQpAQCAtMTcsMTEgKzE3LDE0IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC5tb2RlbDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5CdWlsZFR5cGVDb250YWluZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLkJ1aWxkVHlwZURhdGE7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5CdWlsZFR5cGU7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5CdWlsZFR5cGVDb250YWluZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Tb3VyY2VQcm92aWRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLlNvdXJjZVByb3ZpZGVyQ29udGFpbmVyOwogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKIGNsYXNzIEJ1aWxkVHlwZUNvbnRhaW5lckltcGwgaW1wbGVtZW50cyBCdWlsZFR5cGVDb250YWluZXIsIFNlcmlhbGl6YWJsZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CkBAIC0zMCwxMSArMzMsMzUgQEAKICAgICBwcml2YXRlIGZpbmFsIEJ1aWxkVHlwZSBidWlsZFR5cGU7CiAgICAgQE5vbk51bGwKICAgICBwcml2YXRlIGZpbmFsIFNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyOworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyPiBleHRyYVNvdXJjZVByb3ZpZGVyczsKIAotICAgIEJ1aWxkVHlwZUNvbnRhaW5lckltcGwoQE5vbk51bGwgQnVpbGRUeXBlSW1wbCBidWlsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBTb3VyY2VQcm92aWRlckltcGwgc291cmNlUHJvdmlkZXIpIHsKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBCdWlsZFR5cGVDb250YWluZXIgZnJvbSBhIEJ1aWxkVHlwZURhdGEKKyAgICAgKgorICAgICAqIEBwYXJhbSBidWlsZFR5cGVEYXRhIHRoZSBidWlsZCB0eXBlIGRhdGEKKyAgICAgKiBAcGFyYW0gc291cmNlUHJvdmlkZXJDb250YWluZXJzIGNvbGxlY3Rpb24gb2YgZXh0cmEgc291cmNlIHByb3ZpZGVycworICAgICAqCisgICAgICogQHJldHVybiBhIG5vbi1udWxsIEJ1aWxkVHlwZUNvbnRhaW5lcgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgc3RhdGljIEJ1aWxkVHlwZUNvbnRhaW5lciBjcmVhdGVCVEMoCisgICAgICAgICAgICBATm9uTnVsbCBCdWlsZFR5cGVEYXRhIGJ1aWxkVHlwZURhdGEsCisgICAgICAgICAgICBATm9uTnVsbCBDb2xsZWN0aW9uPFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyPiBzb3VyY2VQcm92aWRlckNvbnRhaW5lcnMpIHsKKworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkVHlwZUNvbnRhaW5lckltcGwoCisgICAgICAgICAgICAgICAgQnVpbGRUeXBlSW1wbC5jbG9uZUJ1aWxkVHlwZShidWlsZFR5cGVEYXRhLmdldEJ1aWxkVHlwZSgpKSwKKyAgICAgICAgICAgICAgICBTb3VyY2VQcm92aWRlckltcGwuY2xvbmVQcm92aWRlcihidWlsZFR5cGVEYXRhLmdldFNvdXJjZVNldCgpKSwKKyAgICAgICAgICAgICAgICBTb3VyY2VQcm92aWRlckNvbnRhaW5lckltcGwuY2xvbmVDb2xsZWN0aW9uKHNvdXJjZVByb3ZpZGVyQ29udGFpbmVycykpOworICAgIH0KKworICAgIHByaXZhdGUgQnVpbGRUeXBlQ29udGFpbmVySW1wbCgKKyAgICAgICAgICAgIEBOb25OdWxsIEJ1aWxkVHlwZUltcGwgYnVpbGRUeXBlLAorICAgICAgICAgICAgQE5vbk51bGwgU291cmNlUHJvdmlkZXJJbXBsIHNvdXJjZVByb3ZpZGVyLAorICAgICAgICAgICAgQE5vbk51bGwgQ29sbGVjdGlvbjxTb3VyY2VQcm92aWRlckNvbnRhaW5lcj4gZXh0cmFTb3VyY2VQcm92aWRlcnMpIHsKICAgICAgICAgdGhpcy5idWlsZFR5cGUgPSBidWlsZFR5cGU7CiAgICAgICAgIHRoaXMuc291cmNlUHJvdmlkZXIgPSBzb3VyY2VQcm92aWRlcjsKKyAgICAgICAgdGhpcy5leHRyYVNvdXJjZVByb3ZpZGVycyA9IGV4dHJhU291cmNlUHJvdmlkZXJzOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNDgsNCArNzUsMTAgQEAKICAgICBwdWJsaWMgU291cmNlUHJvdmlkZXIgZ2V0U291cmNlUHJvdmlkZXIoKSB7CiAgICAgICAgIHJldHVybiBzb3VyY2VQcm92aWRlcjsKICAgICB9CisKKyAgICBATm9uTnVsbAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyPiBnZXRFeHRyYVNvdXJjZVByb3ZpZGVycygpIHsKKyAgICAgICAgcmV0dXJuIGV4dHJhU291cmNlUHJvdmlkZXJzOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL0J1aWxkVHlwZUltcGwuamF2YSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL0J1aWxkVHlwZUltcGwuamF2YQppbmRleCBmNWZhNDZjLi5lM2Y1Y2RjIDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9CdWlsZFR5cGVJbXBsLmphdmEKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvQnVpbGRUeXBlSW1wbC5qYXZhCkBAIC0xOSw2ICsxOSw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkJ1aWxkVHlwZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkNsYXNzRmllbGQ7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5OZGtDb25maWc7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CkBAIC0xMTEsMTIgKzExMywyNSBAQAogCiAgICAgQE5vbk51bGwKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEJ1aWxkQ29uZmlnKCkgeworICAgIHB1YmxpYyBMaXN0PENsYXNzRmllbGQ+IGdldEJ1aWxkQ29uZmlnRmllbGRzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxGaWxlPiBnZXRQcm9ndWFyZEZpbGVzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxGaWxlPiBnZXRDb25zdW1lclByb2d1YXJkRmlsZXMoKSB7CiAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE5vbk51bGwgTGlzdDxGaWxlPiBnZXRQcm9ndWFyZEZpbGVzKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgQE51bGxhYmxlCisgICAgcHVibGljIE5ka0NvbmZpZyBnZXROZGtDb25maWcoKSB7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL0RlZmF1bHRBbmRyb2lkUHJvamVjdC5qYXZhIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvRGVmYXVsdEFuZHJvaWRQcm9qZWN0LmphdmEKaW5kZXggNTg5MjQzZi4uZmFiMjhkMSAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvRGVmYXVsdEFuZHJvaWRQcm9qZWN0LmphdmEKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvRGVmYXVsdEFuZHJvaWRQcm9qZWN0LmphdmEKQEAgLTE3LDE3ICsxNywyMCBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwubW9kZWw7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQW5kcm9pZFByb2plY3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5CdWlsZFR5cGVDb250YWluZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Qcm9kdWN0Rmxhdm9yQ29udGFpbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuVmFyaWFudDsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwuQ29tcGlsZU9wdGlvbnM7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5BYXB0T3B0aW9uczsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkFuZHJvaWRQcm9qZWN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQXJ0aWZhY3RNZXRhRGF0YTsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkJ1aWxkVHlwZUNvbnRhaW5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkphdmFDb21waWxlT3B0aW9uczsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLlByb2R1Y3RGbGF2b3JDb250YWluZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5TaWduaW5nQ29uZmlnOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLlZhcmlhbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCiAvKioKICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBBbmRyb2lkUHJvamVjdCBtb2RlbCBvYmplY3QuCkBAIC00MiwyNyArNDUsNDQgQEAKICAgICBATm9uTnVsbAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbXBpbGVUYXJnZXQ7CiAgICAgQE5vbk51bGwKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBib290Q2xhc3NwYXRoOworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGJvb3RDbGFzc3BhdGg7CiAgICAgQE5vbk51bGwKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFNpZ25pbmdDb25maWc+IHNpZ25pbmdDb25maWdzOworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxGaWxlPiBmcmFtZXdvcmtTb3VyY2U7CisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248U2lnbmluZ0NvbmZpZz4gc2lnbmluZ0NvbmZpZ3M7CisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248QXJ0aWZhY3RNZXRhRGF0YT4gZXh0cmFBcnRpZmFjdHM7CisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB1bnJlc29sdmVkRGVwZW5kZW5jaWVzOworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBKYXZhQ29tcGlsZU9wdGlvbnMgamF2YUNvbXBpbGVPcHRpb25zOwogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0xpYnJhcnk7CiAKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEJ1aWxkVHlwZUNvbnRhaW5lcj4gYnVpbGRUeXBlcyA9IE1hcHMubmV3SGFzaE1hcCgpOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUHJvZHVjdEZsYXZvckNvbnRhaW5lcj4gcHJvZHVjdEZsYXZvcnMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFZhcmlhbnQ+IHZhcmlhbnRzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPEJ1aWxkVHlwZUNvbnRhaW5lcj4gYnVpbGRUeXBlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxQcm9kdWN0Rmxhdm9yQ29udGFpbmVyPiBwcm9kdWN0Rmxhdm9ycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxWYXJpYW50PiB2YXJpYW50cyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwogCiAgICAgcHJpdmF0ZSBQcm9kdWN0Rmxhdm9yQ29udGFpbmVyIGRlZmF1bHRDb25maWc7CiAKICAgICBEZWZhdWx0QW5kcm9pZFByb2plY3QoQE5vbk51bGwgU3RyaW5nIG1vZGVsVmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIG5hbWUsIEBOb25OdWxsIFN0cmluZyBjb21waWxlVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBMaXN0PFN0cmluZz4gYm9vdENsYXNzcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgTWFwPFN0cmluZywgU2lnbmluZ0NvbmZpZz4gc2lnbmluZ0NvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgY29tcGlsZVRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgQ29sbGVjdGlvbjxTdHJpbmc+IGJvb3RDbGFzc3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIENvbGxlY3Rpb248RmlsZT4gZnJhbWV3b3JrU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBDb2xsZWN0aW9uPFNpZ25pbmdDb25maWc+IHNpZ25pbmdDb25maWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBDb2xsZWN0aW9uPEFydGlmYWN0TWV0YURhdGE+IGV4dHJhQXJ0aWZhY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBDb2xsZWN0aW9uPFN0cmluZz4gdW5yZXNvbHZlZERlcGVuZGVuY2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgQ29tcGlsZU9wdGlvbnMgY29tcGlsZU9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNMaWJyYXJ5KSB7CiAgICAgICAgIHRoaXMubW9kZWxWZXJzaW9uID0gbW9kZWxWZXJzaW9uOwogICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgICB0aGlzLmNvbXBpbGVUYXJnZXQgPSBjb21waWxlVGFyZ2V0OwogICAgICAgICB0aGlzLmJvb3RDbGFzc3BhdGggPSBib290Q2xhc3NwYXRoOworICAgICAgICB0aGlzLmZyYW1ld29ya1NvdXJjZSA9IGZyYW1ld29ya1NvdXJjZTsKICAgICAgICAgdGhpcy5zaWduaW5nQ29uZmlncyA9IHNpZ25pbmdDb25maWdzOworICAgICAgICB0aGlzLmV4dHJhQXJ0aWZhY3RzID0gZXh0cmFBcnRpZmFjdHM7CisgICAgICAgIHRoaXMudW5yZXNvbHZlZERlcGVuZGVuY2llcyA9IHVucmVzb2x2ZWREZXBlbmRlbmNpZXM7CisgICAgICAgIGphdmFDb21waWxlT3B0aW9ucyA9IG5ldyBEZWZhdWx0SmF2YUNvbXBpbGVPcHRpb25zKGNvbXBpbGVPcHRpb25zKTsKICAgICAgICAgdGhpcy5pc0xpYnJhcnkgPSBpc0xpYnJhcnk7CiAgICAgfQogCkBAIC03NCwyNiArOTQsMjUgQEAKIAogICAgIEBOb25OdWxsCiAgICAgRGVmYXVsdEFuZHJvaWRQcm9qZWN0IGFkZEJ1aWxkVHlwZShATm9uTnVsbCBCdWlsZFR5cGVDb250YWluZXIgYnVpbGRUeXBlQ29udGFpbmVyKSB7Ci0gICAgICAgIGJ1aWxkVHlwZXMucHV0KGJ1aWxkVHlwZUNvbnRhaW5lci5nZXRCdWlsZFR5cGUoKS5nZXROYW1lKCksIGJ1aWxkVHlwZUNvbnRhaW5lcik7CisgICAgICAgIGJ1aWxkVHlwZXMuYWRkKGJ1aWxkVHlwZUNvbnRhaW5lcik7CiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAogICAgIEBOb25OdWxsCiAgICAgRGVmYXVsdEFuZHJvaWRQcm9qZWN0IGFkZFByb2R1Y3RGbGF2b3JzKAogICAgICAgICAgICAgQE5vbk51bGwgUHJvZHVjdEZsYXZvckNvbnRhaW5lciBwcm9kdWN0Rmxhdm9yQ29udGFpbmVyKSB7Ci0gICAgICAgIHByb2R1Y3RGbGF2b3JzLnB1dChwcm9kdWN0Rmxhdm9yQ29udGFpbmVyLmdldFByb2R1Y3RGbGF2b3IoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgcHJvZHVjdEZsYXZvckNvbnRhaW5lcik7CisgICAgICAgIHByb2R1Y3RGbGF2b3JzLmFkZChwcm9kdWN0Rmxhdm9yQ29udGFpbmVyKTsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCiAgICAgQE5vbk51bGwKICAgICBEZWZhdWx0QW5kcm9pZFByb2plY3QgYWRkVmFyaWFudChATm9uTnVsbCBWYXJpYW50SW1wbCB2YXJpYW50KSB7Ci0gICAgICAgIHZhcmlhbnRzLnB1dCh2YXJpYW50LmdldE5hbWUoKSwgdmFyaWFudCk7CisgICAgICAgIHZhcmlhbnRzLmFkZCh2YXJpYW50KTsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0gICAgQE5vbk51bGwKICAgICBAT3ZlcnJpZGUKKyAgICBATm9uTnVsbAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TW9kZWxWZXJzaW9uKCkgewogICAgICAgICByZXR1cm4gbW9kZWxWZXJzaW9uOwogICAgIH0KQEAgLTEwNCwyOCArMTIzLDM0IEBACiAgICAgICAgIHJldHVybiBuYW1lOwogICAgIH0KIAotICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCisgICAgQE5vbk51bGwKICAgICBwdWJsaWMgUHJvZHVjdEZsYXZvckNvbnRhaW5lciBnZXREZWZhdWx0Q29uZmlnKCkgewogICAgICAgICByZXR1cm4gZGVmYXVsdENvbmZpZzsKICAgICB9CiAKLSAgICBATm9uTnVsbAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBCdWlsZFR5cGVDb250YWluZXI+IGdldEJ1aWxkVHlwZXMoKSB7CisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxCdWlsZFR5cGVDb250YWluZXI+IGdldEJ1aWxkVHlwZXMoKSB7CiAgICAgICAgIHJldHVybiBidWlsZFR5cGVzOwogICAgIH0KIAotICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFByb2R1Y3RGbGF2b3JDb250YWluZXI+IGdldFByb2R1Y3RGbGF2b3JzKCkgeworICAgIEBOb25OdWxsCisgICAgcHVibGljIENvbGxlY3Rpb248UHJvZHVjdEZsYXZvckNvbnRhaW5lcj4gZ2V0UHJvZHVjdEZsYXZvcnMoKSB7CiAgICAgICAgIHJldHVybiBwcm9kdWN0Rmxhdm9yczsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFZhcmlhbnQ+IGdldFZhcmlhbnRzKCkgeworICAgICAgICByZXR1cm4gdmFyaWFudHM7CisgICAgfQorCiAgICAgQE5vbk51bGwKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWFwPFN0cmluZywgVmFyaWFudD4gZ2V0VmFyaWFudHMoKSB7Ci0gICAgICAgIHJldHVybiB2YXJpYW50czsKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxBcnRpZmFjdE1ldGFEYXRhPiBnZXRFeHRyYUFydGlmYWN0cygpIHsKKyAgICAgICAgcmV0dXJuIGV4dHJhQXJ0aWZhY3RzOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTMzLDI3ICsxNTgsNDUgQEAKICAgICAgICAgcmV0dXJuIGlzTGlicmFyeTsKICAgICB9CiAKLSAgICBATm9uTnVsbAogICAgIEBPdmVycmlkZQorICAgIEBOb25OdWxsCiAgICAgcHVibGljIFN0cmluZyBnZXRDb21waWxlVGFyZ2V0KCkgewogICAgICAgICByZXR1cm4gY29tcGlsZVRhcmdldDsKICAgICB9CiAKLSAgICBATm9uTnVsbAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Qm9vdENsYXNzcGF0aCgpIHsKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0Qm9vdENsYXNzcGF0aCgpIHsKICAgICAgICAgcmV0dXJuIGJvb3RDbGFzc3BhdGg7CiAgICAgfQogCi0gICAgQE5vbk51bGwKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWFwPFN0cmluZyxTaWduaW5nQ29uZmlnPiBnZXRTaWduaW5nQ29uZmlncygpIHsKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBDb2xsZWN0aW9uPEZpbGU+IGdldEZyYW1ld29ya1NvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiBmcmFtZXdvcmtTb3VyY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTaWduaW5nQ29uZmlnPiBnZXRTaWduaW5nQ29uZmlncygpIHsKICAgICAgICAgcmV0dXJuIHNpZ25pbmdDb25maWdzOwogICAgIH0KIAotICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCisgICAgQE5vbk51bGwKICAgICBwdWJsaWMgQWFwdE9wdGlvbnMgZ2V0QWFwdE9wdGlvbnMoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOb25OdWxsCisgICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRVbnJlc29sdmVkRGVwZW5kZW5jaWVzKCkgeworICAgICAgICByZXR1cm4gdW5yZXNvbHZlZERlcGVuZGVuY2llczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBKYXZhQ29tcGlsZU9wdGlvbnMgZ2V0SmF2YUNvbXBpbGVPcHRpb25zKCkgeworICAgICAgICByZXR1cm4gamF2YUNvbXBpbGVPcHRpb25zOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL0RlZmF1bHRKYXZhQ29tcGlsZU9wdGlvbnMuamF2YSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL0RlZmF1bHRKYXZhQ29tcGlsZU9wdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGU0YTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvRGVmYXVsdEphdmFDb21waWxlT3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwubW9kZWw7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC5Db21waWxlT3B0aW9uczsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkphdmFDb21waWxlT3B0aW9uczsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBKYXZhQ29tcGlsZU9wdGlvbnN9LgorICovCitjbGFzcyBEZWZhdWx0SmF2YUNvbXBpbGVPcHRpb25zIGltcGxlbWVudHMgSmF2YUNvbXBpbGVPcHRpb25zLCBTZXJpYWxpemFibGUgeworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc291cmNlQ29tcGF0aWJpbGl0eTsKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRhcmdldENvbXBhdGliaWxpdHk7CisKKyAgICBEZWZhdWx0SmF2YUNvbXBpbGVPcHRpb25zKEBOb25OdWxsIENvbXBpbGVPcHRpb25zIG9wdGlvbnMpIHsKKyAgICAgIHNvdXJjZUNvbXBhdGliaWxpdHkgPSBvcHRpb25zLmdldFNvdXJjZUNvbXBhdGliaWxpdHkoKS50b1N0cmluZygpOworICAgICAgdGFyZ2V0Q29tcGF0aWJpbGl0eSA9IG9wdGlvbnMuZ2V0VGFyZ2V0Q29tcGF0aWJpbGl0eSgpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUNvbXBhdGliaWxpdHkoKSB7CisgICAgICAgIHJldHVybiBzb3VyY2VDb21wYXRpYmlsaXR5OworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRDb21wYXRpYmlsaXR5KCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0Q29tcGF0aWJpbGl0eTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9KYXZhQXJ0aWZhY3RJbXBsLmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9KYXZhQXJ0aWZhY3RJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3NTg0YwotLS0gL2Rldi9udWxsCisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL0phdmFBcnRpZmFjdEltcGwuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwubW9kZWw7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuRGVwZW5kZW5jaWVzOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuSmF2YUFydGlmYWN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuU291cmNlUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgSmF2YUFydGlmYWN0IHRoYXQgaXMgc2VyaWFsaXphYmxlCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhQXJ0aWZhY3RJbXBsIGV4dGVuZHMgQmFzZUFydGlmYWN0SW1wbCBpbXBsZW1lbnRzIEphdmFBcnRpZmFjdCwgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIHB1YmxpYyBzdGF0aWMgSmF2YUFydGlmYWN0SW1wbCBjbG9uZShATm9uTnVsbCBKYXZhQXJ0aWZhY3QgamF2YUFydGlmYWN0KSB7CisgICAgICAgIHJldHVybiBuZXcgSmF2YUFydGlmYWN0SW1wbCgKKyAgICAgICAgICAgICAgICBqYXZhQXJ0aWZhY3QuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIGphdmFBcnRpZmFjdC5nZXRBc3NlbWJsZVRhc2tOYW1lKCksCisgICAgICAgICAgICAgICAgamF2YUFydGlmYWN0LmdldEphdmFDb21waWxlVGFza05hbWUoKSwKKyAgICAgICAgICAgICAgICBqYXZhQXJ0aWZhY3QuZ2V0Q2xhc3Nlc0ZvbGRlcigpLAorICAgICAgICAgICAgICAgIGphdmFBcnRpZmFjdC5nZXREZXBlbmRlbmNpZXMoKSwgLy8gVE9ETzpGaXhNRQorICAgICAgICAgICAgICAgIFNvdXJjZVByb3ZpZGVySW1wbC5jbG9uZVByb3ZpZGVyKGphdmFBcnRpZmFjdC5nZXRWYXJpYW50U291cmNlUHJvdmlkZXIoKSksCisgICAgICAgICAgICAgICAgU291cmNlUHJvdmlkZXJJbXBsLmNsb25lUHJvdmlkZXIoamF2YUFydGlmYWN0LmdldE11bHRpRmxhdm9yU291cmNlUHJvdmlkZXIoKSkpOworICAgIH0KKworICAgIHB1YmxpYyBKYXZhQXJ0aWZhY3RJbXBsKEBOb25OdWxsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBhc3NlbWJsZVRhc2tOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBqYXZhQ29tcGlsZVRhc2tOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIEZpbGUgY2xhc3Nlc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBEZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTb3VyY2VQcm92aWRlciB2YXJpYW50U291cmNlUHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIFNvdXJjZVByb3ZpZGVyIG11bHRpRmxhdm9yU291cmNlUHJvdmlkZXJzKSB7CisgICAgICAgIHN1cGVyKG5hbWUsIGFzc2VtYmxlVGFza05hbWUsIGphdmFDb21waWxlVGFza05hbWUsIGNsYXNzZXNGb2xkZXIsIGRlcGVuZGVuY2llcywKKyAgICAgICAgICAgICAgICB2YXJpYW50U291cmNlUHJvdmlkZXIsIG11bHRpRmxhdm9yU291cmNlUHJvdmlkZXJzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9Nb2RlbEJ1aWxkZXIuZ3Jvb3Z5IGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvTW9kZWxCdWlsZGVyLmdyb292eQppbmRleCA0NTgwNmU0Li40MWVjMTRmIDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9Nb2RlbEJ1aWxkZXIuZ3Jvb3Z5CisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL01vZGVsQnVpbGRlci5ncm9vdnkKQEAgLTI2LDIzICsyNiwyNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC52YXJpYW50LkJhc2VWYXJpYW50RGF0YQogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC52YXJpYW50LkxpYnJhcnlWYXJpYW50RGF0YQogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC52YXJpYW50LlRlc3RWYXJpYW50RGF0YQotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQW5kcm9pZFByb2plY3QKLWltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkFydGlmYWN0SW5mbwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQnVpbGRUeXBlQ29udGFpbmVyCi1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Qcm9kdWN0Rmxhdm9yQ29udGFpbmVyCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5EZWZhdWx0UHJvZHVjdEZsYXZvcgogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuU2RrUGFyc2VyCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5WYXJpYW50Q29uZmlndXJhdGlvbgoraW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQW5kcm9pZEFydGlmYWN0CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5BbmRyb2lkUHJvamVjdAoraW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQXJ0aWZhY3RNZXRhRGF0YQoraW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuSmF2YUFydGlmYWN0CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5TaWduaW5nQ29uZmlnCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Tb3VyY2VQcm92aWRlcgoraW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuU291cmNlUHJvdmlkZXJDb250YWluZXIKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzCiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkuUHJvamVjdAogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnBsdWdpbnMuVW5rbm93blBsdWdpbkV4Y2VwdGlvbgogaW1wb3J0IG9yZy5ncmFkbGUudG9vbGluZy5wcm92aWRlci5tb2RlbC5Ub29saW5nTW9kZWxCdWlsZGVyCiAKIGltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMKIGltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5BbmRyb2lkUHJvamVjdC5BUlRJRkFDVF9JTlNUUlVNRU5UX1RFU1QKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5BbmRyb2lkUHJvamVjdC5BUlRJRkFDVF9NQUlOCisKIC8qKgogICogQnVpbGRlciBmb3IgdGhlIGN1c3RvbSBBbmRyb2lkIG1vZGVsLgogICovCkBAIC03OCwzNiArODIsNjAgQEAKIAogICAgICAgICBTZGtQYXJzZXIgc2RrUGFyc2VyID0gYmFzZVBsdWdpbi5nZXRMb2FkZWRTZGtQYXJzZXIoKQogICAgICAgICBMaXN0PFN0cmluZz4gYm9vdENsYXNzcGF0aCA9IGJhc2VQbHVnaW4ucnVudGltZUphckxpc3QKKyAgICAgICAgTGlzdDxGaWxlPiBmcmFtZXdvcmtTb3VyY2UgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICAgICAgU3RyaW5nIGNvbXBpbGVUYXJnZXQgPSBzZGtQYXJzZXIudGFyZ2V0Lmhhc2hTdHJpbmcoKQogCisgICAgICAgIC8vIGxpc3Qgb2YgZXh0cmEgYXJ0aWZhY3RzCisgICAgICAgIExpc3Q8QXJ0aWZhY3RNZXRhRGF0YT4gYXJ0aWZhY3RNZXRhRGF0YUxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoYmFzZVBsdWdpbi5leHRyYUFydGlmYWN0cykKKyAgICAgICAgLy8gcGx1cyB0aGUgaW5zdHJ1bWVudGF0aW9uIHRlc3Qgb25lLgorICAgICAgICBhcnRpZmFjdE1ldGFEYXRhTGlzdC5hZGQoCisgICAgICAgICAgICAgICAgbmV3IEFydGlmYWN0TWV0YURhdGFJbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAgQVJUSUZBQ1RfSU5TVFJVTUVOVF9URVNULAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmlzVGVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWZhY3RNZXRhRGF0YS5UWVBFX0FORFJPSUQpKTsKKwogICAgICAgICAvL25vaW5zcGVjdGlvbiBHcm9vdnlWYXJpYWJsZU5vdEFzc2lnbmVkCiAgICAgICAgIERlZmF1bHRBbmRyb2lkUHJvamVjdCBhbmRyb2lkUHJvamVjdCA9IG5ldyBEZWZhdWx0QW5kcm9pZFByb2plY3QoCiAgICAgICAgICAgICAgICAgZ2V0TW9kZWxWZXJzaW9uKCksCiAgICAgICAgICAgICAgICAgcHJvamVjdC5uYW1lLAogICAgICAgICAgICAgICAgIGNvbXBpbGVUYXJnZXQsCiAgICAgICAgICAgICAgICAgYm9vdENsYXNzcGF0aCwKKyAgICAgICAgICAgICAgICBmcmFtZXdvcmtTb3VyY2UsCiAgICAgICAgICAgICAgICAgY2xvbmVTaWduaW5nQ29uZmlncyhzaWduaW5nQ29uZmlncyksCisgICAgICAgICAgICAgICAgYXJ0aWZhY3RNZXRhRGF0YUxpc3QsCisgICAgICAgICAgICAgICAgYmFzZVBsdWdpbi51bnJlc29sdmVkRGVwZW5kZW5jaWVzLAorICAgICAgICAgICAgICAgIGJhc2VQbHVnaW4uZXh0ZW5zaW9uLmNvbXBpbGVPcHRpb25zLAogICAgICAgICAgICAgICAgIGxpYlBsdWdpbiAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAuc2V0RGVmYXVsdENvbmZpZyhjcmVhdGVQRkMoYmFzZVBsdWdpbi5kZWZhdWx0Q29uZmlnRGF0YSkpCisgICAgICAgICAgICAgICAgICAgIC5zZXREZWZhdWx0Q29uZmlnKFByb2R1Y3RGbGF2b3JDb250YWluZXJJbXBsLmNyZWF0ZVBGQygKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VQbHVnaW4uZGVmYXVsdENvbmZpZ0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlUGx1Z2luLmdldEV4dHJhRmxhdm9yU291cmNlUHJvdmlkZXJzKGJhc2VQbHVnaW4uZGVmYXVsdENvbmZpZ0RhdGEucHJvZHVjdEZsYXZvci5uYW1lKSkpCiAKICAgICAgICAgaWYgKGFwcFBsdWdpbiAhPSBudWxsKSB7CiAgICAgICAgICAgICBmb3IgKEJ1aWxkVHlwZURhdGEgYnREYXRhIDogYXBwUGx1Z2luLmJ1aWxkVHlwZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkUHJvamVjdC5hZGRCdWlsZFR5cGUoY3JlYXRlQlRDKGJ0RGF0YSkpCisgICAgICAgICAgICAgICAgYW5kcm9pZFByb2plY3QuYWRkQnVpbGRUeXBlKEJ1aWxkVHlwZUNvbnRhaW5lckltcGwuY3JlYXRlQlRDKAorICAgICAgICAgICAgICAgICAgICAgICAgYnREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVBsdWdpbi5nZXRFeHRyYUJ1aWxkVHlwZVNvdXJjZVByb3ZpZGVycyhidERhdGEuYnVpbGRUeXBlLm5hbWUpKSkKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoUHJvZHVjdEZsYXZvckRhdGEgcGZEYXRhIDogYXBwUGx1Z2luLnByb2R1Y3RGbGF2b3JzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZFByb2plY3QuYWRkUHJvZHVjdEZsYXZvcnMoY3JlYXRlUEZDKHBmRGF0YSkpCisgICAgICAgICAgICAgICAgYW5kcm9pZFByb2plY3QuYWRkUHJvZHVjdEZsYXZvcnMoUHJvZHVjdEZsYXZvckNvbnRhaW5lckltcGwuY3JlYXRlUEZDKAorICAgICAgICAgICAgICAgICAgICAgICAgcGZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVBsdWdpbi5nZXRFeHRyYUZsYXZvclNvdXJjZVByb3ZpZGVycyhwZkRhdGEucHJvZHVjdEZsYXZvci5uYW1lKSkpCiAgICAgICAgICAgICB9CiAKICAgICAgICAgfSBlbHNlIGlmIChsaWJQbHVnaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgYW5kcm9pZFByb2plY3QuYWRkQnVpbGRUeXBlKGNyZWF0ZUJUQyhsaWJQbHVnaW4uZGVidWdCdWlsZFR5cGVEYXRhKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEJ1aWxkVHlwZShjcmVhdGVCVEMobGliUGx1Z2luLnJlbGVhc2VCdWlsZFR5cGVEYXRhKSkKKyAgICAgICAgICAgIGFuZHJvaWRQcm9qZWN0LmFkZEJ1aWxkVHlwZShCdWlsZFR5cGVDb250YWluZXJJbXBsLmNyZWF0ZUJUQygKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpYlBsdWdpbi5kZWJ1Z0J1aWxkVHlwZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlUGx1Z2luLmdldEV4dHJhQnVpbGRUeXBlU291cmNlUHJvdmlkZXJzKGxpYlBsdWdpbi5kZWJ1Z0J1aWxkVHlwZURhdGEuYnVpbGRUeXBlLm5hbWUpKSkKKyAgICAgICAgICAgICAgICAgLmFkZEJ1aWxkVHlwZShCdWlsZFR5cGVDb250YWluZXJJbXBsLmNyZWF0ZUJUQygKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpYlBsdWdpbi5yZWxlYXNlQnVpbGRUeXBlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VQbHVnaW4uZ2V0RXh0cmFCdWlsZFR5cGVTb3VyY2VQcm92aWRlcnMobGliUGx1Z2luLnJlbGVhc2VCdWlsZFR5cGVEYXRhLmJ1aWxkVHlwZS5uYW1lKSkpCiAgICAgICAgIH0KIAogICAgICAgICBTZXQ8UHJvamVjdD4gZ3JhZGxlUHJvamVjdHMgPSBwcm9qZWN0LmdldFJvb3RQcm9qZWN0KCkuZ2V0QWxscHJvamVjdHMoKTsKIAogICAgICAgICBmb3IgKEJhc2VWYXJpYW50RGF0YSB2YXJpYW50RGF0YSA6IGJhc2VQbHVnaW4udmFyaWFudERhdGFMaXN0KSB7CiAgICAgICAgICAgICBpZiAoISh2YXJpYW50RGF0YSBpbnN0YW5jZW9mIFRlc3RWYXJpYW50RGF0YSkpIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkUHJvamVjdC5hZGRWYXJpYW50KGNyZWF0ZVZhcmlhbnQodmFyaWFudERhdGEsIGdyYWRsZVByb2plY3RzKSkKKyAgICAgICAgICAgICAgICBhbmRyb2lkUHJvamVjdC5hZGRWYXJpYW50KGNyZWF0ZVZhcmlhbnQodmFyaWFudERhdGEsIGJhc2VQbHVnaW4sIGdyYWRsZVByb2plY3RzKSkKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMzcsNiArMTY1LDcgQEAKIAogICAgIEBOb25OdWxsCiAgICAgcHJpdmF0ZSBzdGF0aWMgVmFyaWFudEltcGwgY3JlYXRlVmFyaWFudChATm9uTnVsbCBCYXNlVmFyaWFudERhdGEgdmFyaWFudERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBCYXNlUGx1Z2luIGJhc2VQbHVnaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBTZXQ8UHJvamVjdD4gZ3JhZGxlUHJvamVjdHMpIHsKICAgICAgICAgVGVzdFZhcmlhbnREYXRhIHRlc3RWYXJpYW50RGF0YSA9IG51bGwKICAgICAgICAgaWYgKHZhcmlhbnREYXRhIGluc3RhbmNlb2YgQXBwbGljYXRpb25WYXJpYW50RGF0YSB8fApAQCAtMTQ0LDI0ICsxNzMsNDMgQEAKICAgICAgICAgICAgIHRlc3RWYXJpYW50RGF0YSA9IHZhcmlhbnREYXRhLnRlc3RWYXJpYW50RGF0YQogICAgICAgICB9CiAKLSAgICAgICAgQXJ0aWZhY3RJbmZvIG1haW5BcnRpZmFjdCA9IGNyZWF0ZUFydGlmYWN0SW5mbyh2YXJpYW50RGF0YSwgZ3JhZGxlUHJvamVjdHMpCi0gICAgICAgIEFydGlmYWN0SW5mbyB0ZXN0QXJ0aWZhY3QgPSB0ZXN0VmFyaWFudERhdGEgIT0gbnVsbCA/Ci0gICAgICAgICAgICBjcmVhdGVBcnRpZmFjdEluZm8odGVzdFZhcmlhbnREYXRhLCBncmFkbGVQcm9qZWN0cykgOiBudWxsCisgICAgICAgIEFuZHJvaWRBcnRpZmFjdCBtYWluQXJ0aWZhY3QgPSBjcmVhdGVBcnRpZmFjdEluZm8oCisgICAgICAgICAgICAgICAgQVJUSUZBQ1RfTUFJTiwgdmFyaWFudERhdGEsIGJhc2VQbHVnaW4sIGdyYWRsZVByb2plY3RzKQorCisgICAgICAgIFN0cmluZyB2YXJpYW50TmFtZSA9IHZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLmZ1bGxOYW1lCisKKyAgICAgICAgLy8gZXh0cmEgQW5kcm9pZCBBcnRpZmFjdHMKKyAgICAgICAgQW5kcm9pZEFydGlmYWN0IHRlc3RBcnRpZmFjdCA9IHRlc3RWYXJpYW50RGF0YSAhPSBudWxsID8KKyAgICAgICAgICAgICAgICBjcmVhdGVBcnRpZmFjdEluZm8oQVJUSUZBQ1RfSU5TVFJVTUVOVF9URVNULCB0ZXN0VmFyaWFudERhdGEsIGJhc2VQbHVnaW4sIGdyYWRsZVByb2plY3RzKSA6IG51bGwKKworICAgICAgICBMaXN0PEFuZHJvaWRBcnRpZmFjdD4gZXh0cmFBbmRyb2lkQXJ0aWZhY3RzID0gTGlzdHMubmV3QXJyYXlMaXN0KAorICAgICAgICAgICAgICAgIGJhc2VQbHVnaW4uZ2V0RXh0cmFBbmRyb2lkQXJ0aWZhY3RzKHZhcmlhbnROYW1lKSkKKyAgICAgICAgaWYgKHRlc3RBcnRpZmFjdCAhPSBudWxsKSB7CisgICAgICAgICAgICBleHRyYUFuZHJvaWRBcnRpZmFjdHMuYWRkKHRlc3RBcnRpZmFjdCkKKyAgICAgICAgfQorCisgICAgICAgIC8vIGV4dHJhIEphdmEgQXJ0aWZhY3RzCisgICAgICAgIExpc3Q8SmF2YUFydGlmYWN0PiBleHRyYUphdmFBcnRpZmFjdHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoCisgICAgICAgICAgICAgICAgYmFzZVBsdWdpbi5nZXRFeHRyYUphdmFBcnRpZmFjdHModmFyaWFudE5hbWUpKQogCiAgICAgICAgIFZhcmlhbnRJbXBsIHZhcmlhbnQgPSBuZXcgVmFyaWFudEltcGwoCi0gICAgICAgICAgICAgICAgdmFyaWFudERhdGEubmFtZSwKLSAgICAgICAgICAgICAgICB2YXJpYW50RGF0YS5iYXNlTmFtZSwKKyAgICAgICAgICAgICAgICB2YXJpYW50TmFtZSwKKyAgICAgICAgICAgICAgICB2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5iYXNlTmFtZSwKICAgICAgICAgICAgICAgICB2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5idWlsZFR5cGUubmFtZSwKICAgICAgICAgICAgICAgICBnZXRQcm9kdWN0Rmxhdm9yTmFtZXModmFyaWFudERhdGEpLAogICAgICAgICAgICAgICAgIFByb2R1Y3RGbGF2b3JJbXBsLmNsb25lRmxhdm9yKHZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLm1lcmdlZEZsYXZvciksCiAgICAgICAgICAgICAgICAgbWFpbkFydGlmYWN0LAotICAgICAgICAgICAgICAgIHRlc3RBcnRpZmFjdCkKKyAgICAgICAgICAgICAgICBleHRyYUFuZHJvaWRBcnRpZmFjdHMsCisgICAgICAgICAgICAgICAgZXh0cmFKYXZhQXJ0aWZhY3RzKQogCiAgICAgICAgIHJldHVybiB2YXJpYW50CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXJ0aWZhY3RJbmZvIGNyZWF0ZUFydGlmYWN0SW5mbyhATm9uTnVsbCBCYXNlVmFyaWFudERhdGEgdmFyaWFudERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBTZXQ8UHJvamVjdD4gZ3JhZGxlUHJvamVjdHMpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBBbmRyb2lkQXJ0aWZhY3QgY3JlYXRlQXJ0aWZhY3RJbmZvKAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBATm9uTnVsbCBCYXNlVmFyaWFudERhdGEgdmFyaWFudERhdGEsCisgICAgICAgICAgICBATm9uTnVsbCBCYXNlUGx1Z2luIGJhc2VQbHVnaW4sCisgICAgICAgICAgICBATm9uTnVsbCBTZXQ8UHJvamVjdD4gZ3JhZGxlUHJvamVjdHMpIHsKICAgICAgICAgVmFyaWFudENvbmZpZ3VyYXRpb24gdkMgPSB2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbgogCiAgICAgICAgIFNpZ25pbmdDb25maWcgc2lnbmluZ0NvbmZpZyA9IHZDLnNpZ25pbmdDb25maWcKQEAgLTE3MCwxNyArMjE4LDQwIEBACiAgICAgICAgICAgICBzaWduaW5nQ29uZmlnTmFtZSA9IHNpZ25pbmdDb25maWcubmFtZQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG5ldyBBcnRpZmFjdEluZm9JbXBsKAorICAgICAgICBTb3VyY2VQcm92aWRlciB2YXJpYW50U291cmNlUHJvdmlkZXIgPSBudWxsOworICAgICAgICBTb3VyY2VQcm92aWRlciBtdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyID0gbnVsbDsKKworICAgICAgICBpZiAoQVJUSUZBQ1RfTUFJTi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHZhcmlhbnRTb3VyY2VQcm92aWRlciA9IHZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLnZhcmlhbnRTb3VyY2VQcm92aWRlcgorICAgICAgICAgICAgbXVsdGlGbGF2b3JTb3VyY2VQcm92aWRlciA9IHZhcmlhbnREYXRhLnZhcmlhbnRDb25maWd1cmF0aW9uLm11bHRpRmxhdm9yU291cmNlUHJvdmlkZXIKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyKAorICAgICAgICAgICAgICAgICAgICBiYXNlUGx1Z2luLmdldEV4dHJhVmFyaWFudFNvdXJjZVByb3ZpZGVycyh2YXJpYW50RGF0YS5nZXRWYXJpYW50Q29uZmlndXJhdGlvbigpLmdldEZ1bGxOYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICBuYW1lKQorICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmFyaWFudFNvdXJjZVByb3ZpZGVyID0gY29udGFpbmVyLnNvdXJjZVByb3ZpZGVyCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXJpYW50U291cmNlUHJvdmlkZXIgPSB2YXJpYW50U291cmNlUHJvdmlkZXIgIT0gbnVsbCA/IFNvdXJjZVByb3ZpZGVySW1wbC5jbG9uZVByb3ZpZGVyKHZhcmlhbnRTb3VyY2VQcm92aWRlcikgOiBudWxsCisgICAgICAgIG11bHRpRmxhdm9yU291cmNlUHJvdmlkZXIgPSBtdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyICE9IG51bGwgPyBTb3VyY2VQcm92aWRlckltcGwuY2xvbmVQcm92aWRlcihtdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyKSA6IG51bGwKKworICAgICAgICByZXR1cm4gbmV3IEFuZHJvaWRBcnRpZmFjdEltcGwoCisgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICB2YXJpYW50RGF0YS5hc3NlbWJsZVRhc2submFtZSwKICAgICAgICAgICAgICAgICB2YXJpYW50RGF0YS5vdXRwdXRGaWxlLAogICAgICAgICAgICAgICAgIHZDLmlzU2lnbmluZ1JlYWR5KCksCiAgICAgICAgICAgICAgICAgc2lnbmluZ0NvbmZpZ05hbWUsCiAgICAgICAgICAgICAgICAgdkMucGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgdmFyaWFudERhdGEuc291cmNlR2VuVGFzay5uYW1lLAorICAgICAgICAgICAgICAgIHZhcmlhbnREYXRhLmphdmFDb21waWxlVGFzay5uYW1lLAorICAgICAgICAgICAgICAgIHZhcmlhbnREYXRhLnByb2Nlc3NNYW5pZmVzdFRhc2subWFuaWZlc3RPdXRwdXRGaWxlLAogICAgICAgICAgICAgICAgIGdldEdlbmVyYXRlZFNvdXJjZUZvbGRlcnModmFyaWFudERhdGEpLAogICAgICAgICAgICAgICAgIGdldEdlbmVyYXRlZFJlc291cmNlRm9sZGVycyh2YXJpYW50RGF0YSksCiAgICAgICAgICAgICAgICAgdmFyaWFudERhdGEuamF2YUNvbXBpbGVUYXNrLmRlc3RpbmF0aW9uRGlyLAotICAgICAgICAgICAgICAgIERlcGVuZGVuY2llc0ltcGwuY2xvbmVEZXBlbmRlbmNpZXModmFyaWFudERhdGEudmFyaWFudERlcGVuZGVuY3ksIGdyYWRsZVByb2plY3RzKQotICAgICAgICApCisgICAgICAgICAgICAgICAgRGVwZW5kZW5jaWVzSW1wbC5jbG9uZURlcGVuZGVuY2llcyh2YXJpYW50RGF0YS52YXJpYW50RGVwZW5kZW5jeSwgZ3JhZGxlUHJvamVjdHMpLAorICAgICAgICAgICAgICAgIHZhcmlhbnRTb3VyY2VQcm92aWRlciwKKyAgICAgICAgICAgICAgICBtdWx0aUZsYXZvclNvdXJjZVByb3ZpZGVyKQogICAgIH0KIAogICAgIEBOb25OdWxsCkBAIC0yMDQsOCArMjc1LDE1IEBACiAKICAgICAgICAgZm9sZGVycy5hZGQodmFyaWFudERhdGEucHJvY2Vzc1Jlc291cmNlc1Rhc2suc291cmNlT3V0cHV0RGlyKQogICAgICAgICBmb2xkZXJzLmFkZCh2YXJpYW50RGF0YS5haWRsQ29tcGlsZVRhc2suc291cmNlT3V0cHV0RGlyKQotICAgICAgICBmb2xkZXJzLmFkZCh2YXJpYW50RGF0YS5yZW5kZXJzY3JpcHRDb21waWxlVGFzay5zb3VyY2VPdXRwdXREaXIpCiAgICAgICAgIGZvbGRlcnMuYWRkKHZhcmlhbnREYXRhLmdlbmVyYXRlQnVpbGRDb25maWdUYXNrLnNvdXJjZU91dHB1dERpcikKKyAgICAgICAgaWYgKCF2YXJpYW50RGF0YS52YXJpYW50Q29uZmlndXJhdGlvbi5tZXJnZWRGbGF2b3IucmVuZGVyc2NyaXB0TmRrTW9kZSkgeworICAgICAgICAgICAgZm9sZGVycy5hZGQodmFyaWFudERhdGEucmVuZGVyc2NyaXB0Q29tcGlsZVRhc2suc291cmNlT3V0cHV0RGlyKQorICAgICAgICB9CisKKyAgICAgICAgTGlzdDxGaWxlPiBleHRyYUZvbGRlcnMgPSB2YXJpYW50RGF0YS5leHRyYUdlbmVyYXRlZFNvdXJjZUZvbGRlcnMKKyAgICAgICAgaWYgKGV4dHJhRm9sZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb2xkZXJzLmFkZEFsbChleHRyYUZvbGRlcnMpCisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZm9sZGVycwogICAgIH0KQEAgLTIxOSw1NCArMjk3LDI5IEBACiAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHZhcmlhbnREYXRhLnJlbmRlcnNjcmlwdENvbXBpbGVUYXNrLnJlc091dHB1dERpcikKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBQcm9kdWN0Rmxhdm9yQ29udGFpbmVyIGZyb20gYSBQcm9kdWN0Rmxhdm9yRGF0YQotICAgICAqIEBwYXJhbSBwcm9kdWN0Rmxhdm9yRGF0YSB0aGUgcHJvZHVjdCBmbGF2b3IgZGF0YQotICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBQcm9kdWN0Rmxhdm9yQ29udGFpbmVyCi0gICAgICovCiAgICAgQE5vbk51bGwKLSAgICBwcml2YXRlIHN0YXRpYyBQcm9kdWN0Rmxhdm9yQ29udGFpbmVyIGNyZWF0ZVBGQyhATm9uTnVsbCBQcm9kdWN0Rmxhdm9yRGF0YSBwcm9kdWN0Rmxhdm9yRGF0YSkgewotICAgICAgICByZXR1cm4gbmV3IFByb2R1Y3RGbGF2b3JDb250YWluZXJJbXBsKAotICAgICAgICAgICAgICAgIFByb2R1Y3RGbGF2b3JJbXBsLmNsb25lRmxhdm9yKHByb2R1Y3RGbGF2b3JEYXRhLnByb2R1Y3RGbGF2b3IpLAotICAgICAgICAgICAgICAgIFNvdXJjZVByb3ZpZGVySW1wbC5jbG9uZVByb3ZpZGVyKChTb3VyY2VQcm92aWRlcikgcHJvZHVjdEZsYXZvckRhdGEuc291cmNlU2V0KSwKLSAgICAgICAgICAgICAgICBTb3VyY2VQcm92aWRlckltcGwuY2xvbmVQcm92aWRlcigoU291cmNlUHJvdmlkZXIpIHByb2R1Y3RGbGF2b3JEYXRhLnRlc3RTb3VyY2VTZXQpKQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJ1aWxkVHlwZUNvbnRhaW5lciBmcm9tIGEgQnVpbGRUeXBlRGF0YQotICAgICAqIEBwYXJhbSBidWlsZFR5cGVEYXRhIHRoZSBidWlsZCB0eXBlIGRhdGEKLSAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgQnVpbGRUeXBlQ29udGFpbmVyCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwcml2YXRlIHN0YXRpYyBCdWlsZFR5cGVDb250YWluZXIgY3JlYXRlQlRDKEBOb25OdWxsIEJ1aWxkVHlwZURhdGEgYnVpbGRUeXBlRGF0YSkgewotICAgICAgICByZXR1cm4gbmV3IEJ1aWxkVHlwZUNvbnRhaW5lckltcGwoCi0gICAgICAgICAgICAgICAgQnVpbGRUeXBlSW1wbC5jbG9uZUJ1aWxkVHlwZShidWlsZFR5cGVEYXRhLmJ1aWxkVHlwZSksCi0gICAgICAgICAgICAgICAgU291cmNlUHJvdmlkZXJJbXBsLmNsb25lUHJvdmlkZXIoKFNvdXJjZVByb3ZpZGVyKSBidWlsZFR5cGVEYXRhLnNvdXJjZVNldCkpCi0gICAgfQotCi0gICAgQE5vbk51bGwKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTaWduaW5nQ29uZmlnPiBjbG9uZVNpZ25pbmdDb25maWdzKAorICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U2lnbmluZ0NvbmZpZz4gY2xvbmVTaWduaW5nQ29uZmlncygKICAgICAgICAgICAgIEBOb25OdWxsIENvbGxlY3Rpb248U2lnbmluZ0NvbmZpZz4gc2lnbmluZ0NvbmZpZ3MpIHsKLSAgICAgICAgTWFwPFN0cmluZywgU2lnbmluZ0NvbmZpZz4gcmVzdWx0cyA9IE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoc2lnbmluZ0NvbmZpZ3Muc2l6ZSgpKQorICAgICAgICBDb2xsZWN0aW9uPFNpZ25pbmdDb25maWc+IHJlc3VsdHMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoc2lnbmluZ0NvbmZpZ3Muc2l6ZSgpKQogCiAgICAgICAgIGZvciAoU2lnbmluZ0NvbmZpZyBzaWduaW5nQ29uZmlnIDogc2lnbmluZ0NvbmZpZ3MpIHsKLSAgICAgICAgICAgIFNpZ25pbmdDb25maWcgY2xvbmVkU2lnbmluZ0NvbmZpZyA9IGNyZWF0ZVNpZ25pbmdDb25maWcoc2lnbmluZ0NvbmZpZykKLSAgICAgICAgICAgIHJlc3VsdHMucHV0KGNsb25lZFNpZ25pbmdDb25maWcubmFtZSwgY2xvbmVkU2lnbmluZ0NvbmZpZykKKyAgICAgICAgICAgIHJlc3VsdHMuYWRkKFNpZ25pbmdDb25maWdJbXBsLmNyZWF0ZVNpZ25pbmdDb25maWcoc2lnbmluZ0NvbmZpZykpCiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcmVzdWx0cwogICAgIH0KIAotICAgIEBOb25OdWxsCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2lnbmluZ0NvbmZpZyBjcmVhdGVTaWduaW5nQ29uZmlnKEBOb25OdWxsIFNpZ25pbmdDb25maWcgc2lnbmluZ0NvbmZpZykgewotICAgICAgICByZXR1cm4gbmV3IFNpZ25pbmdDb25maWdJbXBsKAotICAgICAgICAgICAgICAgIHNpZ25pbmdDb25maWcuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIHNpZ25pbmdDb25maWcuZ2V0U3RvcmVGaWxlKCksCi0gICAgICAgICAgICAgICAgc2lnbmluZ0NvbmZpZy5nZXRTdG9yZVBhc3N3b3JkKCksCi0gICAgICAgICAgICAgICAgc2lnbmluZ0NvbmZpZy5nZXRLZXlBbGlhcygpLAotICAgICAgICAgICAgICAgIHNpZ25pbmdDb25maWcuZ2V0S2V5UGFzc3dvcmQoKSwKLSAgICAgICAgICAgICAgICBzaWduaW5nQ29uZmlnLmdldFN0b3JlVHlwZSgpLAotICAgICAgICAgICAgICAgIHNpZ25pbmdDb25maWcuaXNTaWduaW5nUmVhZHkoKSkKKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIHN0YXRpYyBTb3VyY2VQcm92aWRlckNvbnRhaW5lciBnZXRTb3VyY2VQcm92aWRlckNvbnRhaW5lcigKKyAgICAgICAgICAgIEBOb25OdWxsIENvbGxlY3Rpb248U291cmNlUHJvdmlkZXJDb250YWluZXI+IGl0ZW1zLAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZm9yIChTb3VyY2VQcm92aWRlckNvbnRhaW5lciBpdGVtIDogaXRlbXMpIHsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhpdGVtLmdldEFydGlmYWN0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9Qcm9kdWN0Rmxhdm9yQ29udGFpbmVySW1wbC5qYXZhIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvUHJvZHVjdEZsYXZvckNvbnRhaW5lckltcGwuamF2YQppbmRleCBkYWMzOGU2Li45MmZhNzk0IDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9Qcm9kdWN0Rmxhdm9yQ29udGFpbmVySW1wbC5qYXZhCisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL1Byb2R1Y3RGbGF2b3JDb250YWluZXJJbXBsLmphdmEKQEAgLTE3LDExICsxNywxNiBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwubW9kZWw7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuUHJvZHVjdEZsYXZvckNvbnRhaW5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwuUHJvZHVjdEZsYXZvckRhdGE7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5BbmRyb2lkUHJvamVjdDsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLlByb2R1Y3RGbGF2b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Qcm9kdWN0Rmxhdm9yQ29udGFpbmVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuU291cmNlUHJvdmlkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Tb3VyY2VQcm92aWRlckNvbnRhaW5lcjsKIAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKICAqLwpAQCAtMzMsMTUgKzM4LDQzIEBACiAgICAgQE5vbk51bGwKICAgICBwcml2YXRlIGZpbmFsIFNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyOwogICAgIEBOb25OdWxsCi0gICAgcHJpdmF0ZSBmaW5hbCBTb3VyY2VQcm92aWRlciB0ZXN0U291cmNlUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyPiBleHRyYVNvdXJjZVByb3ZpZGVyczsKIAotICAgIFByb2R1Y3RGbGF2b3JDb250YWluZXJJbXBsKEBOb25OdWxsIFByb2R1Y3RGbGF2b3JJbXBsIHByb2R1Y3RGbGF2b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgU291cmNlUHJvdmlkZXJJbXBsIHNvdXJjZVByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFNvdXJjZVByb3ZpZGVySW1wbCB0ZXN0U291cmNlUHJvdmlkZXIpIHsKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBQcm9kdWN0Rmxhdm9yQ29udGFpbmVyIGZyb20gYSBQcm9kdWN0Rmxhdm9yRGF0YQorICAgICAqCisgICAgICogQHBhcmFtIHByb2R1Y3RGbGF2b3JEYXRhIHRoZSBwcm9kdWN0IGZsYXZvciBkYXRhCisgICAgICogQHBhcmFtIHNvdXJjZVByb3ZpZGVyQ29udGFpbmVycyBjb2xsZWN0aW9uIG9mIGV4dHJhIHNvdXJjZSBwcm92aWRlcnMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBQcm9kdWN0Rmxhdm9yQ29udGFpbmVyCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBzdGF0aWMgUHJvZHVjdEZsYXZvckNvbnRhaW5lciBjcmVhdGVQRkMoCisgICAgICAgICAgICBATm9uTnVsbCBQcm9kdWN0Rmxhdm9yRGF0YSBwcm9kdWN0Rmxhdm9yRGF0YSwKKyAgICAgICAgICAgIEBOb25OdWxsIENvbGxlY3Rpb248U291cmNlUHJvdmlkZXJDb250YWluZXI+IHNvdXJjZVByb3ZpZGVyQ29udGFpbmVycykgeworCisgICAgICAgIExpc3Q8U291cmNlUHJvdmlkZXJDb250YWluZXI+IGNsb25lZENvbnRhaW5lciA9IFNvdXJjZVByb3ZpZGVyQ29udGFpbmVySW1wbC5jbG9uZUNvbGxlY3Rpb24oc291cmNlUHJvdmlkZXJDb250YWluZXJzKTsKKworICAgICAgICAvLyBpbnN0cnVtZW50IHRlc3QgU291cmNlIFByb3ZpZGVyCisgICAgICAgIFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyIHRlc3RBU1AgPSBTb3VyY2VQcm92aWRlckNvbnRhaW5lckltcGwuY3JlYXRlKAorICAgICAgICAgICAgICAgIEFuZHJvaWRQcm9qZWN0LkFSVElGQUNUX0lOU1RSVU1FTlRfVEVTVCwgcHJvZHVjdEZsYXZvckRhdGEuZ2V0VGVzdFNvdXJjZVNldCgpKTsKKworICAgICAgICBjbG9uZWRDb250YWluZXIuYWRkKHRlc3RBU1ApOworCisgICAgICAgIHJldHVybiBuZXcgUHJvZHVjdEZsYXZvckNvbnRhaW5lckltcGwoCisgICAgICAgICAgICAgICAgUHJvZHVjdEZsYXZvckltcGwuY2xvbmVGbGF2b3IocHJvZHVjdEZsYXZvckRhdGEuZ2V0UHJvZHVjdEZsYXZvcigpKSwKKyAgICAgICAgICAgICAgICBTb3VyY2VQcm92aWRlckltcGwuY2xvbmVQcm92aWRlcihwcm9kdWN0Rmxhdm9yRGF0YS5nZXRTb3VyY2VTZXQoKSksCisgICAgICAgICAgICAgICAgY2xvbmVkQ29udGFpbmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFByb2R1Y3RGbGF2b3JDb250YWluZXJJbXBsKAorICAgICAgICAgICAgQE5vbk51bGwgUHJvZHVjdEZsYXZvckltcGwgcHJvZHVjdEZsYXZvciwKKyAgICAgICAgICAgIEBOb25OdWxsIFNvdXJjZVByb3ZpZGVySW1wbCBzb3VyY2VQcm92aWRlciwKKyAgICAgICAgICAgIEBOb25OdWxsIENvbGxlY3Rpb248U291cmNlUHJvdmlkZXJDb250YWluZXI+IGV4dHJhU291cmNlUHJvdmlkZXJzKSB7CiAKICAgICAgICAgdGhpcy5wcm9kdWN0Rmxhdm9yID0gcHJvZHVjdEZsYXZvcjsKICAgICAgICAgdGhpcy5zb3VyY2VQcm92aWRlciA9IHNvdXJjZVByb3ZpZGVyOwotICAgICAgICB0aGlzLnRlc3RTb3VyY2VQcm92aWRlciA9IHRlc3RTb3VyY2VQcm92aWRlcjsKKyAgICAgICAgdGhpcy5leHRyYVNvdXJjZVByb3ZpZGVycyA9IGV4dHJhU291cmNlUHJvdmlkZXJzOwogICAgIH0KIAogICAgIEBOb25OdWxsCkBAIC01OCw3ICs5MSw3IEBACiAKICAgICBATm9uTnVsbAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTb3VyY2VQcm92aWRlciBnZXRUZXN0U291cmNlUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiB0ZXN0U291cmNlUHJvdmlkZXI7CisgICAgcHVibGljIENvbGxlY3Rpb248U291cmNlUHJvdmlkZXJDb250YWluZXI+IGdldEV4dHJhU291cmNlUHJvdmlkZXJzKCkgeworICAgICAgICByZXR1cm4gZXh0cmFTb3VyY2VQcm92aWRlcnM7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvUHJvZHVjdEZsYXZvckltcGwuamF2YSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL1Byb2R1Y3RGbGF2b3JJbXBsLmphdmEKaW5kZXggZGI0Y2I2Yi4uOWYyNWUzMCAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvUHJvZHVjdEZsYXZvckltcGwuamF2YQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9Qcm9kdWN0Rmxhdm9ySW1wbC5qYXZhCkBAIC0xOCwxMiArMTgsMTcgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5DbGFzc0ZpZWxkOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuTmRrQ29uZmlnOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuUHJvZHVjdEZsYXZvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgUHJvZHVjdEZsYXZvciB0aGF0IGlzIHNlcmlhbGl6YWJsZS4gT2JqZWN0cyB1c2VkIGluIHRoZSBEU0wgY2Fubm90IGJlCkBAIC0zNiwxMiArNDEsMTYgQEAKICAgICBwcml2YXRlIGludCBtTWluU2RrVmVyc2lvbiA9IC0xOwogICAgIHByaXZhdGUgaW50IG1UYXJnZXRTZGtWZXJzaW9uID0gLTE7CiAgICAgcHJpdmF0ZSBpbnQgbVJlbmRlcnNjcmlwdFRhcmdldEFwaSA9IC0xOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVuZGVyc2NyaXB0U3VwcG9ydE1vZGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlbmRlcnNjcmlwdE5ka01vZGUgPSBmYWxzZTsKICAgICBwcml2YXRlIGludCBtVmVyc2lvbkNvZGUgPSAtMTsKICAgICBwcml2YXRlIFN0cmluZyBtVmVyc2lvbk5hbWUgPSBudWxsOwogICAgIHByaXZhdGUgU3RyaW5nIG1QYWNrYWdlTmFtZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVRlc3RQYWNrYWdlTmFtZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXIgPSBudWxsOwotCisgICAgcHJpdmF0ZSBCb29sZWFuIG1UZXN0SGFuZGxlUHJvZmlsaW5nID0gbnVsbDsKKyAgICBwcml2YXRlIEJvb2xlYW4gbVRlc3RGdW5jdGlvbmFsVGVzdCA9IG51bGw7CisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtUmVzb3VyY2VDb25maWd1cmF0aW9ucyA9IG51bGw7CiAKICAgICBATm9uTnVsbAogICAgIHN0YXRpYyBQcm9kdWN0Rmxhdm9ySW1wbCBjbG9uZUZsYXZvcihQcm9kdWN0Rmxhdm9yIHByb2R1Y3RGbGF2b3IpIHsKQEAgLTUxLDYgKzYwLDggQEAKICAgICAgICAgY2xvbmVkRmxhdm9yLm1NaW5TZGtWZXJzaW9uID0gcHJvZHVjdEZsYXZvci5nZXRNaW5TZGtWZXJzaW9uKCk7CiAgICAgICAgIGNsb25lZEZsYXZvci5tVGFyZ2V0U2RrVmVyc2lvbiA9IHByb2R1Y3RGbGF2b3IuZ2V0VGFyZ2V0U2RrVmVyc2lvbigpOwogICAgICAgICBjbG9uZWRGbGF2b3IubVJlbmRlcnNjcmlwdFRhcmdldEFwaSA9IHByb2R1Y3RGbGF2b3IuZ2V0UmVuZGVyc2NyaXB0VGFyZ2V0QXBpKCk7CisgICAgICAgIGNsb25lZEZsYXZvci5tUmVuZGVyc2NyaXB0U3VwcG9ydE1vZGUgPSBwcm9kdWN0Rmxhdm9yLmdldFJlbmRlcnNjcmlwdFN1cHBvcnRNb2RlKCk7CisgICAgICAgIGNsb25lZEZsYXZvci5tUmVuZGVyc2NyaXB0TmRrTW9kZSA9IHByb2R1Y3RGbGF2b3IuZ2V0UmVuZGVyc2NyaXB0TmRrTW9kZSgpOwogCiAgICAgICAgIGNsb25lZEZsYXZvci5tVmVyc2lvbkNvZGUgPSBwcm9kdWN0Rmxhdm9yLmdldFZlcnNpb25Db2RlKCk7CiAgICAgICAgIGNsb25lZEZsYXZvci5tVmVyc2lvbk5hbWUgPSBwcm9kdWN0Rmxhdm9yLmdldFZlcnNpb25OYW1lKCk7CkBAIC01OSw2ICs3MCwxMSBAQAogCiAgICAgICAgIGNsb25lZEZsYXZvci5tVGVzdFBhY2thZ2VOYW1lID0gcHJvZHVjdEZsYXZvci5nZXRUZXN0UGFja2FnZU5hbWUoKTsKICAgICAgICAgY2xvbmVkRmxhdm9yLm1UZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyID0gcHJvZHVjdEZsYXZvci5nZXRUZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyKCk7CisgICAgICAgIGNsb25lZEZsYXZvci5tVGVzdEhhbmRsZVByb2ZpbGluZyA9IHByb2R1Y3RGbGF2b3IuZ2V0VGVzdEhhbmRsZVByb2ZpbGluZygpOworICAgICAgICBjbG9uZWRGbGF2b3IubVRlc3RGdW5jdGlvbmFsVGVzdCA9IHByb2R1Y3RGbGF2b3IuZ2V0VGVzdEZ1bmN0aW9uYWxUZXN0KCk7CisKKyAgICAgICAgY2xvbmVkRmxhdm9yLm1SZXNvdXJjZUNvbmZpZ3VyYXRpb25zID0gU2V0cy5uZXdIYXNoU2V0KAorICAgICAgICAgICAgICAgIHByb2R1Y3RGbGF2b3IuZ2V0UmVzb3VyY2VDb25maWd1cmF0aW9ucygpKTsKIAogICAgICAgICByZXR1cm4gY2xvbmVkRmxhdm9yOwogICAgIH0KQEAgLTEwNCw2ICsxMjAsMTYgQEAKICAgICAgICAgcmV0dXJuIG1SZW5kZXJzY3JpcHRUYXJnZXRBcGk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVuZGVyc2NyaXB0U3VwcG9ydE1vZGUoKSB7CisgICAgICAgIHJldHVybiBtUmVuZGVyc2NyaXB0U3VwcG9ydE1vZGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVuZGVyc2NyaXB0TmRrTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZW5kZXJzY3JpcHROZGtNb2RlOworICAgIH0KKwogICAgIEBOdWxsYWJsZQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdFBhY2thZ2VOYW1lKCkgewpAQCAtMTE2LDI0ICsxNDIsMjIgQEAKICAgICAgICAgcmV0dXJuIG1UZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyOwogICAgIH0KIAorICAgIEBOdWxsYWJsZQogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiUHJvZHVjdEZsYXZvckltcGx7IiArCi0gICAgICAgICAgICAgICAgIm5hbWU9JyIgKyBuYW1lICsgJ1wnJyArCi0gICAgICAgICAgICAgICAgIiwgbU1pblNka1ZlcnNpb249IiArIG1NaW5TZGtWZXJzaW9uICsKLSAgICAgICAgICAgICAgICAiLCBtVGFyZ2V0U2RrVmVyc2lvbj0iICsgbVRhcmdldFNka1ZlcnNpb24gKwotICAgICAgICAgICAgICAgICIsIG1SZW5kZXJzY3JpcHRUYXJnZXRBcGk9IiArIG1SZW5kZXJzY3JpcHRUYXJnZXRBcGkgKwotICAgICAgICAgICAgICAgICIsIG1WZXJzaW9uQ29kZT0iICsgbVZlcnNpb25Db2RlICsKLSAgICAgICAgICAgICAgICAiLCBtVmVyc2lvbk5hbWU9JyIgKyBtVmVyc2lvbk5hbWUgKyAnXCcnICsKLSAgICAgICAgICAgICAgICAiLCBtUGFja2FnZU5hbWU9JyIgKyBtUGFja2FnZU5hbWUgKyAnXCcnICsKLSAgICAgICAgICAgICAgICAiLCBtVGVzdFBhY2thZ2VOYW1lPSciICsgbVRlc3RQYWNrYWdlTmFtZSArICdcJycgKwotICAgICAgICAgICAgICAgICIsIG1UZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyPSciICsgbVRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXIgKyAnXCcnICsKLSAgICAgICAgICAgICAgICAnfSc7CisgICAgcHVibGljIEJvb2xlYW4gZ2V0VGVzdEhhbmRsZVByb2ZpbGluZygpIHsKKyAgICAgICAgcmV0dXJuIG1UZXN0SGFuZGxlUHJvZmlsaW5nOwogICAgIH0KIAorICAgIEBOdWxsYWJsZQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCb29sZWFuIGdldFRlc3RGdW5jdGlvbmFsVGVzdCgpIHsKKyAgICAgICAgcmV0dXJuIG1UZXN0RnVuY3Rpb25hbFRlc3Q7CisgICAgfQorCisKICAgICBATm9uTnVsbAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QnVpbGRDb25maWcoKSB7CisgICAgcHVibGljIExpc3Q8Q2xhc3NGaWVsZD4gZ2V0QnVpbGRDb25maWdGaWVsZHMoKSB7CiAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICB9CiAKQEAgLTE0Miw0ICsxNjYsNDIgQEAKICAgICBwdWJsaWMgTGlzdDxGaWxlPiBnZXRQcm9ndWFyZEZpbGVzKCkgewogICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxGaWxlPiBnZXRDb25zdW1lclByb2d1YXJkRmlsZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgTmRrQ29uZmlnIGdldE5ka0NvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFJlc291cmNlQ29uZmlndXJhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtUmVzb3VyY2VDb25maWd1cmF0aW9uczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlByb2R1Y3RGbGF2b3JJbXBseyIgKworICAgICAgICAgICAgICAgICJuYW1lPSciICsgbmFtZSArICdcJycgKworICAgICAgICAgICAgICAgICIsIG1NaW5TZGtWZXJzaW9uPSIgKyBtTWluU2RrVmVyc2lvbiArCisgICAgICAgICAgICAgICAgIiwgbVRhcmdldFNka1ZlcnNpb249IiArIG1UYXJnZXRTZGtWZXJzaW9uICsKKyAgICAgICAgICAgICAgICAiLCBtUmVuZGVyc2NyaXB0VGFyZ2V0QXBpPSIgKyBtUmVuZGVyc2NyaXB0VGFyZ2V0QXBpICsKKyAgICAgICAgICAgICAgICAiLCBtUmVuZGVyc2NyaXB0U3VwcG9ydE1vZGU9IiArIG1SZW5kZXJzY3JpcHRTdXBwb3J0TW9kZSArCisgICAgICAgICAgICAgICAgIiwgbVJlbmRlcnNjcmlwdE5ka01vZGU9IiArIG1SZW5kZXJzY3JpcHROZGtNb2RlICsKKyAgICAgICAgICAgICAgICAiLCBtVmVyc2lvbkNvZGU9IiArIG1WZXJzaW9uQ29kZSArCisgICAgICAgICAgICAgICAgIiwgbVZlcnNpb25OYW1lPSciICsgbVZlcnNpb25OYW1lICsgJ1wnJyArCisgICAgICAgICAgICAgICAgIiwgbVBhY2thZ2VOYW1lPSciICsgbVBhY2thZ2VOYW1lICsgJ1wnJyArCisgICAgICAgICAgICAgICAgIiwgbVRlc3RQYWNrYWdlTmFtZT0nIiArIG1UZXN0UGFja2FnZU5hbWUgKyAnXCcnICsKKyAgICAgICAgICAgICAgICAiLCBtVGVzdEluc3RydW1lbnRhdGlvblJ1bm5lcj0nIiArIG1UZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyICsgJ1wnJyArCisgICAgICAgICAgICAgICAgIiwgbVRlc3RIYW5kbGVQcm9maWxpbmc9JyIgKyBtVGVzdEhhbmRsZVByb2ZpbGluZyArICdcJycgKworICAgICAgICAgICAgICAgICIsIG1UZXN0RnVuY3Rpb25hbFRlc3Q9JyIgKyBtVGVzdEZ1bmN0aW9uYWxUZXN0ICsgJ1wnJyArCisgICAgICAgICAgICAgICAgIiwgbVJlc291cmNlQ29uZmlndXJhdGlvbnM9JyIgKyBtUmVzb3VyY2VDb25maWd1cmF0aW9ucyArICdcJycgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9TaWduaW5nQ29uZmlnSW1wbC5qYXZhIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvU2lnbmluZ0NvbmZpZ0ltcGwuamF2YQppbmRleCAwNmUyMTljLi4xOWM4NjdjIDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9TaWduaW5nQ29uZmlnSW1wbC5qYXZhCisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL1NpZ25pbmdDb25maWdJbXBsLmphdmEKQEAgLTQ0LDcgKzQ0LDE5IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3RvcmVUeXBlOwogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBzaWduaW5nUmVhZHk7CiAKLSAgICBTaWduaW5nQ29uZmlnSW1wbChATm9uTnVsbCAgU3RyaW5nIG5hbWUsCisgICAgQE5vbk51bGwKKyAgICBzdGF0aWMgU2lnbmluZ0NvbmZpZyBjcmVhdGVTaWduaW5nQ29uZmlnKEBOb25OdWxsIFNpZ25pbmdDb25maWcgc2lnbmluZ0NvbmZpZykgeworICAgICAgICByZXR1cm4gbmV3IFNpZ25pbmdDb25maWdJbXBsKAorICAgICAgICAgICAgICAgIHNpZ25pbmdDb25maWcuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIHNpZ25pbmdDb25maWcuZ2V0U3RvcmVGaWxlKCksCisgICAgICAgICAgICAgICAgc2lnbmluZ0NvbmZpZy5nZXRTdG9yZVBhc3N3b3JkKCksCisgICAgICAgICAgICAgICAgc2lnbmluZ0NvbmZpZy5nZXRLZXlBbGlhcygpLAorICAgICAgICAgICAgICAgIHNpZ25pbmdDb25maWcuZ2V0S2V5UGFzc3dvcmQoKSwKKyAgICAgICAgICAgICAgICBzaWduaW5nQ29uZmlnLmdldFN0b3JlVHlwZSgpLAorICAgICAgICAgICAgICAgIHNpZ25pbmdDb25maWcuaXNTaWduaW5nUmVhZHkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTaWduaW5nQ29uZmlnSW1wbChATm9uTnVsbCAgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIEZpbGUgc3RvcmVGaWxlLAogICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgc3RvcmVQYXNzd29yZCwKICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIGtleUFsaWFzLApkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvU291cmNlUHJvdmlkZXJDb250YWluZXJJbXBsLmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9Tb3VyY2VQcm92aWRlckNvbnRhaW5lckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTQxMTgwCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvU291cmNlUHJvdmlkZXJDb250YWluZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC5tb2RlbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Tb3VyY2VQcm92aWRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLlNvdXJjZVByb3ZpZGVyQ29udGFpbmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBTb3VyY2VQcm92aWRlckNvbnRhaW5lciB0aGF0IGlzIHNlcmlhbGl6YWJsZSBhbmQgaXMgbWVhbnQgdG8gYmUgdXNlZAorICogaW4gdGhlIG1vZGVsIHNlbnQgdG8gdGhlIHRvb2xpbmcgQVBJLgorICoKKyAqIEl0IGFsc28gcHJvdmlkZXMgY29udmVuaWVudCBtZXRob2RzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSwgY2xvbmluZyB0aGUgb3JpZ2luYWwKKyAqIFNvdXJjZVByb3ZpZGVyLgorICoKKyAqIFdoZW4gdGhlIHNvdXJjZSBQcm92aWRlciBpcyBjbG9uZWQsIGl0cyB2YWx1ZXMgYXJlIHF1ZXJpZWQgYW5kIHRoZW4gc3RhdGljYWxseSBzdG9yZWQuCisgKiBBbnkgZnVydGhlciBjaGFuZ2UgdGhyb3VnaCB0aGUgRFNMIHdpbGwgbm90IGJlIGltcGFjdC4gVGhlcmVmb3JlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzCisgKiBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gdGhlIG1vZGVsIGlzIGJ1aWx0LgorICoKKyAqIFRvIGNyZWF0ZSBtb3JlIGR5bmFtaWMgaXNudGFuY2VzIG9mIFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyLCB1c2UKKyAqIHtAbGluayBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwudmFyaWFudC5EZWZhdWx0U291cmNlUHJvdmlkZXJDb250YWluZXJ9CisgKi8KK2NsYXNzIFNvdXJjZVByb3ZpZGVyQ29udGFpbmVySW1wbCBpbXBsZW1lbnRzIFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyLCBTZXJpYWxpemFibGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBTb3VyY2VQcm92aWRlciBzb3VyY2VQcm92aWRlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBTb3VyY2VQcm92aWRlckNvbnRhaW5lcn0gdGhhdCBpcyBzZXJpYWxpemFibGUgdG8KKyAgICAgKiB1c2UgaW4gdGhlIG1vZGVsIHNlbnQgdGhyb3VnaCB0aGUgdG9vbGluZyBBUEkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlUHJvdmlkZXJDb250YWluZXIgdGhlIHNvdXJjZSBwcm92aWRlcgorICAgICAqCisgICAgICogQHJldHVybiBhIG5vbi1udWxsIFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBzdGF0aWMgU291cmNlUHJvdmlkZXJDb250YWluZXIgY2xvbmUoCisgICAgICAgICAgICBATm9uTnVsbCBTb3VyY2VQcm92aWRlckNvbnRhaW5lciBzb3VyY2VQcm92aWRlckNvbnRhaW5lcikgeworICAgICAgICByZXR1cm4gY3JlYXRlKAorICAgICAgICAgICAgICAgIHNvdXJjZVByb3ZpZGVyQ29udGFpbmVyLmdldEFydGlmYWN0TmFtZSgpLAorICAgICAgICAgICAgICAgIHNvdXJjZVByb3ZpZGVyQ29udGFpbmVyLmdldFNvdXJjZVByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgc3RhdGljIExpc3Q8U291cmNlUHJvdmlkZXJDb250YWluZXI+IGNsb25lQ29sbGVjdGlvbihATm9uTnVsbCBDb2xsZWN0aW9uPFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyPiBjb250YWluZXJzKSB7CisgICAgICAgIExpc3Q8U291cmNlUHJvdmlkZXJDb250YWluZXI+IGNsb25lcyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShjb250YWluZXJzLnNpemUoKSk7CisKKyAgICAgICAgZm9yIChTb3VyY2VQcm92aWRlckNvbnRhaW5lciBjb250YWluZXIgOiBjb250YWluZXJzKSB7CisgICAgICAgICAgICBjbG9uZXMuYWRkKGNsb25lKGNvbnRhaW5lcikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNsb25lczsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHN0YXRpYyBTb3VyY2VQcm92aWRlckNvbnRhaW5lciBjcmVhdGUoCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIEBOb25OdWxsIFNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyKSB7CisgICAgICAgIHJldHVybiBuZXcgU291cmNlUHJvdmlkZXJDb250YWluZXJJbXBsKG5hbWUsCisgICAgICAgICAgICAgICAgU291cmNlUHJvdmlkZXJJbXBsLmNsb25lUHJvdmlkZXIoc291cmNlUHJvdmlkZXIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNvdXJjZVByb3ZpZGVyQ29udGFpbmVySW1wbChATm9uTnVsbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBTb3VyY2VQcm92aWRlciBzb3VyY2VQcm92aWRlcikgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnNvdXJjZVByb3ZpZGVyID0gc291cmNlUHJvdmlkZXI7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU291cmNlUHJvdmlkZXIgZ2V0U291cmNlUHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiBzb3VyY2VQcm92aWRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9Tb3VyY2VQcm92aWRlckltcGwuamF2YSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL1NvdXJjZVByb3ZpZGVySW1wbC5qYXZhCmluZGV4IDdkMDI5M2IuLmRlMDI3MzcgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL1NvdXJjZVByb3ZpZGVySW1wbC5qYXZhCisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL1NvdXJjZVByb3ZpZGVySW1wbC5qYXZhCkBAIC0xOCwxMCArMTgsMTEgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Tb3VyY2VQcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgU291cmNlUHJvdmlkZXIgdGhhdCBpcyBzZXJpYWxpemFibGUuIE9iamVjdHMgdXNlZCBpbiB0aGUgRFNMIGNhbm5vdCBiZQpAQCAtMzEsMTMgKzMyLDEzIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKICAgICBwcml2YXRlIEZpbGUgbWFuaWZlc3RGaWxlOwotICAgIHByaXZhdGUgU2V0PEZpbGU+IGphdmFEaXJzOwotICAgIHByaXZhdGUgU2V0PEZpbGU+IHJlc291cmNlc0RpcnM7Ci0gICAgcHJpdmF0ZSBTZXQ8RmlsZT4gYWlkbERpcnM7Ci0gICAgcHJpdmF0ZSBTZXQ8RmlsZT4gcnNEaXJzOwotICAgIHByaXZhdGUgU2V0PEZpbGU+IGpuaURpcnM7Ci0gICAgcHJpdmF0ZSBTZXQ8RmlsZT4gcmVzRGlyczsKLSAgICBwcml2YXRlIFNldDxGaWxlPiBhc3NldHNEaXJzOworICAgIHByaXZhdGUgQ29sbGVjdGlvbjxGaWxlPiBqYXZhRGlyczsKKyAgICBwcml2YXRlIENvbGxlY3Rpb248RmlsZT4gcmVzb3VyY2VzRGlyczsKKyAgICBwcml2YXRlIENvbGxlY3Rpb248RmlsZT4gYWlkbERpcnM7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEZpbGU+IHJzRGlyczsKKyAgICBwcml2YXRlIENvbGxlY3Rpb248RmlsZT4gam5pRGlyczsKKyAgICBwcml2YXRlIENvbGxlY3Rpb248RmlsZT4gcmVzRGlyczsKKyAgICBwcml2YXRlIENvbGxlY3Rpb248RmlsZT4gYXNzZXRzRGlyczsKIAogICAgIEBOb25OdWxsCiAgICAgc3RhdGljIFNvdXJjZVByb3ZpZGVySW1wbCBjbG9uZVByb3ZpZGVyKFNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyKSB7CkBAIC01NSw2ICs1NiwxNyBAQAogICAgICAgICByZXR1cm4gc291cmNlUHJvdmlkZXJDbG9uZTsKICAgICB9CiAKKyAgICBATm9uTnVsbAorICAgIHN0YXRpYyBDb2xsZWN0aW9uPFNvdXJjZVByb3ZpZGVyPiBjbG9uZUNvbGxlY3Rpb24oCisgICAgICAgICAgICBATm9uTnVsbCBDb2xsZWN0aW9uPFNvdXJjZVByb3ZpZGVyPiBzb3VyY2VQcm92aWRlcnMpIHsKKyAgICAgICAgQ29sbGVjdGlvbjxTb3VyY2VQcm92aWRlcj4gcmVzdWx0cyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShzb3VyY2VQcm92aWRlcnMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChTb3VyY2VQcm92aWRlciBzb3VyY2VQcm92aWRlciA6IHNvdXJjZVByb3ZpZGVycykgeworICAgICAgICAgICAgcmVzdWx0cy5hZGQoU291cmNlUHJvdmlkZXJJbXBsLmNsb25lUHJvdmlkZXIoc291cmNlUHJvdmlkZXIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0KKwogICAgIHByaXZhdGUgU291cmNlUHJvdmlkZXJJbXBsKCkgewogICAgIH0KIApAQCAtNjYsNDMgKzc4LDQzIEBACiAKICAgICBATm9uTnVsbAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXQ8RmlsZT4gZ2V0SmF2YURpcmVjdG9yaWVzKCkgeworICAgIHB1YmxpYyBDb2xsZWN0aW9uPEZpbGU+IGdldEphdmFEaXJlY3RvcmllcygpIHsKICAgICAgICAgcmV0dXJuIGphdmFEaXJzOwogICAgIH0KIAogICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNldDxGaWxlPiBnZXRSZXNvdXJjZXNEaXJlY3RvcmllcygpIHsKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxGaWxlPiBnZXRSZXNvdXJjZXNEaXJlY3RvcmllcygpIHsKICAgICAgICAgcmV0dXJuIHJlc291cmNlc0RpcnM7CiAgICAgfQogCiAgICAgQE5vbk51bGwKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2V0PEZpbGU+IGdldEFpZGxEaXJlY3RvcmllcygpIHsKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxGaWxlPiBnZXRBaWRsRGlyZWN0b3JpZXMoKSB7CiAgICAgICAgIHJldHVybiBhaWRsRGlyczsKICAgICB9CiAKICAgICBATm9uTnVsbAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXQ8RmlsZT4gZ2V0UmVuZGVyc2NyaXB0RGlyZWN0b3JpZXMoKSB7CisgICAgcHVibGljIENvbGxlY3Rpb248RmlsZT4gZ2V0UmVuZGVyc2NyaXB0RGlyZWN0b3JpZXMoKSB7CiAgICAgICAgIHJldHVybiByc0RpcnM7CiAgICAgfQogCiAgICAgQE5vbk51bGwKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2V0PEZpbGU+IGdldEpuaURpcmVjdG9yaWVzKCkgeworICAgIHB1YmxpYyBDb2xsZWN0aW9uPEZpbGU+IGdldEpuaURpcmVjdG9yaWVzKCkgewogICAgICAgICByZXR1cm4gam5pRGlyczsKICAgICB9CiAKICAgICBATm9uTnVsbAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXQ8RmlsZT4gZ2V0UmVzRGlyZWN0b3JpZXMoKSB7CisgICAgcHVibGljIENvbGxlY3Rpb248RmlsZT4gZ2V0UmVzRGlyZWN0b3JpZXMoKSB7CiAgICAgICAgIHJldHVybiByZXNEaXJzOwogICAgIH0KIAogICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNldDxGaWxlPiBnZXRBc3NldHNEaXJlY3RvcmllcygpIHsKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxGaWxlPiBnZXRBc3NldHNEaXJlY3RvcmllcygpIHsKICAgICAgICAgcmV0dXJuIGFzc2V0c0RpcnM7CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9WYXJpYW50SW1wbC5qYXZhIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvbW9kZWwvVmFyaWFudEltcGwuamF2YQppbmRleCBmOWE1Yzg2Li5iOGEwNGU2IDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC9tb2RlbC9WYXJpYW50SW1wbC5qYXZhCisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL21vZGVsL1ZhcmlhbnRJbXBsLmphdmEKQEAgLTE3LDEyICsxNywxMyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwubW9kZWw7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQXJ0aWZhY3RJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuVmFyaWFudDsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkFuZHJvaWRBcnRpZmFjdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkphdmFBcnRpZmFjdDsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLlByb2R1Y3RGbGF2b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5WYXJpYW50OwogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCkBAIC00MywyNCArNDQsMjggQEAKICAgICBATm9uTnVsbAogICAgIHByaXZhdGUgZmluYWwgUHJvZHVjdEZsYXZvciBtZXJnZWRGbGF2b3I7CiAgICAgQE5vbk51bGwKLSAgICBwcml2YXRlIGZpbmFsIEFydGlmYWN0SW5mbyBtYWluQXJ0aWZhY3RJbmZvOwotICAgIEBOdWxsYWJsZQotICAgIHByaXZhdGUgZmluYWwgQXJ0aWZhY3RJbmZvIHRlc3RBcnRpZmFjdEluZm87CisgICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkQXJ0aWZhY3QgbWFpbkFydGlmYWN0SW5mbzsKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxBbmRyb2lkQXJ0aWZhY3Q+IGV4dHJhQW5kcm9pZEFydGlmYWN0czsKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxKYXZhQXJ0aWZhY3Q+IGV4dHJhSmF2YUFydGlmYWN0czsKIAotICAgIFZhcmlhbnRJbXBsKEBOb25OdWxsICBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICBATm9uTnVsbCAgU3RyaW5nIGRpc3BsYXlOYW1lLAotICAgICAgICAgICAgICAgIEBOb25OdWxsICBTdHJpbmcgYnVpbGRUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICBATm9uTnVsbCAgTGlzdDxTdHJpbmc+IHByb2R1Y3RGbGF2b3JOYW1lcywKLSAgICAgICAgICAgICAgICBATm9uTnVsbCAgUHJvZHVjdEZsYXZvckltcGwgbWVyZ2VkRmxhdm9yLAotICAgICAgICAgICAgICAgIEBOb25OdWxsICBBcnRpZmFjdEluZm8gbWFpbkFydGlmYWN0SW5mbywKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgQXJ0aWZhY3RJbmZvIHRlc3RBcnRpZmFjdEluZm8pIHsKKyAgICBWYXJpYW50SW1wbChATm9uTnVsbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgZGlzcGxheU5hbWUsCisgICAgICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIGJ1aWxkVHlwZU5hbWUsCisgICAgICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxTdHJpbmc+IHByb2R1Y3RGbGF2b3JOYW1lcywKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBQcm9kdWN0Rmxhdm9ySW1wbCBtZXJnZWRGbGF2b3IsCisgICAgICAgICAgICAgICAgQE5vbk51bGwgQW5kcm9pZEFydGlmYWN0IG1haW5BcnRpZmFjdEluZm8sCisgICAgICAgICAgICAgICAgQE5vbk51bGwgQ29sbGVjdGlvbjxBbmRyb2lkQXJ0aWZhY3Q+IGV4dHJhQW5kcm9pZEFydGlmYWN0cywKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBDb2xsZWN0aW9uPEphdmFBcnRpZmFjdD4gZXh0cmFKYXZhQXJ0aWZhY3RzKSB7CiAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKICAgICAgICAgdGhpcy5idWlsZFR5cGVOYW1lID0gYnVpbGRUeXBlTmFtZTsKICAgICAgICAgdGhpcy5wcm9kdWN0Rmxhdm9yTmFtZXMgPSBwcm9kdWN0Rmxhdm9yTmFtZXM7CiAgICAgICAgIHRoaXMubWVyZ2VkRmxhdm9yID0gbWVyZ2VkRmxhdm9yOwogICAgICAgICB0aGlzLm1haW5BcnRpZmFjdEluZm8gPSBtYWluQXJ0aWZhY3RJbmZvOwotICAgICAgICB0aGlzLnRlc3RBcnRpZmFjdEluZm8gPSB0ZXN0QXJ0aWZhY3RJbmZvOworICAgICAgICB0aGlzLmV4dHJhQW5kcm9pZEFydGlmYWN0cyA9IGV4dHJhQW5kcm9pZEFydGlmYWN0czsKKyAgICAgICAgdGhpcy5leHRyYUphdmFBcnRpZmFjdHMgPSBleHRyYUphdmFBcnRpZmFjdHM7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC05NSwxOSArMTAwLDE5IEBACiAKICAgICBATm9uTnVsbAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBcnRpZmFjdEluZm8gZ2V0TWFpbkFydGlmYWN0SW5mbygpIHsKKyAgICBwdWJsaWMgQW5kcm9pZEFydGlmYWN0IGdldE1haW5BcnRpZmFjdCgpIHsKICAgICAgICAgcmV0dXJuIG1haW5BcnRpZmFjdEluZm87CiAgICAgfQogCi0gICAgQE51bGxhYmxlCisgICAgQE5vbk51bGwKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXJ0aWZhY3RJbmZvIGdldFRlc3RBcnRpZmFjdEluZm8oKSB7Ci0gICAgICAgIHJldHVybiB0ZXN0QXJ0aWZhY3RJbmZvOworICAgIHB1YmxpYyBDb2xsZWN0aW9uPEFuZHJvaWRBcnRpZmFjdD4gZ2V0RXh0cmFBbmRyb2lkQXJ0aWZhY3RzKCkgeworICAgICAgICByZXR1cm4gZXh0cmFBbmRyb2lkQXJ0aWZhY3RzOwogICAgIH0KIAotICAgIEBPdmVycmlkZQogICAgIEBOb25OdWxsCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZXNvdXJjZUNvbmZpZ3VyYXRpb25zKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248SmF2YUFydGlmYWN0PiBnZXRFeHRyYUphdmFBcnRpZmFjdHMoKSB7CisgICAgICAgIHJldHVybiBleHRyYUphdmFBcnRpZmFjdHM7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdGFza3MvRGVwZW5kZW5jeUJhc2VkQ29tcGlsZVRhc2suZ3Jvb3Z5IGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdGFza3MvRGVwZW5kZW5jeUJhc2VkQ29tcGlsZVRhc2suZ3Jvb3Z5CmluZGV4IDRlMTBhYTguLmYyNjRiYzkgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL3Rhc2tzL0RlcGVuZGVuY3lCYXNlZENvbXBpbGVUYXNrLmdyb292eQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC90YXNrcy9EZXBlbmRlbmN5QmFzZWRDb21waWxlVGFzay5ncm9vdnkKQEAgLTE1LDcgKzE1LDYgQEAKICAqLwogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC50YXNrcwotCiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbAogaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5jb21waWxpbmcuRGVwZW5kZW5jeUZpbGVQcm9jZXNzb3IKQEAgLTI4LDcgKzI3LDYgQEAKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5PdXRwdXREaXJlY3RvcnkKIAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlCi0KIC8qKgogICogQmFzZSB0YXNrIGZvciBzb3VyY2UgZ2VuZXJhdG9ycyB0aGF0IGdlbmVyYXRlIGFuZCB1c2UgZGVwZW5kZW5jeSBmaWxlcy4KICAqLwpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdGFza3MvSW5jcmVtZW50YWxUYXNrLmdyb292eSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL3Rhc2tzL0luY3JlbWVudGFsVGFzay5ncm9vdnkKaW5kZXggYWVmNDMxOS4uMmE4NjExNCAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdGFza3MvSW5jcmVtZW50YWxUYXNrLmdyb292eQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC90YXNrcy9JbmNyZW1lbnRhbFRhc2suZ3Jvb3Z5CkBAIC0xNCwxNiArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC50YXNrcwotCi1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5pbnRlcm5hbC5pbmNyZW1lbnRhbC5DaGFuZ2VNYW5hZ2VyCiBpbXBvcnQgY29tLmFuZHJvaWQuaWRlLmNvbW1vbi5yZXMyLkZpbGVTdGF0dXMKIGltcG9ydCBjb20uYW5kcm9pZC5pZGUuY29tbW9uLnJlczIuU291cmNlU2V0CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0cwotaW1wb3J0IG9yZy5ncmFkbGUuYXBpLmZpbGUuRmlsZUNvbGxlY3Rpb24KK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHMKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5PcHRpb25hbAogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLk91dHB1dERpcmVjdG9yeQogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLlRhc2tBY3Rpb24KLWltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5UYXNrSW5wdXRzCitpbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuaW5jcmVtZW50YWwuSW5jcmVtZW50YWxUYXNrSW5wdXRzCiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbmNyZW1lbnRhbFRhc2sgZXh0ZW5kcyBCYXNlVGFzayB7CiAKQEAgLTMxLDcgKzI5LDcgQEAKICAgICBGaWxlIGluY3JlbWVudGFsRm9sZGVyCiAKICAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoaXMgdGFzayBjYW4gc3VwcG9ydCBpbmNyZW1lbnRhbCB1cGRhdGUgdXNpbmcgdGhlIHtAbGluayBDaGFuZ2VNYW5hZ2VyfQorICAgICAqIFdoZXRoZXIgdGhpcyB0YXNrIGNhbiBzdXBwb3J0IGluY3JlbWVudGFsIHVwZGF0ZS4KICAgICAgKgogICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIHRhc2sgY2FuIHN1cHBvcnQgaW5jcmVtZW50YWwgdXBkYXRlLgogICAgICAqLwpAQCAtNDQsNyArNDIsNyBAQAogICAgICAqIHtAbGluayAjaXNJbmNyZW1lbnRhbCgpfSByZXR1cm5zIGZhbHNlLgogICAgICAqCiAgICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9GdWxsVGFza0FjdGlvbigpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvRnVsbFRhc2tBY3Rpb24oKQogCiAgICAgLyoqCiAgICAgICogT3B0aW9uYWwgaW5jcmVtZW50YWwgdGFzayBhY3Rpb24uCkBAIC01Niw3OSArNTQsNDQgQEAKICAgICAgICAgLy8gZG8gbm90aGluZy4KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbjxGaWxlPiBnZXRPdXRwdXRGb3JJbmNyZW1lbnRhbEJ1aWxkKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQWN0dWFsIGVudHJ5IHBvaW50IGZvciB0aGUgYWN0aW9uLgogICAgICAqIENhbGxzIG91dCB0byB0aGUgZG9UYXNrQWN0aW9uIGFzIG5lZWRlZC4KICAgICAgKi8KICAgICBAVGFza0FjdGlvbgotICAgIHZvaWQgdGFza0FjdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghaXNJbmNyZW1lbnRhbCgpIHx8IGluY3JlbWVudGFsRm9sZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkb0Z1bGxUYXNrQWN0aW9uKCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxvYWQga25vd24gc3RhdGUuCi0gICAgICAgICAgICBDaGFuZ2VNYW5hZ2VyIGNoYW5nZU1hbmFnZXIgPSBuZXcgQ2hhbmdlTWFuYWdlcigpCi0gICAgICAgICAgICBib29sZWFuIGZ1bGxCdWlsZCA9ICFjaGFuZ2VNYW5hZ2VyLmxvYWQoaW5jcmVtZW50YWxGb2xkZXIpCi0KLSAgICAgICAgICAgIC8vIHVwZGF0ZSB3aXRoIGN1cnJlbnQgZmlsZXMuCi0gICAgICAgICAgICBUYXNrSW5wdXRzIGlucHV0cyA9IGdldElucHV0cygpCi0gICAgICAgICAgICBGaWxlQ29sbGVjdGlvbiBpbnB1dENvbGxlY3Rpb24gPSBpbnB1dHMuZ2V0RmlsZXMoKQotCi0gICAgICAgICAgICBmb3IgKEZpbGUgZiA6IGlucHV0Q29sbGVjdGlvbi5maWxlcykgewotICAgICAgICAgICAgICAgIGNoYW5nZU1hbmFnZXIuYWRkSW5wdXQoZikKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChGaWxlIGYgOiBnZXRPdXRwdXRGb3JJbmNyZW1lbnRhbEJ1aWxkKCkpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VNYW5hZ2VyLmFkZE91dHB1dChmKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZm9yY2UgZnVsbCBidWlsZCBpZiBvdXRwdXQgY2hhbmdlZCBzb21laG93LgotICAgICAgICAgICAgTWFwPEZpbGUsIEZpbGVTdGF0dXM+IGNoYW5nZWRPdXRwdXRzID0gY2hhbmdlTWFuYWdlci5nZXRDaGFuZ2VkT3V0cHV0cygpCi0gICAgICAgICAgICBNYXA8RmlsZSwgRmlsZVN0YXR1cz4gY2hhbmdlZElucHV0cyA9IGNoYW5nZU1hbmFnZXIuZ2V0Q2hhbmdlZElucHV0cygpCi0gICAgICAgICAgICBpZiAoZnVsbEJ1aWxkKSB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5sb2dnZXIuaW5mbygiTm8gaW5jcmVtZW50YWwgZGF0YTogZnVsbCB0YXNrIHJ1biIpCi0gICAgICAgICAgICAgICAgZG9GdWxsVGFza0FjdGlvbigpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghY2hhbmdlZE91dHB1dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5sb2dnZXIuaW5mbygiQ2hhbmdlZCBvdXRwdXQ6IGZ1bGwgdGFzayBydW4iKQotCi0gICAgICAgICAgICAgICAgZG9GdWxsVGFza0FjdGlvbigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VkSW5wdXRzLmlzRW1wdHkoKSAmJiBjaGFuZ2VkT3V0cHV0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBib3RoIGlucHV0IGFuZCBvdXRwdXQgYXJlIGVtcHR5LCB0aGlzIGlzIHNvbWV0aGluZyB3ZSBkb24ndCBjb250cm9sCi0gICAgICAgICAgICAgICAgLy8gdGhyb3VnaCBmaWxlcywganVzdCBkbyBhIGZ1bGwgcnVuCi0gICAgICAgICAgICAgICAgcHJvamVjdC5sb2dnZXIuaW5mbygiQ2hhbmdlZCBub24gZmlsZSBpbnB1dC9vdXRwdXQ6IGZ1bGwgdGFzayBydW4iKQotICAgICAgICAgICAgICAgIGRvRnVsbFRhc2tBY3Rpb24oKQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkb0luY3JlbWVudGFsVGFza0FjdGlvbihjaGFuZ2VNYW5hZ2VyLmdldENoYW5nZWRJbnB1dHMoKSkKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRwdXRzIHBvc3QgdGFzay1hY3Rpb24sIHRvIHJlY29yZCB0aGVpciBzdGF0ZQotICAgICAgICAgICAgLy8gZm9yIHRoZSBuZXh0IHJ1bgotICAgICAgICAgICAgY2hhbmdlTWFuYWdlci51cGRhdGVPdXRwdXRzKGdldE91dHB1dEZvckluY3JlbWVudGFsQnVpbGQoKSkKLQotICAgICAgICAgICAgLy8gd3JpdGUgdGhlIHJlc3VsdCBkb3duIHRvIGJlIHVzZWQgbmV4dCB0aW1lIHRoZSB0YXNrIGlzIHJ1bi4KLSAgICAgICAgICAgIGNoYW5nZU1hbmFnZXIud3JpdGUoaW5jcmVtZW50YWxGb2xkZXIpCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFYXNpZXN0IHRvIGRvIGhlcmUsIGlzIHRvIGRlbGV0ZSB0aGUgaW5jcmVtZW50YWwgRGF0YSBzbyB0aGF0Ci0gICAgICAgICAgICAvLyBuZXh0IHJ1biBpcyBmdWxsLgotICAgICAgICAgICAgQ2hhbmdlTWFuYWdlci5kZWxldGUoaW5jcmVtZW50YWxGb2xkZXIpCi0KLSAgICAgICAgICAgIHRocm93IGUKKyAgICB2b2lkIHRhc2tBY3Rpb24oSW5jcmVtZW50YWxUYXNrSW5wdXRzIGlucHV0cykgeworICAgICAgICBpZiAoIWlzSW5jcmVtZW50YWwoKSkgeworICAgICAgICAgICAgZG9GdWxsVGFza0FjdGlvbigpCisgICAgICAgICAgICByZXR1cm4KICAgICAgICAgfQorCisgICAgICAgIGlmICghaW5wdXRzLmlzSW5jcmVtZW50YWwoKSkgeworICAgICAgICAgICAgcHJvamVjdC5sb2dnZXIuaW5mbygiVW5hYmxlIGRvIGluY3JlbWVudGFsIGV4ZWN1dGlvbjogZnVsbCB0YXNrIHJ1biIpCisgICAgICAgICAgICBkb0Z1bGxUYXNrQWN0aW9uKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB9CisKKyAgICAgICAgTWFwPEZpbGUsIEZpbGVTdGF0dXM+IGNoYW5nZWRJbnB1dHMgPSBNYXBzLm5ld0hhc2hNYXAoKQorICAgICAgICBpbnB1dHMub3V0T2ZEYXRlIHsgY2hhbmdlIC0+CisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBHcm9vdnlBc3NpZ25hYmlsaXR5Q2hlY2sKKyAgICAgICAgICAgIGNoYW5nZWRJbnB1dHMucHV0KGNoYW5nZS5maWxlLCBjaGFuZ2UuaXNBZGRlZCgpID8gRmlsZVN0YXR1cy5ORVcgOiBGaWxlU3RhdHVzLkNIQU5HRUQpCisgICAgICAgIH0KKworICAgICAgICBpbnB1dHMucmVtb3ZlZCB7IGNoYW5nZSAtPgorICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gR3Jvb3Z5QXNzaWduYWJpbGl0eUNoZWNrCisgICAgICAgICAgICBjaGFuZ2VkSW5wdXRzLnB1dChjaGFuZ2UuZmlsZSwgRmlsZVN0YXR1cy5SRU1PVkVEKQorICAgICAgICB9CisKKyAgICAgICAgZG9JbmNyZW1lbnRhbFRhc2tBY3Rpb24oY2hhbmdlZElucHV0cykKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIExpc3Q8RmlsZT4gZmxhdHRlblNvdXJjZVNldHMoTGlzdDw/IGV4dGVuZHMgU291cmNlU2V0PiByZXNvdXJjZVNldHMpIHsKLSAgICAgICAgTGlzdDxGaWxlPiBsaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIExpc3Q8RmlsZT4gbGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpCiAKICAgICAgICAgZm9yIChTb3VyY2VTZXQgc291cmNlU2V0IDogcmVzb3VyY2VTZXRzKSB7CiAgICAgICAgICAgICBsaXN0LmFkZEFsbChzb3VyY2VTZXQuc291cmNlRmlsZXMpCiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgcmV0dXJuIGxpc3QKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC90YXNrcy9OZGtUYXNrLmdyb292eSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL3Rhc2tzL05ka1Rhc2suZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNDg1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC90YXNrcy9OZGtUYXNrLmdyb292eQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwudGFza3MKKworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuTmRrQ29uZmlnCitpbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuSW5wdXQKK2ltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5PcHRpb25hbAorCisvKioKKyAqIEJhc2UgdGFzayBmb3IgdGFza3MgdGhhdCByZXF1aXJlIGFuIE5ka0NvbmZpZworICovCitjbGFzcyBOZGtUYXNrIGV4dGVuZHMgQmFzZVRhc2sgeworCisgICAgTmRrQ29uZmlnIG5ka0NvbmZpZworCisgICAgQElucHV0IEBPcHRpb25hbAorICAgIFN0cmluZyBnZXRNb2R1bGVOYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0TmRrQ29uZmlnKCk/Lm1vZHVsZU5hbWUKKyAgICB9CisKKyAgICBASW5wdXQgQE9wdGlvbmFsCisgICAgU3RyaW5nIGdldGNGbGFncygpIHsKKyAgICAgICAgcmV0dXJuIGdldE5ka0NvbmZpZygpPy5jRmxhZ3MKKyAgICB9CisKKyAgICBASW5wdXQgQE9wdGlvbmFsCisgICAgU2V0PFN0cmluZz4gZ2V0TGRMaWJzKCkgeworICAgICAgICByZXR1cm4gZ2V0TmRrQ29uZmlnKCk/LmxkTGlicworICAgIH0KKworICAgIEBJbnB1dCBAT3B0aW9uYWwKKyAgICBTZXQ8U3RyaW5nPiBnZXRBYmlGaWx0ZXJzKCkgeworICAgICAgICByZXR1cm4gZ2V0TmRrQ29uZmlnKCk/LmFiaUZpbHRlcnMKKyAgICB9CisKKyAgICBASW5wdXQgQE9wdGlvbmFsCisgICAgU3RyaW5nIGdldFN0bCgpIHsKKyAgICAgICAgcmV0dXJuIGdldE5ka0NvbmZpZygpLnN0bAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL3ZhcmlhbnQvQXBrVmFyaWFudERhdGEuamF2YSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL3ZhcmlhbnQvQXBrVmFyaWFudERhdGEuamF2YQppbmRleCA4MjJjZGZlLi45YzFmNTgwIDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC92YXJpYW50L0Fwa1ZhcmlhbnREYXRhLmphdmEKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdmFyaWFudC9BcGtWYXJpYW50RGF0YS5qYXZhCkBAIC0yMSwxNCArMjEsMTIgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuWmlwQWxpZ247CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5WYXJpYW50Q29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS5EZWZhdWx0VGFzazsKLWltcG9ydCBwcm9ndWFyZC5ncmFkbGUuUHJvR3VhcmRUYXNrOwogCiAvKioKICAqIEJhc2UgZGF0YSBhYm91dCBhIHZhcmlhbnQgdGhhdCBnZW5lcmF0ZXMgYW4gQVBLIGZpbGUuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBcGtWYXJpYW50RGF0YSBleHRlbmRzIEJhc2VWYXJpYW50RGF0YSB7CiAKLSAgICBwdWJsaWMgUHJvR3VhcmRUYXNrIHByb2d1YXJkVGFzazsKICAgICBwdWJsaWMgRGV4IGRleFRhc2s7CiAgICAgcHVibGljIFBhY2thZ2VBcHBsaWNhdGlvbiBwYWNrYWdlQXBwbGljYXRpb25UYXNrOwogICAgIHB1YmxpYyBaaXBBbGlnbiB6aXBBbGlnblRhc2s7CkBAIC00NiwzNCArNDQsMTIgQEAKICAgICAgICAgaWYgKGdldFZhcmlhbnRDb25maWd1cmF0aW9uKCkuaGFzRmxhdm9ycygpKSB7CiAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMgYnVpbGQgZm9yIGZsYXZvciAlcyIsCiAgICAgICAgICAgICAgICAgICAgIGdldENhcGl0YWxpemVkQnVpbGRUeXBlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBnZXRGbGF2b3JlZE5hbWUodHJ1ZSkpOworICAgICAgICAgICAgICAgICAgICBnZXRDYXBpdGFsaXplZEZsYXZvck5hbWUoKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMgYnVpbGQiLCBnZXRDYXBpdGFsaXplZEJ1aWxkVHlwZU5hbWUoKSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlyTmFtZSgpIHsKLSAgICAgICAgaWYgKGdldFZhcmlhbnRDb25maWd1cmF0aW9uKCkuaGFzRmxhdm9ycygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMvJXMiLAotICAgICAgICAgICAgICAgICAgICBnZXRGbGF2b3JlZE5hbWUoZmFsc2UpLCBnZXRWYXJpYW50Q29uZmlndXJhdGlvbigpLmdldEJ1aWxkVHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmFyaWFudENvbmZpZ3VyYXRpb24oKS5nZXRCdWlsZFR5cGUoKS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7Ci0gICAgICAgIGlmIChnZXRWYXJpYW50Q29uZmlndXJhdGlvbigpLmhhc0ZsYXZvcnMoKSkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzLSVzIiwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Rmxhdm9yZWROYW1lKGZhbHNlKSwgZ2V0VmFyaWFudENvbmZpZ3VyYXRpb24oKS5nZXRCdWlsZFR5cGUoKS5nZXROYW1lKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGdldFZhcmlhbnRDb25maWd1cmF0aW9uKCkuZ2V0QnVpbGRUeXBlKCkuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gaXNTaWduZWQoKSB7CiAgICAgICAgIHJldHVybiBnZXRWYXJpYW50Q29uZmlndXJhdGlvbigpLmlzU2lnbmluZ1JlYWR5KCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdmFyaWFudC9BcHBsaWNhdGlvblZhcmlhbnREYXRhLmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC92YXJpYW50L0FwcGxpY2F0aW9uVmFyaWFudERhdGEuamF2YQppbmRleCAwZjhkNGVkLi45MWM0ZDA4IDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC92YXJpYW50L0FwcGxpY2F0aW9uVmFyaWFudERhdGEuamF2YQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC92YXJpYW50L0FwcGxpY2F0aW9uVmFyaWFudERhdGEuamF2YQpAQCAtMzEsMjAgKzMxLDYgQEAKICAgICAgICAgc3VwZXIoY29uZmlnKTsKICAgICB9CiAKLSAgICBATm9uTnVsbAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYXJpYW50Q29uZmlndXJhdGlvbigpLmhhc0ZsYXZvcnMoKSA/Ci0gICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJXMlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRGbGF2b3JlZE5hbWUodHJ1ZSksIGdldENhcGl0YWxpemVkQnVpbGRUeXBlTmFtZSgpKSA6Ci0gICAgICAgICAgICAgICAgZ2V0Q2FwaXRhbGl6ZWRCdWlsZFR5cGVOYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UnVuUHJvZ3VhcmQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYXJpYW50Q29uZmlndXJhdGlvbigpLmdldEJ1aWxkVHlwZSgpLmlzUnVuUHJvZ3VhcmQoKTsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRUZXN0VmFyaWFudERhdGEoQE51bGxhYmxlIFRlc3RWYXJpYW50RGF0YSB0ZXN0VmFyaWFudERhdGEpIHsKICAgICAgICAgdGhpcy50ZXN0VmFyaWFudERhdGEgPSB0ZXN0VmFyaWFudERhdGE7CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC92YXJpYW50L0Jhc2VWYXJpYW50RGF0YS5qYXZhIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdmFyaWFudC9CYXNlVmFyaWFudERhdGEuamF2YQppbmRleCAxMzVlZWFmLi44Mzc5NGU4IDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC92YXJpYW50L0Jhc2VWYXJpYW50RGF0YS5qYXZhCisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL3ZhcmlhbnQvQmFzZVZhcmlhbnREYXRhLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CitpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLlN0cmluZ0hlbHBlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwuZGVwZW5kZW5jeS5WYXJpYW50RGVwZW5kZW5jaWVzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC50YXNrcy5QcmVwYXJlRGVwZW5kZW5jaWVzVGFzazsKQEAgLTI0LDI5ICsyNSwzNCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5HZW5lcmF0ZUJ1aWxkQ29uZmlnOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5NZXJnZUFzc2V0czsKIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MuTWVyZ2VSZXNvdXJjZXM7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLk5ka0NvbXBpbGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLlByb2Nlc3NBbmRyb2lkUmVzb3VyY2VzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcy5Qcm9jZXNzTWFuaWZlc3Q7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzLlJlbmRlcnNjcmlwdENvbXBpbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5CdWlsZGVyQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuRGVmYXVsdFByb2R1Y3RGbGF2b3I7CiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5WYXJpYW50Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwogaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkuVGFzazsKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5Db3B5OwogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLmNvbXBpbGUuSmF2YUNvbXBpbGU7CitpbXBvcnQgcHJvZ3VhcmQuZ3JhZGxlLlByb0d1YXJkVGFzazsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgogICogQmFzZSBkYXRhIGFib3V0IGEgdmFyaWFudC4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VWYXJpYW50RGF0YSB7CiAKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwogICAgIHByaXZhdGUgZmluYWwgVmFyaWFudENvbmZpZ3VyYXRpb24gdmFyaWFudENvbmZpZ3VyYXRpb247CiAgICAgcHJpdmF0ZSBWYXJpYW50RGVwZW5kZW5jaWVzIHZhcmlhbnREZXBlbmRlbmN5OwogCisgICAgcHVibGljIFRhc2sgcHJlQnVpbGRUYXNrOwogICAgIHB1YmxpYyBQcmVwYXJlRGVwZW5kZW5jaWVzVGFzayBwcmVwYXJlRGVwZW5kZW5jaWVzVGFzazsKKyAgICBwdWJsaWMgVGFzayBzb3VyY2VHZW5UYXNrOwogCiAgICAgcHVibGljIFByb2Nlc3NNYW5pZmVzdCBwcm9jZXNzTWFuaWZlc3RUYXNrOwogICAgIHB1YmxpYyBSZW5kZXJzY3JpcHRDb21waWxlIHJlbmRlcnNjcmlwdENvbXBpbGVUYXNrOwpAQCAtNTcsMjEgKzYzLDIxIEBACiAgICAgcHVibGljIEdlbmVyYXRlQnVpbGRDb25maWcgZ2VuZXJhdGVCdWlsZENvbmZpZ1Rhc2s7CiAKICAgICBwdWJsaWMgSmF2YUNvbXBpbGUgamF2YUNvbXBpbGVUYXNrOwotICAgIHB1YmxpYyBDb3B5IHByb2Nlc3NKYXZhUmVzb3VyY2VzOworICAgIHB1YmxpYyBQcm9HdWFyZFRhc2sgcHJvZ3VhcmRUYXNrOworICAgIHB1YmxpYyBDb3B5IHByb2Nlc3NKYXZhUmVzb3VyY2VzVGFzazsKKyAgICBwdWJsaWMgTmRrQ29tcGlsZSBuZGtDb21waWxlVGFzazsKIAogICAgIHByaXZhdGUgT2JqZWN0IG91dHB1dEZpbGU7CiAKICAgICBwdWJsaWMgVGFzayBhc3NlbWJsZVRhc2s7CiAKKyAgICBwcml2YXRlIExpc3Q8RmlsZT4gZXh0cmFHZW5lcmF0ZWRTb3VyY2VGb2xkZXJzOworCiAgICAgcHVibGljIEJhc2VWYXJpYW50RGF0YShATm9uTnVsbCBWYXJpYW50Q29uZmlndXJhdGlvbiB2YXJpYW50Q29uZmlndXJhdGlvbikgewogICAgICAgICB0aGlzLnZhcmlhbnRDb25maWd1cmF0aW9uID0gdmFyaWFudENvbmZpZ3VyYXRpb247Ci0gICAgICAgIHRoaXMubmFtZSA9IGNvbXB1dGVOYW1lKCk7CiAgICAgfQogCiAgICAgQE5vbk51bGwKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGNvbXB1dGVOYW1lKCk7Ci0KLSAgICBATm9uTnVsbAogICAgIHB1YmxpYyBWYXJpYW50Q29uZmlndXJhdGlvbiBnZXRWYXJpYW50Q29uZmlndXJhdGlvbigpIHsKICAgICAgICAgcmV0dXJuIHZhcmlhbnRDb25maWd1cmF0aW9uOwogICAgIH0KQEAgLTg2LDYwICs5MiwyMSBAQAogICAgIH0KIAogICAgIEBOb25OdWxsCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBATm9uTnVsbAogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKIAotICAgIEBOb25OdWxsCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREaXJOYW1lKCk7Ci0KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmxhdm9yRGlyTmFtZSgpIHsKLSAgICAgICAgaWYgKHZhcmlhbnRDb25maWd1cmF0aW9uLmhhc0ZsYXZvcnMoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldEZsYXZvcmVkTmFtZShmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmxhdm9yTmFtZSgpIHsKLSAgICAgICAgaWYgKHZhcmlhbnRDb25maWd1cmF0aW9uLmhhc0ZsYXZvcnMoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldEZsYXZvcmVkTmFtZSh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmdIZWxwZXIuY2FwaXRhbGl6ZShCdWlsZGVyQ29uc3RhbnRzLk1BSU4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEJhc2VOYW1lKCk7Ci0KICAgICBATnVsbGFibGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewogICAgICAgICByZXR1cm4gdmFyaWFudENvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKTsKICAgICB9CiAKICAgICBATm9uTnVsbAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Rmxhdm9yZWROYW1lKGJvb2xlYW4gY2FwaXRhbGl6ZWQpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChEZWZhdWx0UHJvZHVjdEZsYXZvciBmbGF2b3IgOiB2YXJpYW50Q29uZmlndXJhdGlvbi5nZXRGbGF2b3JDb25maWdzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZmxhdm9yLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNhcGl0YWxpemVkID8gU3RyaW5nSGVscGVyLmNhcGl0YWxpemUobmFtZSkgOiBuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE5vbk51bGwKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENhcGl0YWxpemVkQnVpbGRUeXBlTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIFN0cmluZ0hlbHBlci5jYXBpdGFsaXplKHZhcmlhbnRDb25maWd1cmF0aW9uLmdldEJ1aWxkVHlwZSgpLmdldE5hbWUoKSk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UnVuUHJvZ3VhcmQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBATm9uTnVsbAorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2FwaXRhbGl6ZWRGbGF2b3JOYW1lKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nSGVscGVyLmNhcGl0YWxpemUodmFyaWFudENvbmZpZ3VyYXRpb24uZ2V0Rmxhdm9yTmFtZSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWxlKE9iamVjdCBmaWxlKSB7CkBAIC0xNTcsNCArMTI0LDUxIEBACiAgICAgICAgIGFzc2VydCBmYWxzZTsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgQE5vbk51bGwKKyAgICBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhcmlhbnRDb25maWd1cmF0aW9uLmdldEZ1bGxOYW1lKCk7CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIExpc3Q8RmlsZT4gZ2V0RXh0cmFHZW5lcmF0ZWRTb3VyY2VGb2xkZXJzKCkgeworICAgICAgICByZXR1cm4gZXh0cmFHZW5lcmF0ZWRTb3VyY2VGb2xkZXJzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEphdmFTb3VyY2VGb2xkZXJzVG9Nb2RlbChATm9uTnVsbCBGaWxlLi4uIGdlbmVyYXRlZFNvdXJjZUZvbGRlcnMpIHsKKyAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKGV4dHJhR2VuZXJhdGVkU291cmNlRm9sZGVycywgZ2VuZXJhdGVkU291cmNlRm9sZGVycyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSmF2YVNvdXJjZUZvbGRlcnNUb01vZGVsKEBOb25OdWxsIENvbGxlY3Rpb248RmlsZT4gZ2VuZXJhdGVkU291cmNlRm9sZGVycykgeworICAgICAgICBleHRyYUdlbmVyYXRlZFNvdXJjZUZvbGRlcnMuYWRkQWxsKGdlbmVyYXRlZFNvdXJjZUZvbGRlcnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVySmF2YUdlbmVyYXRpbmdUYXNrKEBOb25OdWxsIFRhc2sgdGFzaywgQE5vbk51bGwgRmlsZS4uLiBnZW5lcmF0ZWRTb3VyY2VGb2xkZXJzKSB7CisgICAgICAgIGlmIChleHRyYUdlbmVyYXRlZFNvdXJjZUZvbGRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgZXh0cmFHZW5lcmF0ZWRTb3VyY2VGb2xkZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICBqYXZhQ29tcGlsZVRhc2suZGVwZW5kc09uKHRhc2spOworCisgICAgICAgIGZvciAoRmlsZSBmIDogZ2VuZXJhdGVkU291cmNlRm9sZGVycykgeworICAgICAgICAgICAgamF2YUNvbXBpbGVUYXNrLnNvdXJjZShmKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkZEphdmFTb3VyY2VGb2xkZXJzVG9Nb2RlbChnZW5lcmF0ZWRTb3VyY2VGb2xkZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckphdmFHZW5lcmF0aW5nVGFzayhATm9uTnVsbCBUYXNrIHRhc2ssIEBOb25OdWxsIENvbGxlY3Rpb248RmlsZT4gZ2VuZXJhdGVkU291cmNlRm9sZGVycykgeworICAgICAgICBpZiAoZXh0cmFHZW5lcmF0ZWRTb3VyY2VGb2xkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIGV4dHJhR2VuZXJhdGVkU291cmNlRm9sZGVycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICB9CisKKyAgICAgICAgamF2YUNvbXBpbGVUYXNrLmRlcGVuZHNPbih0YXNrKTsKKworICAgICAgICBmb3IgKEZpbGUgZiA6IGdlbmVyYXRlZFNvdXJjZUZvbGRlcnMpIHsKKyAgICAgICAgICAgIGphdmFDb21waWxlVGFzay5zb3VyY2UoZik7CisgICAgICAgIH0KKworICAgICAgICBhZGRKYXZhU291cmNlRm9sZGVyc1RvTW9kZWwoZ2VuZXJhdGVkU291cmNlRm9sZGVycyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdmFyaWFudC9EZWZhdWx0U291cmNlUHJvdmlkZXJDb250YWluZXIuamF2YSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL3ZhcmlhbnQvRGVmYXVsdFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmMmU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL3ZhcmlhbnQvRGVmYXVsdFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLnZhcmlhbnQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsOworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuU291cmNlUHJvdmlkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5Tb3VyY2VQcm92aWRlckNvbnRhaW5lcjsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGEgU291cmNlUHJvdmlkZXJDb250YWluZXIgdGhhdCB3cmFwcyBhbiBleGlzdGluZyBpbnN0YW5jZSBvZiBhCisgKiBTb3VyY2VQcm92aWRlci4KKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRTb3VyY2VQcm92aWRlckNvbnRhaW5lciBpbXBsZW1lbnRzIFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyIHsKKworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgU291cmNlUHJvdmlkZXIgc291cmNlUHJvdmlkZXI7CisKKyAgICBwdWJsaWMgRGVmYXVsdFNvdXJjZVByb3ZpZGVyQ29udGFpbmVyKEBOb25OdWxsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgU291cmNlUHJvdmlkZXIgc291cmNlUHJvdmlkZXIpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5zb3VyY2VQcm92aWRlciA9IHNvdXJjZVByb3ZpZGVyOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNvdXJjZVByb3ZpZGVyIGdldFNvdXJjZVByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gc291cmNlUHJvdmlkZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdmFyaWFudC9MaWJyYXJ5VmFyaWFudERhdGEuamF2YSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL3ZhcmlhbnQvTGlicmFyeVZhcmlhbnREYXRhLmphdmEKaW5kZXggODUyYjhjNS4uOGE4Njg1MSAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdmFyaWFudC9MaWJyYXJ5VmFyaWFudERhdGEuamF2YQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC92YXJpYW50L0xpYnJhcnlWYXJpYW50RGF0YS5qYXZhCkBAIC0zNiwzNiArMzYsMTcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIEBOb25OdWxsCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhcmlhbnRDb25maWd1cmF0aW9uKCkuaGFzRmxhdm9ycygpID8KLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcyVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEZsYXZvcmVkTmFtZSh0cnVlKSwgZ2V0Q2FwaXRhbGl6ZWRCdWlsZFR5cGVOYW1lKCkpIDoKLSAgICAgICAgICAgICAgICBnZXRDYXBpdGFsaXplZEJ1aWxkVHlwZU5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBATm9uTnVsbAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CiAgICAgICAgIGlmIChnZXRWYXJpYW50Q29uZmlndXJhdGlvbigpLmhhc0ZsYXZvcnMoKSkgewotICAgICAgICAgICAgcmV0dXJuICJUZXN0IGJ1aWxkIGZvciB0aGUgJHtnZXRGbGF2b3JlZE5hbWUodHJ1ZSl9JHtjb25maWcuYnVpbGRUeXBlLm5hbWUuY2FwaXRhbGl6ZSgpfSBidWlsZCI7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMgYnVpbGQgZm9yIGZsYXZvciAlcyIsCisgICAgICAgICAgICAgICAgICAgIGdldENhcGl0YWxpemVkQnVpbGRUeXBlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBnZXRDYXBpdGFsaXplZEZsYXZvck5hbWUoKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIlRlc3QgZm9yIHRoZSAke2NvbmZpZy5idWlsZFR5cGUubmFtZS5jYXBpdGFsaXplKCl9IGJ1aWxkIjsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcyBidWlsZCIsIGdldENhcGl0YWxpemVkQnVpbGRUeXBlTmFtZSgpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIEBOb25OdWxsCi0gICAgcHVibGljIFN0cmluZyBnZXREaXJOYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFyaWFudENvbmZpZ3VyYXRpb24oKS5nZXRCdWlsZFR5cGUoKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFyaWFudENvbmZpZ3VyYXRpb24oKS5nZXRCdWlsZFR5cGUoKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VGVzdFZhcmlhbnREYXRhKEBOdWxsYWJsZSBUZXN0VmFyaWFudERhdGEgdGVzdFZhcmlhbnREYXRhKSB7CiAgICAgICAgIHRoaXMudGVzdFZhcmlhbnREYXRhID0gdGVzdFZhcmlhbnREYXRhOwogICAgIH0KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL3ZhcmlhbnQvVGVzdFZhcmlhbnREYXRhLmphdmEgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9pbnRlcm5hbC92YXJpYW50L1Rlc3RWYXJpYW50RGF0YS5qYXZhCmluZGV4IGViZDMzNmMuLmI4ZDQ1ZWQgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL3ZhcmlhbnQvVGVzdFZhcmlhbnREYXRhLmphdmEKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdmFyaWFudC9UZXN0VmFyaWFudERhdGEuamF2YQpAQCAtNDMsMjAgKzQzLDEyIEBACiAgICAgICAgIHJldHVybiB0ZXN0ZWRWYXJpYW50RGF0YTsKICAgICB9CiAKLSAgICBATm9uTnVsbAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYXJpYW50Q29uZmlndXJhdGlvbigpLmhhc0ZsYXZvcnMoKSA/Ci0gICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJXNUZXN0IiwgZ2V0Rmxhdm9yZWROYW1lKHRydWUpKSA6Ci0gICAgICAgICAgICAgICAgIlRlc3QiOwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIEBOb25OdWxsCiAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKICAgICAgICAgaWYgKGdldFZhcmlhbnRDb25maWd1cmF0aW9uKCkuaGFzRmxhdm9ycygpKSB7CiAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiVGVzdCBidWlsZCBmb3IgdGhlICVzJXMgYnVpbGQiLAotICAgICAgICAgICAgICAgICAgICBnZXRGbGF2b3JlZE5hbWUodHJ1ZSksIGdldENhcGl0YWxpemVkQnVpbGRUeXBlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2FwaXRhbGl6ZWRGbGF2b3JOYW1lKCksIGdldENhcGl0YWxpemVkQnVpbGRUeXBlTmFtZSgpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJUZXN0IGJ1aWxkIGZvciB0aGUgJXMgYnVpbGQiLAogICAgICAgICAgICAgICAgICAgICBnZXRDYXBpdGFsaXplZEJ1aWxkVHlwZU5hbWUoKSk7CkBAIC02NCwyNiArNTYsNiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIEBOb25OdWxsCi0gICAgcHVibGljIFN0cmluZyBnZXREaXJOYW1lKCkgewotICAgICAgICBpZiAoZ2V0VmFyaWFudENvbmZpZ3VyYXRpb24oKS5oYXNGbGF2b3JzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcy90ZXN0IiwgZ2V0Rmxhdm9yZWROYW1lKGZhbHNlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gInRlc3QiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgewotICAgICAgICBpZiAoZ2V0VmFyaWFudENvbmZpZ3VyYXRpb24oKS5oYXNGbGF2b3JzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcy10ZXN0IiwgZ2V0Rmxhdm9yZWROYW1lKGZhbHNlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gInRlc3QiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0WmlwQWxpZ24oKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9BaWRsQ29tcGlsZS5ncm9vdnkgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9BaWRsQ29tcGlsZS5ncm9vdnkKaW5kZXggZDY5OGJkNy4uNmFkOTI3NyAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvQWlkbENvbXBpbGUuZ3Jvb3Z5CisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL0FpZGxDb21waWxlLmdyb292eQpAQCAtNDcsMTEgKzQ3LDYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbjxGaWxlPiBnZXRPdXRwdXRGb3JJbmNyZW1lbnRhbEJ1aWxkKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChnZXRTb3VyY2VPdXRwdXREaXIoKSkKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBjb21waWxlQWxsRmlsZXMoRGVwZW5kZW5jeUZpbGVQcm9jZXNzb3IgZGVwZW5kZW5jeUZpbGVQcm9jZXNzb3IpIHsKICAgICAgICAgZ2V0QnVpbGRlcigpLmNvbXBpbGVBbGxBaWRsRmlsZXMoCiAgICAgICAgICAgICAgICAgZ2V0U291cmNlRGlycygpLApkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvRGV4Lmdyb292eSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL0RleC5ncm9vdnkKaW5kZXggM2RiNmM0NS4uYzc0Y2RiMyAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvRGV4Lmdyb292eQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9EZXguZ3Jvb3Z5CkBAIC0xNCwxNCArMTQsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcwotCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLmRzbC5EZXhPcHRpb25zSW1wbAogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC50YXNrcy5JbmNyZW1lbnRhbFRhc2sKIGltcG9ydCBjb20uYW5kcm9pZC5pZGUuY29tbW9uLnJlczIuRmlsZVN0YXR1cwotaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLklucHV0RmlsZQogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLklucHV0RmlsZXMKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5OZXN0ZWQKLWltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5PcHRpb25hbAogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLk91dHB1dEZpbGUKIAogcHVibGljIGNsYXNzIERleCBleHRlbmRzIEluY3JlbWVudGFsVGFzayB7CkBAIC0zNCwxMyArMzEsMTAgQEAKICAgICAvLyAtLS0tLSBQUklWQVRFIFRBU0sgQVBJIC0tLS0tCiAKICAgICBASW5wdXRGaWxlcwotICAgIEl0ZXJhYmxlPEZpbGU+IHNvdXJjZUZpbGVzCisgICAgSXRlcmFibGU8RmlsZT4gaW5wdXRGaWxlcwogCiAgICAgQElucHV0RmlsZXMKLSAgICBJdGVyYWJsZTxGaWxlPiBsaWJyYXJpZXMKLQotICAgIEBJbnB1dEZpbGUgQE9wdGlvbmFsCi0gICAgRmlsZSBwcm9ndWFyZGVkSmFyCisgICAgSXRlcmFibGU8RmlsZT4gcHJlRGV4ZWRMaWJyYXJpZXMKIAogICAgIEBOZXN0ZWQKICAgICBEZXhPcHRpb25zSW1wbCBkZXhPcHRpb25zCkBAIC00OCwxMCArNDIsOSBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGRvRnVsbFRhc2tBY3Rpb24oKSB7CiAgICAgICAgIGdldEJ1aWxkZXIoKS5jb252ZXJ0Qnl0ZUNvZGUoCi0gICAgICAgICAgICAgICAgZ2V0U291cmNlRmlsZXMoKSwKLSAgICAgICAgICAgICAgICBnZXRMaWJyYXJpZXMoKSwKLSAgICAgICAgICAgICAgICBnZXRQcm9ndWFyZGVkSmFyKCksCi0gICAgICAgICAgICAgICAgZ2V0T3V0cHV0RmlsZSgpLmFic29sdXRlUGF0aCwKKyAgICAgICAgICAgICAgICBnZXRJbnB1dEZpbGVzKCksCisgICAgICAgICAgICAgICAgZ2V0UHJlRGV4ZWRMaWJyYXJpZXMoKSwKKyAgICAgICAgICAgICAgICBnZXRPdXRwdXRGaWxlKCksCiAgICAgICAgICAgICAgICAgZ2V0RGV4T3B0aW9ucygpLAogICAgICAgICAgICAgICAgIGZhbHNlKQogICAgIH0KQEAgLTU5LDEwICs1Miw5IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZG9JbmNyZW1lbnRhbFRhc2tBY3Rpb24oTWFwPEZpbGUsIEZpbGVTdGF0dXM+IGNoYW5nZWRJbnB1dHMpIHsKICAgICAgICAgZ2V0QnVpbGRlcigpLmNvbnZlcnRCeXRlQ29kZSgKLSAgICAgICAgICAgICAgICBnZXRTb3VyY2VGaWxlcygpLAotICAgICAgICAgICAgICAgIGdldExpYnJhcmllcygpLAotICAgICAgICAgICAgICAgIGdldFByb2d1YXJkZWRKYXIoKSwKLSAgICAgICAgICAgICAgICBnZXRPdXRwdXRGaWxlKCkuYWJzb2x1dGVQYXRoLAorICAgICAgICAgICAgICAgIGdldElucHV0RmlsZXMoKSwKKyAgICAgICAgICAgICAgICBnZXRQcmVEZXhlZExpYnJhcmllcygpLAorICAgICAgICAgICAgICAgIGdldE91dHB1dEZpbGUoKSwKICAgICAgICAgICAgICAgICBnZXREZXhPcHRpb25zKCksCiAgICAgICAgICAgICAgICAgdHJ1ZSkKICAgICB9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9HZW5lcmF0ZUJ1aWxkQ29uZmlnLmdyb292eSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL0dlbmVyYXRlQnVpbGRDb25maWcuZ3Jvb3Z5CmluZGV4IDM1YmM0ODkuLjFmNGQ3YWYgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL0dlbmVyYXRlQnVpbGRDb25maWcuZ3Jvb3Z5CisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL0dlbmVyYXRlQnVpbGRDb25maWcuZ3Jvb3Z5CkBAIC0xNiw3ICsxNiw5IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcwogCiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLnRhc2tzLkluY3JlbWVudGFsVGFzaworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuY29tcGlsaW5nLkJ1aWxkQ29uZmlnR2VuZXJhdG9yCiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuSW5wdXQKK2ltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5PcHRpb25hbAogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLk91dHB1dERpcmVjdG9yeQogCiBwdWJsaWMgY2xhc3MgR2VuZXJhdGVCdWlsZENvbmZpZyBleHRlbmRzIEluY3JlbWVudGFsVGFzayB7CkBAIC0yOSwxMyArMzEsMzEgQEAKICAgICAvLyAtLS0tLSBQUklWQVRFIFRBU0sgQVBJIC0tLS0tCiAKICAgICBASW5wdXQKLSAgICBTdHJpbmcgcGFja2FnZU5hbWUKKyAgICBTdHJpbmcgYnVpbGRDb25maWdQYWNrYWdlTmFtZQorCisgICAgQElucHV0CisgICAgU3RyaW5nIGFwcFBhY2thZ2VOYW1lCiAKICAgICBASW5wdXQKICAgICBib29sZWFuIGRlYnVnZ2FibGUKIAogICAgIEBJbnB1dAotICAgIExpc3Q8U3RyaW5nPiBqYXZhTGluZXM7CisgICAgU3RyaW5nIGZsYXZvck5hbWUKKworICAgIEBJbnB1dAorICAgIExpc3Q8U3RyaW5nPiBmbGF2b3JOYW1lc1dpdGhEaW1lbnNpb25OYW1lcworCisgICAgQElucHV0CisgICAgU3RyaW5nIGJ1aWxkVHlwZU5hbWUKKworICAgIEBJbnB1dCBAT3B0aW9uYWwKKyAgICBTdHJpbmcgdmVyc2lvbk5hbWUKKworICAgIEBJbnB1dAorICAgIGludCB2ZXJzaW9uQ29kZQorCisgICAgQElucHV0CisgICAgTGlzdDxPYmplY3Q+IGl0ZW1zOwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZG9GdWxsVGFza0FjdGlvbigpIHsKQEAgLTQ0LDEwICs2NCwzNiBAQAogICAgICAgICBGaWxlIGRlc3RpbmF0aW9uRGlyID0gZ2V0U291cmNlT3V0cHV0RGlyKCkKICAgICAgICAgZW1wdHlGb2xkZXIoZGVzdGluYXRpb25EaXIpCiAKLSAgICAgICAgZ2V0QnVpbGRlcigpLmdlbmVyYXRlQnVpbGRDb25maWcoCi0gICAgICAgICAgICAgICAgZ2V0UGFja2FnZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBpc0RlYnVnZ2FibGUoKSwKLSAgICAgICAgICAgICAgICBnZXRKYXZhTGluZXMoKSwKLSAgICAgICAgICAgICAgICBnZXRTb3VyY2VPdXRwdXREaXIoKS5hYnNvbHV0ZVBhdGgpOworICAgICAgICBCdWlsZENvbmZpZ0dlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQnVpbGRDb25maWdHZW5lcmF0b3IoCisgICAgICAgICAgICAgICAgZ2V0U291cmNlT3V0cHV0RGlyKCkuYWJzb2x1dGVQYXRoLAorICAgICAgICAgICAgICAgIGdldEJ1aWxkQ29uZmlnUGFja2FnZU5hbWUoKSk7CisKKyAgICAgICAgLy8gSGFjayAoc2VlIElERUEtMTAwMDQ2KTogV2Ugd2FudCB0byBhdm9pZCByZXBvcnRpbmcgImNvbmRpdGlvbiBpcyBhbHdheXMgdHJ1ZSIKKyAgICAgICAgLy8gZnJvbSB0aGUgZGF0YSBmbG93IGluc3BlY3Rpb24sIHNvIHVzZSBhIG5vbi1jb25zdGFudCB2YWx1ZS4gSG93ZXZlciwgdGhhdCBkZWZlYXRzCisgICAgICAgIC8vIHRoZSBwdXJwb3NlIG9mIHRoaXMgZmxhZyAod2hlbiBub3QgaW4gZGVidWcgbW9kZSwgaWYgKEJ1aWxkQ29uZmlnLkRFQlVHICYmIC4uLikgd2lsbAorICAgICAgICAvLyBiZSBjb21wbGV0ZWx5IHJlbW92ZWQgYnkgdGhlIGNvbXBpbGVyKSwgc28gYXMgYSBoYWNrIHdlIGRvIGl0IG9ubHkgZm9yIHRoZSBjYXNlCisgICAgICAgIC8vIHdoZXJlIGRlYnVnIGlzIHRydWUsIHdoaWNoIGlzIHRoZSBtb3N0IGxpa2VseSBzY2VuYXJpbyB3aGlsZSB0aGUgdXNlciBpcyBsb29raW5nCisgICAgICAgIC8vIGF0IHNvdXJjZSBjb2RlLgorICAgICAgICAvL21hcC5wdXQoUEhfREVCVUcsIEJvb2xlYW4udG9TdHJpbmcobURlYnVnKSk7CisgICAgICAgIGdlbmVyYXRvci5hZGRGaWVsZCgiYm9vbGVhbiIsICJERUJVRyIsIGdldERlYnVnZ2FibGUoKSA/ICJCb29sZWFuLnBhcnNlQm9vbGVhbihcInRydWVcIikiIDogImZhbHNlIikKKyAgICAgICAgICAgIC5hZGRGaWVsZCgiU3RyaW5nIiwgIlBBQ0tBR0VfTkFNRSIsICJcIiR7Z2V0QXBwUGFja2FnZU5hbWUoKX1cIiIpCisgICAgICAgICAgICAuYWRkRmllbGQoIlN0cmluZyIsICJCVUlMRF9UWVBFIiwgIlwiJHtnZXRCdWlsZFR5cGVOYW1lKCl9XCIiKQorICAgICAgICAgICAgLmFkZEZpZWxkKCJTdHJpbmciLCAiRkxBVk9SIiwgIlwiJHtnZXRGbGF2b3JOYW1lKCl9XCIiKQorICAgICAgICAgICAgLmFkZEZpZWxkKCJpbnQiLCAiVkVSU0lPTl9DT0RFIiwgSW50ZWdlci50b1N0cmluZyhnZXRWZXJzaW9uQ29kZSgpKSkKKyAgICAgICAgICAgIC5hZGRJdGVtcyhnZXRJdGVtcygpKTsKKworICAgICAgICBpZiAoZ2V0VmVyc2lvbk5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBnZW5lcmF0b3IuYWRkRmllbGQoIlN0cmluZyIsICJWRVJTSU9OX05BTUUiLCAiXCIke2dldFZlcnNpb25OYW1lKCl9XCIiKQorICAgICAgICB9CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IGZsYXZvcnMgPSBnZXRGbGF2b3JOYW1lc1dpdGhEaW1lbnNpb25OYW1lcygpOworICAgICAgICBpbnQgY291bnQgPSBmbGF2b3JzLnNpemUoKTsKKyAgICAgICAgaWYgKGNvdW50ID4gMSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudCA7IGkrPTIpIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0b3IuYWRkRmllbGQoIlN0cmluZyIsICJGTEFWT1JfJHtmbGF2b3JzLmdldChpKzEpfSIsICJcIiR7Zmxhdm9ycy5nZXQoaSl9XCIiKQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZ2VuZXJhdG9yLmdlbmVyYXRlKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvTGludC5ncm9vdnkgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9MaW50Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODhlZTcyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvTGludC5ncm9vdnkKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcworCitpbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTm9uTnVsbAoraW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLkJhc2VQbHVnaW4KK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwuTGludEdyYWRsZUNsaWVudAoraW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEJ1aWxkZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLkFuZHJvaWRQcm9qZWN0CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5tb2RlbC5WYXJpYW50CitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5IdG1sUmVwb3J0ZXIKK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50LkxpbnRDbGlGbGFncworaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuUmVwb3J0ZXIKK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50Lldhcm5pbmcKK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50LlhtbFJlcG9ydGVyCitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5jaGVja3MuQnVpbHRpbklzc3VlUmVnaXN0cnkKK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50LmNsaWVudC5hcGkuSXNzdWVSZWdpc3RyeQoraW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuZGV0ZWN0b3IuYXBpLlNldmVyaXR5CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzCitpbXBvcnQgb3JnLmdyYWRsZS5hcGkuRGVmYXVsdFRhc2sKK2ltcG9ydCBvcmcuZ3JhZGxlLmFwaS5HcmFkbGVFeGNlcHRpb24KK2ltcG9ydCBvcmcuZ3JhZGxlLmFwaS5Qcm9qZWN0CitpbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuVGFza0FjdGlvbgorCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLlNka0NvbnN0YW50cy5ET1RfWE1MCisKK3B1YmxpYyBjbGFzcyBMaW50IGV4dGVuZHMgRGVmYXVsdFRhc2sgeworICAgIEBOb25OdWxsIHByaXZhdGUgQmFzZVBsdWdpbiBtUGx1Z2luCisgICAgQE51bGxhYmxlIHByaXZhdGUgRmlsZSBtQ29uZmlnRmlsZQorICAgIEBOdWxsYWJsZSBwcml2YXRlIEZpbGUgbUh0bWxPdXRwdXQKKyAgICBATnVsbGFibGUgcHJpdmF0ZSBGaWxlIG1YbWxPdXRwdXQKKyAgICBATnVsbGFibGUgcHJpdmF0ZSBTdHJpbmcgbVZhcmlhbnROYW1lCisgICAgcHJpdmF0ZSBib29sZWFuIG1RdWlldCA9IHRydWUKKworICAgIHB1YmxpYyB2b2lkIHNldFBsdWdpbihATm9uTnVsbCBCYXNlUGx1Z2luIHBsdWdpbikgeworICAgICAgICBtUGx1Z2luID0gcGx1Z2luCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFyaWFudE5hbWUoQE5vbk51bGwgU3RyaW5nIHZhcmlhbnROYW1lKSB7CisgICAgICAgIG1WYXJpYW50TmFtZSA9IHZhcmlhbnROYW1lCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UXVpZXQoKSB7CisgICAgICAgIG1RdWlldCA9IHRydWUKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWcoQE5vbk51bGwgRmlsZSBjb25maWdGaWxlKSB7CisgICAgICAgIG1Db25maWdGaWxlID0gY29uZmlnRmlsZQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEh0bWxPdXRwdXQoQE5vbk51bGwgRmlsZSBodG1sT3V0cHV0KSB7CisgICAgICAgIG1IdG1sT3V0cHV0ID0gaHRtbE91dHB1dAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFhtbE91dHB1dChATm9uTnVsbCBGaWxlIHhtbE91dHB1dCkgeworICAgICAgICBtWG1sT3V0cHV0ID0geG1sT3V0cHV0CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkdyb292eVVudXNlZERlY2xhcmF0aW9uIikKKyAgICBAVGFza0FjdGlvbgorICAgIHB1YmxpYyB2b2lkIGxpbnQoKSB7CisgICAgICAgIGRlZiBtb2RlbFByb2plY3QgPSBjcmVhdGVBbmRyb2lkUHJvamVjdChtUGx1Z2luLmdldFByb2plY3QoKSkKKyAgICAgICAgaWYgKG1WYXJpYW50TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBsaW50U2luZ2xlVmFyaWFudChtb2RlbFByb2plY3QsIG1WYXJpYW50TmFtZSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpbnRBbGxWYXJpYW50cyhtb2RlbFByb2plY3QpCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIGxpbnQgaW5kaXZpZHVhbGx5IG9uIGFsbCB0aGUgdmFyaWFudHMsIGFuZCB0aGVuIGNvbXBhcmVzIHRoZSByZXN1bHRzCisgICAgICogYWNyb3NzIHZhcmlhbnRzIGFuZCByZXBvcnRzIHRoZXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgbGludEFsbFZhcmlhbnRzKEBOb25OdWxsIEFuZHJvaWRQcm9qZWN0IG1vZGVsUHJvamVjdCkgeworICAgICAgICBNYXA8VmFyaWFudCxMaXN0PFdhcm5pbmc+PiB3YXJuaW5nTWFwID0gTWFwcy5uZXdIYXNoTWFwKCkKKyAgICAgICAgZm9yIChWYXJpYW50IHZhcmlhbnQgOiBtb2RlbFByb2plY3QuZ2V0VmFyaWFudHMoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBMaXN0PFdhcm5pbmc+IHdhcm5pbmdzID0gcnVuTGludChtb2RlbFByb2plY3QsIHZhcmlhbnQuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgIHdhcm5pbmdNYXAucHV0KHZhcmlhbnQsIHdhcm5pbmdzKQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcmFkbGVFeGNlcHRpb24oIkludmFsaWQgYXJndW1lbnRzLiIsIGUpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDb21wdXRlIGVycm9yIG1hdHJpeAorICAgICAgICBmb3IgKE1hcC5FbnRyeTxWYXJpYW50LExpc3Q8V2FybmluZz4+IGVudHJ5IDogd2FybmluZ01hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBkZWYgdmFyaWFudCA9IGVudHJ5LmdldEtleSgpCisgICAgICAgICAgICBkZWYgd2FybmluZ3MgPSBlbnRyeS5nZXRWYWx1ZSgpCisgICAgICAgICAgICBwcmludGxuICJSYW4gbGludCBvbiB2YXJpYW50ICIgKyB2YXJpYW50LmdldE5hbWUoKSArICI6ICIgKyB3YXJuaW5ncy5zaXplKCkgKworICAgICAgICAgICAgICAgICAgICAiIGlzc3VlcyBmb3VuZCIKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8V2FybmluZz4gbWVyZ2VkV2FybmluZ3MgPSBMaW50R3JhZGxlQ2xpZW50Lm1lcmdlKHdhcm5pbmdNYXAsIG1vZGVsUHJvamVjdCkKKyAgICAgICAgaW50IGVycm9yQ291bnQgPSAwCisgICAgICAgIGludCB3YXJuaW5nQ291bnQgPSAwCisgICAgICAgIGZvciAoV2FybmluZyB3YXJuaW5nIDogbWVyZ2VkV2FybmluZ3MpIHsKKyAgICAgICAgICAgIGlmICh3YXJuaW5nLnNldmVyaXR5ID09IFNldmVyaXR5LkVSUk9SIHx8IHdhcm5pbmcuc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuRkFUQUwpIHsKKyAgICAgICAgICAgICAgICBlcnJvckNvdW50KysKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2FybmluZy5zZXZlcml0eSA9PSBTZXZlcml0eS5XQVJOSU5HKSB7CisgICAgICAgICAgICAgICAgd2FybmluZ0NvdW50KysKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIElzc3VlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgQnVpbHRpbklzc3VlUmVnaXN0cnkoKQorICAgICAgICBMaW50Q2xpRmxhZ3MgZmxhZ3MgPSBuZXcgTGludENsaUZsYWdzKCkKKyAgICAgICAgTGludEdyYWRsZUNsaWVudCBjbGllbnQgPSBuZXcgTGludEdyYWRsZUNsaWVudChyZWdpc3RyeSwgZmxhZ3MsIG1QbHVnaW4sIG1vZGVsUHJvamVjdCwKKyAgICAgICAgICAgICAgICBudWxsKQorICAgICAgICBjb25maWd1cmVSZXBvcnRlcnMoY2xpZW50LCBmbGFncywgbnVsbCkKKyAgICAgICAgZm9yIChSZXBvcnRlciByZXBvcnRlciA6IGZsYWdzLmdldFJlcG9ydGVycygpKSB7CisgICAgICAgICAgICByZXBvcnRlci53cml0ZShlcnJvckNvdW50LCB3YXJuaW5nQ291bnQsIG1lcmdlZFdhcm5pbmdzKQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyBsaW50IG9uIGEgc2luZ2xlIHNwZWNpZmllZCB2YXJpYW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgbGludFNpbmdsZVZhcmlhbnQoQE5vbk51bGwgQW5kcm9pZFByb2plY3QgbW9kZWxQcm9qZWN0LCBTdHJpbmcgdmFyaWFudE5hbWUpIHsKKyAgICAgICAgcnVuTGludChtb2RlbFByb2plY3QsIHZhcmlhbnROYW1lKQorICAgIH0KKworICAgIC8qKiBSdW5zIGxpbnQgb24gdGhlIGdpdmVuIHZhcmlhbnQgYW5kIHJldHVybnMgdGhlIHNldCBvZiB3YXJuaW5ncyAqLworICAgIHByaXZhdGUgTGlzdDxXYXJuaW5nPiBydW5MaW50KAorICAgICAgICAgICAgQE5vbk51bGwgQW5kcm9pZFByb2plY3QgbW9kZWxQcm9qZWN0LAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHZhcmlhbnROYW1lKSB7CisgICAgICAgIElzc3VlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgQnVpbHRpbklzc3VlUmVnaXN0cnkoKQorICAgICAgICBMaW50Q2xpRmxhZ3MgZmxhZ3MgPSBuZXcgTGludENsaUZsYWdzKCkKKyAgICAgICAgTGludEdyYWRsZUNsaWVudCBjbGllbnQgPSBuZXcgTGludEdyYWRsZUNsaWVudChyZWdpc3RyeSwgZmxhZ3MsIG1QbHVnaW4sIG1vZGVsUHJvamVjdCwKKyAgICAgICAgICAgICAgICB2YXJpYW50TmFtZSkKKworICAgICAgICAvLyBDb25maWd1cmUgUmVwb3J0ZXJzCisgICAgICAgIGNvbmZpZ3VyZVJlcG9ydGVycyhjbGllbnQsIGZsYWdzLCB2YXJpYW50TmFtZSkKKworICAgICAgICAvLyBGbGFncworICAgICAgICBpZiAobVF1aWV0KSB7CisgICAgICAgICAgICBmbGFncy5zZXRRdWlldCh0cnVlKQorICAgICAgICB9CisgICAgICAgIGlmIChtQ29uZmlnRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmbGFncy5zZXREZWZhdWx0Q29uZmlndXJhdGlvbihjbGllbnQuY3JlYXRlQ29uZmlndXJhdGlvbkZyb21GaWxlKG1Db25maWdGaWxlKSkKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmFsbHkgcGVyZm9ybSBsaW50IHJ1bgorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNsaWVudC5ydW4ocmVnaXN0cnkpCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHcmFkbGVFeGNlcHRpb24oIkludmFsaWQgYXJndW1lbnRzLiIsIGUpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlUmVwb3J0ZXJzKEBOb25OdWxsIExpbnRHcmFkbGVDbGllbnQgY2xpZW50LCBATm9uTnVsbCBMaW50Q2xpRmxhZ3MgZmxhZ3MsCisgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIHZhcmlhbnROYW1lKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYmFzZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCkKKyAgICAgICAgYmFzZS5hcHBlbmQoImxpbnQtcmVzdWx0cy8iKQorICAgICAgICBpZiAodmFyaWFudE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgYmFzZS5hcHBlbmQodmFyaWFudE5hbWUpCisgICAgICAgICAgICBiYXNlLmFwcGVuZCgiLyIpCisgICAgICAgIH0KKyAgICAgICAgYmFzZS5hcHBlbmQoImxpbnQtcmVzdWx0cyIpCisgICAgICAgIGlmICh2YXJpYW50TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBiYXNlLmFwcGVuZCgiLSIpCisgICAgICAgICAgICBiYXNlLmFwcGVuZCh2YXJpYW50TmFtZSkKKyAgICAgICAgfQorICAgICAgICBGaWxlIGh0bWxPdXRwdXQgPSBtSHRtbE91dHB1dAorICAgICAgICBGaWxlIHhtbE91dHB1dCA9IG1YbWxPdXRwdXQKKyAgICAgICAgaWYgKGh0bWxPdXRwdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgaHRtbE91dHB1dCA9IHByb2plY3QuZmlsZShiYXNlLnRvU3RyaW5nKCkgKyAiLmh0bWwiKQorICAgICAgICAgICAgRmlsZSBwYXJlbnQgPSBodG1sT3V0cHV0LnBhcmVudEZpbGUKKyAgICAgICAgICAgIGlmICghcGFyZW50LmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgcGFyZW50Lm1rZGlycygpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoeG1sT3V0cHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHhtbE91dHB1dCA9IHByb2plY3QuZmlsZShiYXNlLnRvU3RyaW5nKCkgKyBET1RfWE1MKQorICAgICAgICAgICAgRmlsZSBwYXJlbnQgPSB4bWxPdXRwdXQucGFyZW50RmlsZQorICAgICAgICAgICAgaWYgKCFwYXJlbnQuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQubWtkaXJzKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGh0bWxPdXRwdXQgPSBodG1sT3V0cHV0LmdldEFic29sdXRlRmlsZSgpCisgICAgICAgIGlmIChodG1sT3V0cHV0LmV4aXN0cygpKSB7CisgICAgICAgICAgICBib29sZWFuIGRlbGV0ZSA9IGh0bWxPdXRwdXQuZGVsZXRlKCkKKyAgICAgICAgICAgIGlmICghZGVsZXRlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWRsZUV4Y2VwdGlvbigiQ291bGQgbm90IGRlbGV0ZSBvbGQgIiArIGh0bWxPdXRwdXQpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGh0bWxPdXRwdXQuZ2V0UGFyZW50RmlsZSgpICE9IG51bGwgJiYgIWh0bWxPdXRwdXQuZ2V0UGFyZW50RmlsZSgpLmNhbldyaXRlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHcmFkbGVFeGNlcHRpb24oIkNhbm5vdCB3cml0ZSBIVE1MIG91dHB1dCBmaWxlICIgKyBodG1sT3V0cHV0KQorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmbGFncy5nZXRSZXBvcnRlcnMoKS5hZGQobmV3IEh0bWxSZXBvcnRlcihjbGllbnQsIGh0bWxPdXRwdXQpKQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR3JhZGxlRXhjZXB0aW9uKCJIVE1MIGludmFsaWQgYXJndW1lbnQuIiwgZSkKKyAgICAgICAgfQorCisgICAgICAgIHhtbE91dHB1dCA9IHhtbE91dHB1dC5nZXRBYnNvbHV0ZUZpbGUoKQorICAgICAgICBpZiAoeG1sT3V0cHV0LmV4aXN0cygpKSB7CisgICAgICAgICAgICBib29sZWFuIGRlbGV0ZSA9IHhtbE91dHB1dC5kZWxldGUoKQorICAgICAgICAgICAgaWYgKCFkZWxldGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3JhZGxlRXhjZXB0aW9uKCJDb3VsZCBub3QgZGVsZXRlIG9sZCAiICsgeG1sT3V0cHV0KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh4bWxPdXRwdXQuZ2V0UGFyZW50RmlsZSgpICE9IG51bGwgJiYgIXhtbE91dHB1dC5nZXRQYXJlbnRGaWxlKCkuY2FuV3JpdGUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWRsZUV4Y2VwdGlvbigiQ2Fubm90IHdyaXRlIFhNTCBvdXRwdXQgZmlsZSAiICsgeG1sT3V0cHV0KQorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmbGFncy5nZXRSZXBvcnRlcnMoKS5hZGQobmV3IFhtbFJlcG9ydGVyKGNsaWVudCwgeG1sT3V0cHV0KSkKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWRsZUV4Y2VwdGlvbigiWE1MIGludmFsaWQgYXJndW1lbnQuIiwgZSkKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8UmVwb3J0ZXI+IHJlcG9ydGVycyA9IGZsYWdzLmdldFJlcG9ydGVycygpCisgICAgICAgIGlmIChyZXBvcnRlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR3JhZGxlRXhjZXB0aW9uKCJObyByZXBvcnRlciBzcGVjaWZpZWQuIikKKyAgICAgICAgfQorCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkge3sKKyAgICAgICAgICAgIHB1dCgiIiwgImZpbGU6Ly8iKQorICAgICAgICB9fQorICAgICAgICBmb3IgKFJlcG9ydGVyIHJlcG9ydGVyIDogcmVwb3J0ZXJzKSB7CisgICAgICAgICAgICByZXBvcnRlci5zZXRVcmxNYXAobWFwKQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQW5kcm9pZFByb2plY3QgY3JlYXRlQW5kcm9pZFByb2plY3QoQE5vbk51bGwgUHJvamVjdCBncmFkbGVQcm9qZWN0KSB7CisgICAgICAgIFN0cmluZyBtb2RlbE5hbWUgPSBBbmRyb2lkUHJvamVjdC5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTW9kZWxCdWlsZGVyKCkKKyAgICAgICAgcmV0dXJuIChBbmRyb2lkUHJvamVjdCkgYnVpbGRlci5idWlsZEFsbChtb2RlbE5hbWUsIGdyYWRsZVByb2plY3QpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvTWVyZ2VBc3NldHMuZ3Jvb3Z5IGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvTWVyZ2VBc3NldHMuZ3Jvb3Z5CmluZGV4IGI4NmZjOGIuLjc5ZjYxOTAgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL01lcmdlQXNzZXRzLmdyb292eQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9NZXJnZUFzc2V0cy5ncm9vdnkKQEAgLTE5LDggKzE5LDggQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pZGUuY29tbW9uLnJlczIuQXNzZXRTZXQKIGltcG9ydCBjb20uYW5kcm9pZC5pZGUuY29tbW9uLnJlczIuRmlsZVN0YXR1cwogaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5jb21tb24ucmVzMi5GaWxlVmFsaWRpdHkKLWltcG9ydCBjb20uYW5kcm9pZC5pZGUuY29tbW9uLnJlczIuTWVyZ2VDb25zdW1lcgogaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5jb21tb24ucmVzMi5NZXJnZWRBc3NldFdyaXRlcgoraW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5jb21tb24ucmVzMi5NZXJnaW5nRXhjZXB0aW9uCiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuSW5wdXRGaWxlcwogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLk91dHB1dERpcmVjdG9yeQogCkBAIC01MCwxMSArNTAsNiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uPEZpbGU+IGdldE91dHB1dEZvckluY3JlbWVudGFsQnVpbGQoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGdldE91dHB1dERpcigpKQotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGRvRnVsbFRhc2tBY3Rpb24oKSB7CiAgICAgICAgIC8vIHRoaXMgaXMgZnVsbCBydW4sIGNsZWFuIHRoZSBwcmV2aW91cyBvdXRwdXQKICAgICAgICAgRmlsZSBkZXN0aW5hdGlvbkRpciA9IGdldE91dHB1dERpcigpCkBAIC02NSw3OCArNjAsODEgQEAKICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IG1lcmdlciBhbmQgcG9wdWxhdGUgaXQgd2l0aCB0aGUgc2V0cy4KICAgICAgICAgQXNzZXRNZXJnZXIgbWVyZ2VyID0gbmV3IEFzc2V0TWVyZ2VyKCkKIAotICAgICAgICBmb3IgKEFzc2V0U2V0IGFzc2V0U2V0IDogYXNzZXRTZXRzKSB7Ci0gICAgICAgICAgICAvLyBzZXQgbmVlZHMgdG8gYmUgbG9hZGVkLgotICAgICAgICAgICAgYXNzZXRTZXQubG9hZEZyb21GaWxlcyhwbHVnaW4ubG9nZ2VyKQotICAgICAgICAgICAgbWVyZ2VyLmFkZERhdGFTZXQoYXNzZXRTZXQpCi0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIG1lcmdlZCBzZXQgYW5kIHdyaXRlIGl0IGRvd24uCi0gICAgICAgIE1lcmdlZEFzc2V0V3JpdGVyIHdyaXRlciA9IG5ldyBNZXJnZWRBc3NldFdyaXRlcihkZXN0aW5hdGlvbkRpcikKLQogICAgICAgICB0cnkgewotICAgICAgICAgICAgbWVyZ2VyLm1lcmdlRGF0YSh3cml0ZXIsIGZhbHNlIC8qZG9DbGVhblVwKi8pCi0gICAgICAgIH0gY2F0Y2ggKE1lcmdlQ29uc3VtZXIuQ29uc3VtZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbWVyZ2VyLmNsZWFuQmxvYihnZXRJbmNyZW1lbnRhbEZvbGRlcigpKQotICAgICAgICAgICAgdGhyb3cgZS5nZXRDYXVzZSgpCi0gICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoQXNzZXRTZXQgYXNzZXRTZXQgOiBhc3NldFNldHMpIHsKKyAgICAgICAgICAgICAgICAvLyBzZXQgbmVlZHMgdG8gYmUgbG9hZGVkLgorICAgICAgICAgICAgICAgIGFzc2V0U2V0LmxvYWRGcm9tRmlsZXMocGx1Z2luLmxvZ2dlcikKKyAgICAgICAgICAgICAgICBtZXJnZXIuYWRkRGF0YVNldChhc3NldFNldCkKKyAgICAgICAgICAgIH0KIAotICAgICAgICAvLyBObyBleGNlcHRpb24/IFdyaXRlIHRoZSBrbm93biBzdGF0ZS4KLSAgICAgICAgbWVyZ2VyLndyaXRlQmxvYlRvKGdldEluY3JlbWVudGFsRm9sZGVyKCksIHdyaXRlcikKKyAgICAgICAgICAgIC8vIGdldCB0aGUgbWVyZ2VkIHNldCBhbmQgd3JpdGUgaXQgZG93bi4KKyAgICAgICAgICAgIE1lcmdlZEFzc2V0V3JpdGVyIHdyaXRlciA9IG5ldyBNZXJnZWRBc3NldFdyaXRlcihkZXN0aW5hdGlvbkRpcikKKworICAgICAgICAgICAgbWVyZ2VyLm1lcmdlRGF0YSh3cml0ZXIsIGZhbHNlIC8qZG9DbGVhblVwKi8pCisKKyAgICAgICAgICAgIC8vIE5vIGV4Y2VwdGlvbj8gV3JpdGUgdGhlIGtub3duIHN0YXRlLgorICAgICAgICAgICAgbWVyZ2VyLndyaXRlQmxvYlRvKGdldEluY3JlbWVudGFsRm9sZGVyKCksIHdyaXRlcikKKyAgICAgICAgfSBjYXRjaCAoTWVyZ2luZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBwcmludGxuIGUuZ2V0TWVzc2FnZSgpCisgICAgICAgICAgICBtZXJnZXIuY2xlYW5CbG9iKGdldEluY3JlbWVudGFsRm9sZGVyKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpCisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkb0luY3JlbWVudGFsVGFza0FjdGlvbihNYXA8RmlsZSwgRmlsZVN0YXR1cz4gY2hhbmdlZElucHV0cykgewogICAgICAgICAvLyBjcmVhdGUgYSBtZXJnZXIgYW5kIGxvYWQgdGhlIGtub3duIHN0YXRlLgogICAgICAgICBBc3NldE1lcmdlciBtZXJnZXIgPSBuZXcgQXNzZXRNZXJnZXIoKQotICAgICAgICBpZiAoIW1lcmdlci5sb2FkRnJvbUJsb2IoZ2V0SW5jcmVtZW50YWxGb2xkZXIoKSwgdHJ1ZSAvKmluY3JlbWVudGFsU3RhdGUqLykpIHsKLSAgICAgICAgICAgIGRvRnVsbFRhc2tBY3Rpb24oKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIH0KLQotICAgICAgICAvLyBjb21wYXJlIHRoZSBrbm93biBzdGF0ZSB0byB0aGUgY3VycmVudCBzZXRzIHRvIGRldGVjdCBpbmNvbXBhdGliaWxpdHkuCi0gICAgICAgIC8vIFRoaXMgaXMgaW4gY2FzZSB0aGVyZSdzIGEgY2hhbmdlIHRoYXQncyB0b28gaGFyZCB0byBkbyBpbmNyZW1lbnRhbGx5LiBJbiB0aGlzIGNhc2UKLSAgICAgICAgLy8gd2UnbGwgc2ltcGx5IHJldmVydCB0byBmdWxsIGJ1aWxkLgotICAgICAgICBMaXN0PEFzc2V0U2V0PiBhc3NldFNldHMgPSBnZXRJbnB1dEFzc2V0U2V0cygpCi0KLSAgICAgICAgaWYgKCFtZXJnZXIuY2hlY2tWYWxpZFVwZGF0ZShhc3NldFNldHMpKSB7Ci0gICAgICAgICAgICBwcm9qZWN0LmxvZ2dlci5pbmZvKCJDaGFuZ2VkIEFzc2V0IHNldHM6IGZ1bGwgdGFzayBydW4hIikKLSAgICAgICAgICAgIGRvRnVsbFRhc2tBY3Rpb24oKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgaW5jcmVtZW50YWwgcHJvY2VzcyBpcyB0aGUgZm9sbG93aW5nOgotICAgICAgICAvLyBMb29wIG9uIGFsbCB0aGUgY2hhbmdlZCBmaWxlcywgZmluZCB3aGljaCBSZXNvdXJjZVNldCBpdCBiZWxvbmdzIHRvLCB0aGVuIGFzawotICAgICAgICAvLyB0aGUgcmVzb3VyY2Ugc2V0IHRvIHVwZGF0ZSBpdHNlbGYgd2l0aCB0aGUgbmV3IGZpbGUuCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PEZpbGUsIEZpbGVTdGF0dXM+IGVudHJ5IDogY2hhbmdlZElucHV0cy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBGaWxlIGNoYW5nZWRGaWxlID0gZW50cnkuZ2V0S2V5KCkKLQotICAgICAgICAgICAgbWVyZ2VyLmZpbmREYXRhU2V0Q29udGFpbmluZyhjaGFuZ2VkRmlsZSwgZmlsZVZhbGlkaXR5KQotICAgICAgICAgICAgaWYgKGZpbGVWYWxpZGl0eS5zdGF0dXMgPT0gRmlsZVZhbGlkaXR5LkZpbGVTdGF0dXMuVU5LTk9XTl9GSUxFKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIW1lcmdlci5sb2FkRnJvbUJsb2IoZ2V0SW5jcmVtZW50YWxGb2xkZXIoKSwgdHJ1ZSAvKmluY3JlbWVudGFsU3RhdGUqLykpIHsKICAgICAgICAgICAgICAgICBkb0Z1bGxUYXNrQWN0aW9uKCkKICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZVZhbGlkaXR5LnN0YXR1cyA9PSBGaWxlVmFsaWRpdHkuRmlsZVN0YXR1cy5WQUxJRF9GSUxFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaWxlVmFsaWRpdHkuZGF0YVNldC51cGRhdGVXaXRoKAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVZhbGlkaXR5LnNvdXJjZUZpbGUsIGNoYW5nZWRGaWxlLCBlbnRyeS5nZXRWYWx1ZSgpLCBwbHVnaW4ubG9nZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmxvZ2dlci5pbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkZhaWxlZCB0byBwcm9jZXNzICVzIGV2ZW50ISBGdWxsIHRhc2sgcnVuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKCkpKQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb21wYXJlIHRoZSBrbm93biBzdGF0ZSB0byB0aGUgY3VycmVudCBzZXRzIHRvIGRldGVjdCBpbmNvbXBhdGliaWxpdHkuCisgICAgICAgICAgICAvLyBUaGlzIGlzIGluIGNhc2UgdGhlcmUncyBhIGNoYW5nZSB0aGF0J3MgdG9vIGhhcmQgdG8gZG8gaW5jcmVtZW50YWxseS4gSW4gdGhpcyBjYXNlCisgICAgICAgICAgICAvLyB3ZSdsbCBzaW1wbHkgcmV2ZXJ0IHRvIGZ1bGwgYnVpbGQuCisgICAgICAgICAgICBMaXN0PEFzc2V0U2V0PiBhc3NldFNldHMgPSBnZXRJbnB1dEFzc2V0U2V0cygpCisKKyAgICAgICAgICAgIGlmICghbWVyZ2VyLmNoZWNrVmFsaWRVcGRhdGUoYXNzZXRTZXRzKSkgeworICAgICAgICAgICAgICAgIHByb2plY3QubG9nZ2VyLmluZm8oIkNoYW5nZWQgQXNzZXQgc2V0czogZnVsbCB0YXNrIHJ1biEiKQorICAgICAgICAgICAgICAgIGRvRnVsbFRhc2tBY3Rpb24oKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgaW5jcmVtZW50YWwgcHJvY2VzcyBpcyB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgLy8gTG9vcCBvbiBhbGwgdGhlIGNoYW5nZWQgZmlsZXMsIGZpbmQgd2hpY2ggUmVzb3VyY2VTZXQgaXQgYmVsb25ncyB0bywgdGhlbiBhc2sKKyAgICAgICAgICAgIC8vIHRoZSByZXNvdXJjZSBzZXQgdG8gdXBkYXRlIGl0c2VsZiB3aXRoIHRoZSBuZXcgZmlsZS4KKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEZpbGUsIEZpbGVTdGF0dXM+IGVudHJ5IDogY2hhbmdlZElucHV0cy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgRmlsZSBjaGFuZ2VkRmlsZSA9IGVudHJ5LmdldEtleSgpCisKKyAgICAgICAgICAgICAgICBtZXJnZXIuZmluZERhdGFTZXRDb250YWluaW5nKGNoYW5nZWRGaWxlLCBmaWxlVmFsaWRpdHkpCisgICAgICAgICAgICAgICAgaWYgKGZpbGVWYWxpZGl0eS5zdGF0dXMgPT0gRmlsZVZhbGlkaXR5LkZpbGVTdGF0dXMuVU5LTk9XTl9GSUxFKSB7CiAgICAgICAgICAgICAgICAgICAgIGRvRnVsbFRhc2tBY3Rpb24oKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVWYWxpZGl0eS5zdGF0dXMgPT0gRmlsZVZhbGlkaXR5LkZpbGVTdGF0dXMuVkFMSURfRklMRSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVWYWxpZGl0eS5kYXRhU2V0LnVwZGF0ZVdpdGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVZhbGlkaXR5LnNvdXJjZUZpbGUsIGNoYW5nZWRGaWxlLCBlbnRyeS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5sb2dnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmxvZ2dlci5pbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJGYWlsZWQgdG8gcHJvY2VzcyAlcyBldmVudCEgRnVsbCB0YXNrIHJ1biIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBkb0Z1bGxUYXNrQWN0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9CiAKLSAgICAgICAgTWVyZ2VkQXNzZXRXcml0ZXIgd3JpdGVyID0gbmV3IE1lcmdlZEFzc2V0V3JpdGVyKGdldE91dHB1dERpcigpKQorICAgICAgICAgICAgTWVyZ2VkQXNzZXRXcml0ZXIgd3JpdGVyID0gbmV3IE1lcmdlZEFzc2V0V3JpdGVyKGdldE91dHB1dERpcigpKQogCi0gICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtZXJnZXIubWVyZ2VEYXRhKHdyaXRlciwgZmFsc2UgLypkb0NsZWFuVXAqLykKLSAgICAgICAgfSBjYXRjaCAoTWVyZ2VDb25zdW1lci5Db25zdW1lckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBtZXJnZXIuY2xlYW5CbG9iKGdldEluY3JlbWVudGFsRm9sZGVyKCkpCi0gICAgICAgICAgICB0aHJvdyBlLmdldENhdXNlKCkKLSAgICAgICAgfQogCi0gICAgICAgIC8vIE5vIGV4Y2VwdGlvbj8gV3JpdGUgdGhlIGtub3duIHN0YXRlLgotICAgICAgICBtZXJnZXIud3JpdGVCbG9iVG8oZ2V0SW5jcmVtZW50YWxGb2xkZXIoKSwgd3JpdGVyKQorICAgICAgICAgICAgLy8gTm8gZXhjZXB0aW9uPyBXcml0ZSB0aGUga25vd24gc3RhdGUuCisgICAgICAgICAgICBtZXJnZXIud3JpdGVCbG9iVG8oZ2V0SW5jcmVtZW50YWxGb2xkZXIoKSwgd3JpdGVyKQorICAgICAgICB9IGNhdGNoIChNZXJnaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHByaW50bG4gZS5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgIG1lcmdlci5jbGVhbkJsb2IoZ2V0SW5jcmVtZW50YWxGb2xkZXIoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSkKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL01lcmdlUmVzb3VyY2VzLmdyb292eSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL01lcmdlUmVzb3VyY2VzLmdyb292eQppbmRleCBkZjE5ODZjLi5iNjQ4N2RmIDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9NZXJnZVJlc291cmNlcy5ncm9vdnkKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvTWVyZ2VSZXNvdXJjZXMuZ3Jvb3Z5CkBAIC0xNCwxMSArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcworCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLkxpYnJhcnlQbHVnaW4KIGltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwudGFza3MuSW5jcmVtZW50YWxUYXNrCiBpbXBvcnQgY29tLmFuZHJvaWQuaWRlLmNvbW1vbi5yZXMyLkZpbGVTdGF0dXMKIGltcG9ydCBjb20uYW5kcm9pZC5pZGUuY29tbW9uLnJlczIuRmlsZVZhbGlkaXR5Ci1pbXBvcnQgY29tLmFuZHJvaWQuaWRlLmNvbW1vbi5yZXMyLk1lcmdlQ29uc3VtZXIKIGltcG9ydCBjb20uYW5kcm9pZC5pZGUuY29tbW9uLnJlczIuTWVyZ2VkUmVzb3VyY2VXcml0ZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5pZGUuY29tbW9uLnJlczIuTWVyZ2luZ0V4Y2VwdGlvbgogaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5jb21tb24ucmVzMi5SZXNvdXJjZU1lcmdlcgogaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5jb21tb24ucmVzMi5SZXNvdXJjZVNldAogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLklucHV0CkBAIC01NCwxMSArNTYsNiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uPEZpbGU+IGdldE91dHB1dEZvckluY3JlbWVudGFsQnVpbGQoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGdldE91dHB1dERpcigpKQotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGRvRnVsbFRhc2tBY3Rpb24oKSB7CiAgICAgICAgIC8vIHRoaXMgaXMgZnVsbCBydW4sIGNsZWFuIHRoZSBwcmV2aW91cyBvdXRwdXQKICAgICAgICAgRmlsZSBkZXN0aW5hdGlvbkRpciA9IGdldE91dHB1dERpcigpCkBAIC02OSw3OSArNjYsODMgQEAKICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IG1lcmdlciBhbmQgcG9wdWxhdGUgaXQgd2l0aCB0aGUgc2V0cy4KICAgICAgICAgUmVzb3VyY2VNZXJnZXIgbWVyZ2VyID0gbmV3IFJlc291cmNlTWVyZ2VyKCkKIAotICAgICAgICBmb3IgKFJlc291cmNlU2V0IHJlc291cmNlU2V0IDogcmVzb3VyY2VTZXRzKSB7Ci0gICAgICAgICAgICAvLyBzZXQgbmVlZHMgdG8gYmUgbG9hZGVkLgotICAgICAgICAgICAgcmVzb3VyY2VTZXQubG9hZEZyb21GaWxlcyhwbHVnaW4ubG9nZ2VyKQotICAgICAgICAgICAgbWVyZ2VyLmFkZERhdGFTZXQocmVzb3VyY2VTZXQpCi0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIG1lcmdlZCBzZXQgYW5kIHdyaXRlIGl0IGRvd24uCi0gICAgICAgIE1lcmdlZFJlc291cmNlV3JpdGVyIHdyaXRlciA9IG5ldyBNZXJnZWRSZXNvdXJjZVdyaXRlcigKLSAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkRpciwgZ2V0UHJvY2VzczlQYXRjaCgpID8gYnVpbGRlci5hYXB0UnVubmVyIDogbnVsbCkKLQogICAgICAgICB0cnkgewotICAgICAgICAgICAgbWVyZ2VyLm1lcmdlRGF0YSh3cml0ZXIsIGZhbHNlIC8qZG9DbGVhblVwKi8pCi0gICAgICAgIH0gY2F0Y2ggKE1lcmdlQ29uc3VtZXIuQ29uc3VtZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbWVyZ2VyLmNsZWFuQmxvYihnZXRJbmNyZW1lbnRhbEZvbGRlcigpKQotICAgICAgICAgICAgdGhyb3cgZS5nZXRDYXVzZSgpCi0gICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgOiByZXNvdXJjZVNldHMpIHsKKyAgICAgICAgICAgICAgICAvLyBzZXQgbmVlZHMgdG8gYmUgbG9hZGVkLgorICAgICAgICAgICAgICAgIHJlc291cmNlU2V0LmxvYWRGcm9tRmlsZXMocGx1Z2luLmxvZ2dlcikKKyAgICAgICAgICAgICAgICBtZXJnZXIuYWRkRGF0YVNldChyZXNvdXJjZVNldCkKKyAgICAgICAgICAgIH0KIAotICAgICAgICAvLyBObyBleGNlcHRpb24/IFdyaXRlIHRoZSBrbm93biBzdGF0ZS4KLSAgICAgICAgbWVyZ2VyLndyaXRlQmxvYlRvKGdldEluY3JlbWVudGFsRm9sZGVyKCksIHdyaXRlcikKKyAgICAgICAgICAgIC8vIGdldCB0aGUgbWVyZ2VkIHNldCBhbmQgd3JpdGUgaXQgZG93bi4KKyAgICAgICAgICAgIE1lcmdlZFJlc291cmNlV3JpdGVyIHdyaXRlciA9IG5ldyBNZXJnZWRSZXNvdXJjZVdyaXRlcigKKyAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25EaXIsIGdldFByb2Nlc3M5UGF0Y2goKSA/IGJ1aWxkZXIuYWFwdFJ1bm5lciA6IG51bGwpCisgICAgICAgICAgICB3cml0ZXIuc2V0SW5zZXJ0U291cmNlTWFya2VycyhidWlsZGVyLmlzSW5zZXJ0U291cmNlTWFya2VycygpKQorCisgICAgICAgICAgICBtZXJnZXIubWVyZ2VEYXRhKHdyaXRlciwgZmFsc2UgLypkb0NsZWFuVXAqLykKKworICAgICAgICAgICAgLy8gTm8gZXhjZXB0aW9uPyBXcml0ZSB0aGUga25vd24gc3RhdGUuCisgICAgICAgICAgICBtZXJnZXIud3JpdGVCbG9iVG8oZ2V0SW5jcmVtZW50YWxGb2xkZXIoKSwgd3JpdGVyKQorICAgICAgICB9IGNhdGNoIChNZXJnaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHByaW50bG4gZS5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgIG1lcmdlci5jbGVhbkJsb2IoZ2V0SW5jcmVtZW50YWxGb2xkZXIoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSkKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGRvSW5jcmVtZW50YWxUYXNrQWN0aW9uKE1hcDxGaWxlLCBGaWxlU3RhdHVzPiBjaGFuZ2VkSW5wdXRzKSB7CiAgICAgICAgIC8vIGNyZWF0ZSBhIG1lcmdlciBhbmQgbG9hZCB0aGUga25vd24gc3RhdGUuCiAgICAgICAgIFJlc291cmNlTWVyZ2VyIG1lcmdlciA9IG5ldyBSZXNvdXJjZU1lcmdlcigpCi0gICAgICAgIGlmICghbWVyZ2VyLmxvYWRGcm9tQmxvYihnZXRJbmNyZW1lbnRhbEZvbGRlcigpLCB0cnVlIC8qaW5jcmVtZW50YWxTdGF0ZSovKSkgewotICAgICAgICAgICAgZG9GdWxsVGFza0FjdGlvbigpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbXBhcmUgdGhlIGtub3duIHN0YXRlIHRvIHRoZSBjdXJyZW50IHNldHMgdG8gZGV0ZWN0IGluY29tcGF0aWJpbGl0eS4KLSAgICAgICAgLy8gVGhpcyBpcyBpbiBjYXNlIHRoZXJlJ3MgYSBjaGFuZ2UgdGhhdCdzIHRvbyBoYXJkIHRvIGRvIGluY3JlbWVudGFsbHkuIEluIHRoaXMgY2FzZQotICAgICAgICAvLyB3ZSdsbCBzaW1wbHkgcmV2ZXJ0IHRvIGZ1bGwgYnVpbGQuCi0gICAgICAgIExpc3Q8UmVzb3VyY2VTZXQ+IHJlc291cmNlU2V0cyA9IGdldElucHV0UmVzb3VyY2VTZXRzKCkKLQotICAgICAgICBpZiAoIW1lcmdlci5jaGVja1ZhbGlkVXBkYXRlKHJlc291cmNlU2V0cykpIHsKLSAgICAgICAgICAgIHByb2plY3QubG9nZ2VyLmluZm8oIkNoYW5nZWQgUmVzb3VyY2Ugc2V0czogZnVsbCB0YXNrIHJ1biEiKQotICAgICAgICAgICAgZG9GdWxsVGFza0FjdGlvbigpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSBpbmNyZW1lbnRhbCBwcm9jZXNzIGlzIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIC8vIExvb3Agb24gYWxsIHRoZSBjaGFuZ2VkIGZpbGVzLCBmaW5kIHdoaWNoIFJlc291cmNlU2V0IGl0IGJlbG9uZ3MgdG8sIHRoZW4gYXNrCi0gICAgICAgIC8vIHRoZSByZXNvdXJjZSBzZXQgdG8gdXBkYXRlIGl0c2VsZiB3aXRoIHRoZSBuZXcgZmlsZS4KLSAgICAgICAgZm9yIChNYXAuRW50cnk8RmlsZSwgRmlsZVN0YXR1cz4gZW50cnkgOiBjaGFuZ2VkSW5wdXRzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIEZpbGUgY2hhbmdlZEZpbGUgPSBlbnRyeS5nZXRLZXkoKQotCi0gICAgICAgICAgICBtZXJnZXIuZmluZERhdGFTZXRDb250YWluaW5nKGNoYW5nZWRGaWxlLCBmaWxlVmFsaWRpdHkpCi0gICAgICAgICAgICBpZiAoZmlsZVZhbGlkaXR5LnN0YXR1cyA9PSBGaWxlVmFsaWRpdHkuRmlsZVN0YXR1cy5VTktOT1dOX0ZJTEUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghbWVyZ2VyLmxvYWRGcm9tQmxvYihnZXRJbmNyZW1lbnRhbEZvbGRlcigpLCB0cnVlIC8qaW5jcmVtZW50YWxTdGF0ZSovKSkgewogICAgICAgICAgICAgICAgIGRvRnVsbFRhc2tBY3Rpb24oKQogICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlVmFsaWRpdHkuc3RhdHVzID09IEZpbGVWYWxpZGl0eS5GaWxlU3RhdHVzLlZBTElEX0ZJTEUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZpbGVWYWxpZGl0eS5kYXRhU2V0LnVwZGF0ZVdpdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlVmFsaWRpdHkuc291cmNlRmlsZSwgY2hhbmdlZEZpbGUsIGVudHJ5LmdldFZhbHVlKCksIHBsdWdpbi5sb2dnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QubG9nZ2VyLmluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIHByb2Nlc3MgJXMgZXZlbnQhIEZ1bGwgdGFzayBydW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoKSkpCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvbXBhcmUgdGhlIGtub3duIHN0YXRlIHRvIHRoZSBjdXJyZW50IHNldHMgdG8gZGV0ZWN0IGluY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgaW4gY2FzZSB0aGVyZSdzIGEgY2hhbmdlIHRoYXQncyB0b28gaGFyZCB0byBkbyBpbmNyZW1lbnRhbGx5LiBJbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIC8vIHdlJ2xsIHNpbXBseSByZXZlcnQgdG8gZnVsbCBidWlsZC4KKyAgICAgICAgICAgIExpc3Q8UmVzb3VyY2VTZXQ+IHJlc291cmNlU2V0cyA9IGdldElucHV0UmVzb3VyY2VTZXRzKCkKKworICAgICAgICAgICAgaWYgKCFtZXJnZXIuY2hlY2tWYWxpZFVwZGF0ZShyZXNvdXJjZVNldHMpKSB7CisgICAgICAgICAgICAgICAgcHJvamVjdC5sb2dnZXIuaW5mbygiQ2hhbmdlZCBSZXNvdXJjZSBzZXRzOiBmdWxsIHRhc2sgcnVuISIpCisgICAgICAgICAgICAgICAgZG9GdWxsVGFza0FjdGlvbigpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoZSBpbmNyZW1lbnRhbCBwcm9jZXNzIGlzIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAvLyBMb29wIG9uIGFsbCB0aGUgY2hhbmdlZCBmaWxlcywgZmluZCB3aGljaCBSZXNvdXJjZVNldCBpdCBiZWxvbmdzIHRvLCB0aGVuIGFzaworICAgICAgICAgICAgLy8gdGhlIHJlc291cmNlIHNldCB0byB1cGRhdGUgaXRzZWxmIHdpdGggdGhlIG5ldyBmaWxlLgorICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8RmlsZSwgRmlsZVN0YXR1cz4gZW50cnkgOiBjaGFuZ2VkSW5wdXRzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGNoYW5nZWRGaWxlID0gZW50cnkuZ2V0S2V5KCkKKworICAgICAgICAgICAgICAgIG1lcmdlci5maW5kRGF0YVNldENvbnRhaW5pbmcoY2hhbmdlZEZpbGUsIGZpbGVWYWxpZGl0eSkKKyAgICAgICAgICAgICAgICBpZiAoZmlsZVZhbGlkaXR5LnN0YXR1cyA9PSBGaWxlVmFsaWRpdHkuRmlsZVN0YXR1cy5VTktOT1dOX0ZJTEUpIHsKICAgICAgICAgICAgICAgICAgICAgZG9GdWxsVGFza0FjdGlvbigpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZVZhbGlkaXR5LnN0YXR1cyA9PSBGaWxlVmFsaWRpdHkuRmlsZVN0YXR1cy5WQUxJRF9GSUxFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZVZhbGlkaXR5LmRhdGFTZXQudXBkYXRlV2l0aCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVmFsaWRpdHkuc291cmNlRmlsZSwgY2hhbmdlZEZpbGUsIGVudHJ5LmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmxvZ2dlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QubG9nZ2VyLmluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkZhaWxlZCB0byBwcm9jZXNzICVzIGV2ZW50ISBGdWxsIHRhc2sgcnVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvRnVsbFRhc2tBY3Rpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KIAotICAgICAgICBNZXJnZWRSZXNvdXJjZVdyaXRlciB3cml0ZXIgPSBuZXcgTWVyZ2VkUmVzb3VyY2VXcml0ZXIoCi0gICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyKCksIGdldFByb2Nlc3M5UGF0Y2goKSA/IGJ1aWxkZXIuYWFwdFJ1bm5lciA6IG51bGwpCi0gICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXJnZWRSZXNvdXJjZVdyaXRlciB3cml0ZXIgPSBuZXcgTWVyZ2VkUmVzb3VyY2VXcml0ZXIoCisgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcigpLCBnZXRQcm9jZXNzOVBhdGNoKCkgPyBidWlsZGVyLmFhcHRSdW5uZXIgOiBudWxsKQorICAgICAgICAgICAgd3JpdGVyLnNldEluc2VydFNvdXJjZU1hcmtlcnMoYnVpbGRlci5pc0luc2VydFNvdXJjZU1hcmtlcnMoKSkKICAgICAgICAgICAgIG1lcmdlci5tZXJnZURhdGEod3JpdGVyLCBmYWxzZSAvKmRvQ2xlYW5VcCovKQotICAgICAgICB9IGNhdGNoIChNZXJnZUNvbnN1bWVyLkNvbnN1bWVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIE5vIGV4Y2VwdGlvbj8gV3JpdGUgdGhlIGtub3duIHN0YXRlLgorICAgICAgICAgICAgbWVyZ2VyLndyaXRlQmxvYlRvKGdldEluY3JlbWVudGFsRm9sZGVyKCksIHdyaXRlcikKKyAgICAgICAgfSBjYXRjaCAoTWVyZ2luZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBwcmludGxuIGUuZ2V0TWVzc2FnZSgpCiAgICAgICAgICAgICBtZXJnZXIuY2xlYW5CbG9iKGdldEluY3JlbWVudGFsRm9sZGVyKCkpCi0gICAgICAgICAgICB0aHJvdyBlLmdldENhdXNlKCkKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSkKICAgICAgICAgfQotCi0gICAgICAgIC8vIE5vIGV4Y2VwdGlvbj8gV3JpdGUgdGhlIGtub3duIHN0YXRlLgotICAgICAgICBtZXJnZXIud3JpdGVCbG9iVG8oZ2V0SW5jcmVtZW50YWxGb2xkZXIoKSwgd3JpdGVyKQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL05ka0NvbXBpbGUuZ3Jvb3Z5IGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvTmRrQ29tcGlsZS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJhOGQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL05ka0NvbXBpbGUuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUudGFza3MKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5Ob25OdWxsCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLnRhc2tzLk5ka1Rhc2sKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZGVyLm1vZGVsLk5ka0NvbmZpZworaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5JQW5kcm9pZFRhcmdldAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcgoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHMKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5GaWxlcworaW1wb3J0IG9yZy5ncmFkbGUuYXBpLkdyYWRsZUV4Y2VwdGlvbgoraW1wb3J0IG9yZy5ncmFkbGUuYXBpLmZpbGUuRmlsZVRyZWUKK2ltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5JbnB1dAoraW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLklucHV0RmlsZXMKK2ltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5PdXRwdXREaXJlY3RvcnkKK2ltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5PdXRwdXRGaWxlCitpbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuVGFza0FjdGlvbgoraW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLmluY3JlbWVudGFsLkluY3JlbWVudGFsVGFza0lucHV0cworaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLnV0aWwuUGF0dGVyblNldAorLyoqCisgKi8KK2NsYXNzIE5ka0NvbXBpbGUgZXh0ZW5kcyBOZGtUYXNrIHsKKworICAgIExpc3Q8RmlsZT4gc291cmNlRm9sZGVycworCisgICAgQE91dHB1dEZpbGUKKyAgICBGaWxlIGdlbmVyYXRlZE1ha2VmaWxlCisKKyAgICBASW5wdXQKKyAgICBib29sZWFuIGRlYnVnZ2FibGUKKworICAgIEBPdXRwdXREaXJlY3RvcnkKKyAgICBGaWxlIHNvRm9sZGVyCisKKyAgICBAT3V0cHV0RGlyZWN0b3J5CisgICAgRmlsZSBvYmpGb2xkZXIKKworICAgIEBJbnB1dAorICAgIGJvb2xlYW4gbmRrUmVuZGVyU2NyaXB0TW9kZQorCisgICAgQElucHV0RmlsZXMKKyAgICBGaWxlVHJlZSBnZXRTb3VyY2UoKSB7CisgICAgICAgIEZpbGVUcmVlIHNyYyA9IG51bGwKKyAgICAgICAgTGlzdDxGaWxlPiBzb3VyY2VzID0gZ2V0U291cmNlRm9sZGVycygpCisgICAgICAgIGlmICghc291cmNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNyYyA9IGdldFByb2plY3QoKS5maWxlcyhuZXcgQXJyYXlMaXN0PE9iamVjdD4oc291cmNlcykpLmdldEFzRmlsZVRyZWUoKQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzcmMgPT0gbnVsbCA/IGdldFByb2plY3QoKS5maWxlcygpLmdldEFzRmlsZVRyZWUoKSA6IHNyYworICAgIH0KKworICAgIEBUYXNrQWN0aW9uCisgICAgdm9pZCB0YXNrQWN0aW9uKEluY3JlbWVudGFsVGFza0lucHV0cyBpbnB1dHMpIHsKKworICAgICAgICBGaWxlVHJlZSBzb3VyY2VGaWxlVHJlZSA9IGdldFNvdXJjZSgpCisgICAgICAgIFNldDxGaWxlPiBzb3VyY2VGaWxlcyA9IHNvdXJjZUZpbGVUcmVlLm1hdGNoaW5nKG5ldyBQYXR0ZXJuU2V0KCkuZXhjbHVkZSgiKiovKi5oIikpLmZpbGVzCisgICAgICAgIEZpbGUgbWFrZWZpbGUgPSBnZXRHZW5lcmF0ZWRNYWtlZmlsZSgpCisKKyAgICAgICAgaWYgKHNvdXJjZUZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbWFrZWZpbGUuZGVsZXRlKCkKKyAgICAgICAgICAgIGVtcHR5Rm9sZGVyKGdldFNvRm9sZGVyKCkpCisgICAgICAgICAgICBlbXB0eUZvbGRlcihnZXRPYmpGb2xkZXIoKSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB9CisKKyAgICAgICAgRmlsZSBuZGtEaXJlY3RvcnkgPSBnZXRQbHVnaW4oKS5uZGtEaXJlY3RvcnkKKyAgICAgICAgaWYgKG5ka0RpcmVjdG9yeSA9PSBudWxsIHx8ICFuZGtEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWRsZUV4Y2VwdGlvbigiTkRLIG5vdCBjb25maWd1cmVkIikKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZ2VuZXJhdGVNYWtlZmlsZSA9IGZhbHNlCisKKyAgICAgICAgaWYgKCFpbnB1dHMuaXNJbmNyZW1lbnRhbCgpKSB7CisgICAgICAgICAgICBwcm9qZWN0LmxvZ2dlci5pbmZvKCJVbmFibGUgZG8gaW5jcmVtZW50YWwgZXhlY3V0aW9uOiBmdWxsIHRhc2sgcnVuIikKKyAgICAgICAgICAgIGdlbmVyYXRlTWFrZWZpbGUgPSB0cnVlCisgICAgICAgICAgICBlbXB0eUZvbGRlcihnZXRTb0ZvbGRlcigpKQorICAgICAgICAgICAgZW1wdHlGb2xkZXIoZ2V0T2JqRm9sZGVyKCkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBsb29rIGZvciBhZGRlZCBvciByZW1vdmVkIGZpbGVzICpvbmx5KgorCisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBHcm9vdnlBc3NpZ25hYmlsaXR5Q2hlY2sKKyAgICAgICAgICAgIGlucHV0cy5vdXRPZkRhdGUgeyBjaGFuZ2UgLT4KKyAgICAgICAgICAgICAgICBpZiAoY2hhbmdlLmlzQWRkZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZU1ha2VmaWxlID0gdHJ1ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gR3Jvb3Z5QXNzaWduYWJpbGl0eUNoZWNrCisgICAgICAgICAgICBpbnB1dHMucmVtb3ZlZCB7IGNoYW5nZSAtPgorICAgICAgICAgICAgICAgIGdlbmVyYXRlTWFrZWZpbGUgPSB0cnVlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2VuZXJhdGVNYWtlZmlsZSkgeworICAgICAgICAgICAgd3JpdGVNYWtlZmlsZShzb3VyY2VGaWxlcywgbWFrZWZpbGUpCisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgYnVpbGQKKyAgICAgICAgcnVuTmRrQnVpbGQobmRrRGlyZWN0b3J5LCBtYWtlZmlsZSkKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVNYWtlZmlsZShATm9uTnVsbCBTZXQ8RmlsZT4gc291cmNlRmlsZXMsIEBOb25OdWxsIEZpbGUgbWFrZWZpbGUpIHsKKyAgICAgICAgTmRrQ29uZmlnIG5kayA9IGdldE5ka0NvbmZpZygpCisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCkKKworICAgICAgICBzYi5hcHBlbmQoCisgICAgICAgICAgICAgICAgJ0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcilcbicgKworICAgICAgICAgICAgICAgICdpbmNsdWRlIFwkKENMRUFSX1ZBUlMpXG5cbicpCisKKyAgICAgICAgc2IuYXBwZW5kKCdMT0NBTF9NT0RVTEUgOj0gJykuYXBwZW5kKG5kay5tb2R1bGVOYW1lICE9IG51bGwgPyBuZGsubW9kdWxlTmFtZSA6IHByb2plY3QubmFtZSkuYXBwZW5kKCdcbicpCisKKyAgICAgICAgaWYgKG5kay5jRmxhZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCdMT0NBTF9DRkxBR1MgOj0gJykuYXBwZW5kKG5kay5jRmxhZ3MpLmFwcGVuZCgnXG4nKQorICAgICAgICB9CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IGZ1bGxMZGxpYnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKQorICAgICAgICBpZiAobmRrLmxkTGlicyAhPSBudWxsKSB7CisgICAgICAgICAgICBmdWxsTGRsaWJzLmFkZEFsbChuZGsubGRMaWJzKQorICAgICAgICB9CisgICAgICAgIGlmIChnZXROZGtSZW5kZXJTY3JpcHRNb2RlKCkpIHsKKyAgICAgICAgICAgIGZ1bGxMZGxpYnMuYWRkKCJkbCIpCisgICAgICAgICAgICBmdWxsTGRsaWJzLmFkZCgibG9nIikKKyAgICAgICAgICAgIGZ1bGxMZGxpYnMuYWRkKCJqbmlncmFwaGljcyIpCisgICAgICAgICAgICBmdWxsTGRsaWJzLmFkZCgiUlNjcHBfc3RhdGljIikKKyAgICAgICAgICAgIGZ1bGxMZGxpYnMuYWRkKCJjdXRpbHMiKQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmdWxsTGRsaWJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCdMT0NBTF9MRExJQlMgOj0gXFxcbicpCisgICAgICAgICAgICBmb3IgKFN0cmluZyBsaWIgOiBmdWxsTGRsaWJzKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcdC1sJykgLmFwcGVuZChsaWIpLmFwcGVuZCgnIFxcXG4nKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpCisgICAgICAgIH0KKworICAgICAgICBzYi5hcHBlbmQoJ0xPQ0FMX1NSQ19GSUxFUyA6PSBcXFxuJykKKyAgICAgICAgZm9yIChGaWxlIHNvdXJjZUZpbGUgOiBzb3VyY2VGaWxlcykgeworICAgICAgICAgICAgc2IuYXBwZW5kKCdcdCcpLmFwcGVuZChzb3VyY2VGaWxlLmFic29sdXRlUGF0aCkuYXBwZW5kKCcgXFxcbicpCisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCdcbicpCisKKyAgICAgICAgZm9yIChGaWxlIHNvdXJjZUZvbGRlciA6IGdldFNvdXJjZUZvbGRlcnMoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJMT0NBTF9DX0lOQ0xVREVTICs9ICR7c291cmNlRm9sZGVyLmFic29sdXRlUGF0aH1cbiIpCisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0TmRrUmVuZGVyU2NyaXB0TW9kZSgpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoJ0xPQ0FMX0xERkxBR1MgKz0gLUwkKGNhbGwgaG9zdC1wYXRoLCQoVEFSR0VUX0NfSU5DTFVERVMpLy4uL2xpYi9ycylcbicpCisKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnTE9DQUxfQ19JTkNMVURFUyArPSAkKFRBUkdFVF9DX0lOQ0xVREVTKS9ycy9jcHBcbicpCisgICAgICAgICAgICBzYi5hcHBlbmQoJ0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUQVJHRVRfQ19JTkNMVURFUykvcnNcbicpCisgICAgICAgICAgICBzYi5hcHBlbmQoJ0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUQVJHRVRfT0JKUykvJChMT0NBTF9NT0RVTEUpXG4nKQorICAgICAgICB9CisKKyAgICAgICAgc2IuYXBwZW5kKAorICAgICAgICAgICAgICAgICdcbmluY2x1ZGUgXCQoQlVJTERfU0hBUkVEX0xJQlJBUlkpXG4nKQorCisgICAgICAgIEZpbGVzLndyaXRlKHNiLnRvU3RyaW5nKCksIG1ha2VmaWxlLCBDaGFyc2V0cy5VVEZfOCkKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuTmRrQnVpbGQoQE5vbk51bGwgRmlsZSBuZGtMb2NhdGlvbiwgQE5vbk51bGwgRmlsZSBtYWtlZmlsZSkgeworICAgICAgICBOZGtDb25maWcgbmRrID0gZ2V0TmRrQ29uZmlnKCkKKworICAgICAgICBMaXN0PFN0cmluZz4gY29tbWFuZHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKQorCisgICAgICAgIGNvbW1hbmRzLmFkZChuZGtMb2NhdGlvbi5hYnNvbHV0ZVBhdGggKyBGaWxlLnNlcGFyYXRvciArICJuZGstYnVpbGQiKQorCisgICAgICAgIGNvbW1hbmRzLmFkZCgiTkRLX1BST0pFQ1RfUEFUSD1udWxsIikKKworICAgICAgICBjb21tYW5kcy5hZGQoIkFQUF9CVUlMRF9TQ1JJUFQ9IiArIG1ha2VmaWxlLmFic29sdXRlUGF0aCkKKworICAgICAgICAvLyB0YXJnZXQKKyAgICAgICAgSUFuZHJvaWRUYXJnZXQgdGFyZ2V0ID0gZ2V0UGx1Z2luKCkubG9hZGVkU2RrUGFyc2VyLnRhcmdldAorICAgICAgICBpZiAoIXRhcmdldC5pc1BsYXRmb3JtKCkpIHsKKyAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnQKKyAgICAgICAgfQorICAgICAgICBjb21tYW5kcy5hZGQoIkFQUF9QTEFURk9STT0iICsgdGFyZ2V0Lmhhc2hTdHJpbmcoKSkKKworICAgICAgICAvLyB0ZW1wIG91dAorICAgICAgICBjb21tYW5kcy5hZGQoIk5ES19PVVQ9IiArIGdldE9iakZvbGRlcigpLmFic29sdXRlUGF0aCkKKworICAgICAgICAvLyBsaWJzIG91dAorICAgICAgICBjb21tYW5kcy5hZGQoIk5ES19MSUJTX09VVD0iICsgZ2V0U29Gb2xkZXIoKS5hYnNvbHV0ZVBhdGgpCisKKyAgICAgICAgLy8gZGVidWcgYnVpbGRzCisgICAgICAgIGlmIChnZXREZWJ1Z2dhYmxlKCkpIHsKKyAgICAgICAgICAgIGNvbW1hbmRzLmFkZCgiTkRLX0RFQlVHPTEiKQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5kay5nZXRTdGwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb21tYW5kcy5hZGQoIkFQUF9TVEw9IiArIG5kay5nZXRTdGwoKSkKKyAgICAgICAgfQorCisgICAgICAgIFNldDxTdHJpbmc+IGFiaUZpbHRlcnMgPSBuZGsuYWJpRmlsdGVycworICAgICAgICBpZiAoYWJpRmlsdGVycyAhPSBudWxsICYmICFhYmlGaWx0ZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKGFiaUZpbHRlcnMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kcy5hZGQoIkFQUF9BQkk9IiArIGFiaUZpbHRlcnMuaXRlcmF0b3IoKS5uZXh0KCkpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEpvaW5lciBqb2luZXIgPSBKb2luZXIub24oJywnKS5za2lwTnVsbHMoKQorICAgICAgICAgICAgICAgIGNvbW1hbmRzLmFkZCgiQVBQX0FCST0iICsgam9pbmVyLmpvaW4oYWJpRmlsdGVycy5pdGVyYXRvcigpKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbW1hbmRzLmFkZCgiQVBQX0FCST1hbGwiKQorICAgICAgICB9CisKKyAgICAgICAgZ2V0QnVpbGRlcigpLmNvbW1hbmRMaW5lUnVubmVyLnJ1bkNtZExpbmUoY29tbWFuZHMsIG51bGwpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvUGFja2FnZUFwcGxpY2F0aW9uLmdyb292eSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL1BhY2thZ2VBcHBsaWNhdGlvbi5ncm9vdnkKaW5kZXggNTQ5ZDc2NS4uZGU2ZDE1OSAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvUGFja2FnZUFwcGxpY2F0aW9uLmdyb292eQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9QYWNrYWdlQXBwbGljYXRpb24uZ3Jvb3Z5CkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLnRhc2tzLkluY3JlbWVudGFsVGFzawogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS5pbnRlcm5hbC50YXNrcy5PdXRwdXRGaWxlVGFzawogaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIucGFja2FnaW5nLkR1cGxpY2F0ZUZpbGVFeGNlcHRpb24KK2ltcG9ydCBvcmcuZ3JhZGxlLmFwaS5maWxlLkZpbGVUcmVlCiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuSW5wdXQKIGltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5JbnB1dERpcmVjdG9yeQogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLklucHV0RmlsZQpAQCAtNDEsMTIgKzQyLDE0IEBACiAgICAgQElucHV0RGlyZWN0b3J5IEBPcHRpb25hbAogICAgIEZpbGUgamF2YVJlc291cmNlRGlyCiAKLSAgICBASW5wdXREaXJlY3RvcnkgQE9wdGlvbmFsCi0gICAgRmlsZSBqbmlEaXIKKyAgICBTZXQ8RmlsZT4gam5pRm9sZGVycwogCiAgICAgQE91dHB1dEZpbGUKICAgICBGaWxlIG91dHB1dEZpbGUKIAorICAgIEBJbnB1dCBAT3B0aW9uYWwKKyAgICBTZXQ8U3RyaW5nPiBhYmlGaWx0ZXJzCisKICAgICAvLyAtLS0tLSBQUklWQVRFIFRBU0sgQVBJIC0tLS0tCiAKICAgICBASW5wdXRGaWxlcwpAQCAtNTgsNiArNjEsMTYgQEAKICAgICBATmVzdGVkIEBPcHRpb25hbAogICAgIFNpZ25pbmdDb25maWdEc2wgc2lnbmluZ0NvbmZpZwogCisgICAgQElucHV0RmlsZXMKKyAgICBwdWJsaWMgRmlsZVRyZWUgZ2V0TmF0aXZlTGlicmFyaWVzKCkgeworICAgICAgICBGaWxlVHJlZSBzcmMgPSBudWxsCisgICAgICAgIFNldDxGaWxlPiBmb2xkZXJzID0gZ2V0Sm5pRm9sZGVycygpCisgICAgICAgIGlmICghZm9sZGVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNyYyA9IGdldFByb2plY3QoKS5maWxlcyhuZXcgQXJyYXlMaXN0PE9iamVjdD4oZm9sZGVycykpLmdldEFzRmlsZVRyZWUoKQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzcmMgPT0gbnVsbCA/IGdldFByb2plY3QoKS5maWxlcygpLmdldEFzRmlsZVRyZWUoKSA6IHNyYworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGRvRnVsbFRhc2tBY3Rpb24oKSB7CiAgICAgICAgIHRyeSB7CkBAIC02Niw3ICs3OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGdldERleEZpbGUoKS5hYnNvbHV0ZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgIGdldFBhY2thZ2VkSmFycygpLAogICAgICAgICAgICAgICAgICAgICBnZXRKYXZhUmVzb3VyY2VEaXIoKT8uYWJzb2x1dGVQYXRoLAotICAgICAgICAgICAgICAgICAgICBnZXRKbmlEaXIoKT8uYWJzb2x1dGVQYXRoLAorICAgICAgICAgICAgICAgICAgICBnZXRKbmlGb2xkZXJzKCksCisgICAgICAgICAgICAgICAgICAgIGdldEFiaUZpbHRlcnMoKSwKICAgICAgICAgICAgICAgICAgICAgZ2V0Sm5pRGVidWdCdWlsZCgpLAogICAgICAgICAgICAgICAgICAgICBnZXRTaWduaW5nQ29uZmlnKCksCiAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dEZpbGUoKS5hYnNvbHV0ZVBhdGgpCkBAIC04MSw1ICs5NSw0IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwogICAgICAgICB9CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9QcmVEZXguZ3Jvb3Z5IGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvUHJlRGV4Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTQ2NGZlCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvUHJlRGV4Lmdyb292eQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrcworaW1wb3J0IGNvbS5hbmRyb2lkLlNka0NvbnN0YW50cworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGwKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwuZHNsLkRleE9wdGlvbnNJbXBsCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLnRhc2tzLkJhc2VUYXNrCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGRlci5BbmRyb2lkQnVpbGRlcgoraW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIuRGV4T3B0aW9ucworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmhhc2guSGFzaENvZGUKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5oYXNoLkhhc2hGdW5jdGlvbgoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmhhc2guSGFzaGluZworaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLklucHV0RmlsZXMKK2ltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5OZXN0ZWQKK2ltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5PdXRwdXREaXJlY3RvcnkKK2ltcG9ydCBvcmcuZ3JhZGxlLmFwaS50YXNrcy5UYXNrQWN0aW9uCitpbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuaW5jcmVtZW50YWwuSW5jcmVtZW50YWxUYXNrSW5wdXRzCisKK3B1YmxpYyBjbGFzcyBQcmVEZXggZXh0ZW5kcyBCYXNlVGFzayB7CisKKyAgICAvLyAtLS0tLSBQVUJMSUMgVEFTSyBBUEkgLS0tLS0KKworICAgIC8vIC0tLS0tIFBSSVZBVEUgVEFTSyBBUEkgLS0tLS0KKworICAgIC8vIHRoaXMgaXMgdXNlZCBhdXRvbWF0aWNhbGx5IGJ5IEdyYWRsZSwgZXZlbiB0aG91Z2ggbm90aGluZworICAgIC8vIGluIHRoZSBjbGFzcyB1c2VzIGl0LgorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJHcm9vdnlVbnVzZWREZWNsYXJhdGlvbiIpCisgICAgQElucHV0RmlsZXMKKyAgICBJdGVyYWJsZTxGaWxlPiBpbnB1dEZpbGVzCisKKyAgICBAT3V0cHV0RGlyZWN0b3J5CisgICAgRmlsZSBvdXRwdXRGb2xkZXIKKworICAgIEBOZXN0ZWQKKyAgICBEZXhPcHRpb25zSW1wbCBkZXhPcHRpb25zCisKKyAgICBAVGFza0FjdGlvbgorICAgIHZvaWQgdGFza0FjdGlvbihJbmNyZW1lbnRhbFRhc2tJbnB1dHMgdGFza0lucHV0cykgeworICAgICAgICBmaW5hbCBGaWxlIG91dEZvbGRlciA9IGdldE91dHB1dEZvbGRlcigpCisgICAgICAgIGZpbmFsIERleE9wdGlvbnMgb3B0aW9ucyA9IGdldERleE9wdGlvbnMoKQorCisgICAgICAgIC8vIGlmIHdlIGFyZSBub3QgaW4gaW5jcmVtZW50YWwgbW9kZSwgdGhlbiBvdXRPZkRhdGUgd2lsbCBjb250YWluCisgICAgICAgIC8vIGFsbCB0aCBmaWxlcywgYnV0IGZpcnN0IHdlIG5lZWQgdG8gZGVsZXRlIHRoZSBwcmV2aW91cyBvdXRwdXQKKyAgICAgICAgaWYgKCF0YXNrSW5wdXRzLmlzSW5jcmVtZW50YWwoKSkgeworICAgICAgICAgICAgZW1wdHlGb2xkZXIob3V0Rm9sZGVyKQorICAgICAgICB9CisKKyAgICAgICAgQW5kcm9pZEJ1aWxkZXIgYnVpbGRlciA9IGdldEJ1aWxkZXIoKQorCisgICAgICAgIHRhc2tJbnB1dHMub3V0T2ZEYXRlIHsgY2hhbmdlIC0+CisKKyAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIEdyb292eUFzc2lnbmFiaWxpdHlDaGVjaworICAgICAgICAgICAgRmlsZSBwcmVEZXhlZEZpbGUgPSBnZXREZXhGaWxlTmFtZShvdXRGb2xkZXIsIGNoYW5nZS5maWxlKQorICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gR3Jvb3Z5QXNzaWduYWJpbGl0eUNoZWNrCisgICAgICAgICAgICBidWlsZGVyLnByZURleExpYnJhcnkoY2hhbmdlLmZpbGUsIHByZURleGVkRmlsZSwgb3B0aW9ucykKKyAgICAgICAgfQorCisgICAgICAgIHRhc2tJbnB1dHMucmVtb3ZlZCB7IGNoYW5nZSAtPgorICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gR3Jvb3Z5QXNzaWduYWJpbGl0eUNoZWNrCisgICAgICAgICAgICBGaWxlIHByZURleGVkRmlsZSA9IGdldERleEZpbGVOYW1lKG91dEZvbGRlciwgY2hhbmdlLmZpbGUpCisgICAgICAgICAgICBwcmVEZXhlZEZpbGUuZGVsZXRlKCkKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB1bmlxdWUgRmlsZSBmb3IgdGhlIHByZS1kZXhlZCBsaWJyYXJ5LCBldmVuCisgICAgICogaWYgdGhlcmUgYXJlIDIgbGlicmFyaWVzIHdpdGggdGhlIHNhbWUgZmlsZSBuYW1lcyAoYnV0IGRpZmZlcmVudAorICAgICAqIHBhdGhzKQorICAgICAqCisgICAgICogQHBhcmFtIG91dEZvbGRlcgorICAgICAqIEBwYXJhbSBpbnB1dEZpbGUgdGhlIGxpYnJhcnkKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGdldERleEZpbGVOYW1lKEBOb25OdWxsIEZpbGUgb3V0Rm9sZGVyLCBATm9uTnVsbCBGaWxlIGlucHV0RmlsZSkgeworICAgICAgICAvLyBnZXQgdGhlIGZpbGVuYW1lCisgICAgICAgIFN0cmluZyBuYW1lID0gaW5wdXRGaWxlLmdldE5hbWUoKTsKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSBleHRlbnNpb24KKyAgICAgICAgaW50IHBvcyA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKHBvcyAhPSAtMSkgeworICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgYSBoYXNoIG9mIHRoZSBvcmlnaW5hbCBmaWxlIHBhdGgKKyAgICAgICAgSGFzaEZ1bmN0aW9uIGhhc2hGdW5jdGlvbiA9IEhhc2hpbmcubWQ1KCk7CisgICAgICAgIEhhc2hDb2RlIGhhc2hDb2RlID0gaGFzaEZ1bmN0aW9uLmhhc2hTdHJpbmcoaW5wdXRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICByZXR1cm4gbmV3IEZpbGUob3V0Rm9sZGVyLCBuYW1lICsgIi0iICsgaGFzaENvZGUudG9TdHJpbmcoKSArIFNka0NvbnN0YW50cy5ET1RfSkFSKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9Qcm9jZXNzQW5kcm9pZFJlc291cmNlcy5ncm9vdnkgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9Qcm9jZXNzQW5kcm9pZFJlc291cmNlcy5ncm9vdnkKaW5kZXggMjAxZTQ3Zi4uM2M5ODFhYyAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvUHJvY2Vzc0FuZHJvaWRSZXNvdXJjZXMuZ3Jvb3Z5CisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL1Byb2Nlc3NBbmRyb2lkUmVzb3VyY2VzLmdyb292eQpAQCAtNTEsNiArNTEsOSBAQAogICAgIEBPdXRwdXRGaWxlIEBPcHRpb25hbAogICAgIEZpbGUgcHJvZ3VhcmRPdXRwdXRGaWxlCiAKKyAgICBASW5wdXQKKyAgICBDb2xsZWN0aW9uPFN0cmluZz4gcmVzb3VyY2VDb25maWdzCisKICAgICAvLyAtLS0tLSBQUklWQVRFIFRBU0sgQVBJIC0tLS0tCiAKICAgICBATmVzdGVkCkBAIC04OCw2ICs5MSw3IEBACiAgICAgICAgICAgICAgICAgZ2V0UHJvZ3VhcmRPdXRwdXRGaWxlKCk/LmFic29sdXRlUGF0aCwKICAgICAgICAgICAgICAgICBnZXRUeXBlKCksCiAgICAgICAgICAgICAgICAgZ2V0RGVidWdnYWJsZSgpLAotICAgICAgICAgICAgICAgIGdldEFhcHRPcHRpb25zKCkpCisgICAgICAgICAgICAgICAgZ2V0QWFwdE9wdGlvbnMoKSwKKyAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZUNvbmZpZ3MoKSkKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9Qcm9jZXNzVGVzdE1hbmlmZXN0Lmdyb292eSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL1Byb2Nlc3NUZXN0TWFuaWZlc3QuZ3Jvb3Z5CmluZGV4IDEwZmMxMWYuLjZhMjQxNTUgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL1Byb2Nlc3NUZXN0TWFuaWZlc3QuZ3Jvb3Z5CisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL1Byb2Nlc3NUZXN0TWFuaWZlc3QuZ3Jvb3Z5CkBAIC00MSw2ICs0MSwxMiBAQAogICAgIEBJbnB1dAogICAgIFN0cmluZyBpbnN0cnVtZW50YXRpb25SdW5uZXIKIAorICAgIEBJbnB1dAorICAgIEJvb2xlYW4gaGFuZGxlUHJvZmlsaW5nOworCisgICAgQElucHV0CisgICAgQm9vbGVhbiBmdW5jdGlvbmFsVGVzdDsKKwogICAgIEBOZXN0ZWQKICAgICBMaXN0PE1hbmlmZXN0RGVwZW5kZW5jeUltcGw+IGxpYnJhcmllcwogCkBAIC01Miw2ICs1OCw4IEBACiAgICAgICAgICAgICAgICAgZ2V0VGFyZ2V0U2RrVmVyc2lvbigpLAogICAgICAgICAgICAgICAgIGdldFRlc3RlZFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uUnVubmVyKCksCisgICAgICAgICAgICAgICAgZ2V0SGFuZGxlUHJvZmlsaW5nKCksCisgICAgICAgICAgICAgICAgZ2V0RnVuY3Rpb25hbFRlc3QoKSwKICAgICAgICAgICAgICAgICBnZXRMaWJyYXJpZXMoKSwKICAgICAgICAgICAgICAgICBnZXRNYW5pZmVzdE91dHB1dEZpbGUoKS5hYnNvbHV0ZVBhdGgpCiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvUmVuZGVyc2NyaXB0Q29tcGlsZS5ncm9vdnkgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9SZW5kZXJzY3JpcHRDb21waWxlLmdyb292eQppbmRleCA4NTNhMGE5Li5hNWY3OTg2IDEwMDY0NAotLS0gYS9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9SZW5kZXJzY3JpcHRDb21waWxlLmdyb292eQorKysgYi9ncmFkbGUvc3JjL21haW4vZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS90YXNrcy9SZW5kZXJzY3JpcHRDb21waWxlLmdyb292eQpAQCAtMTUsNyArMTUsOCBAQAogICovCiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLnRhc2tzCi1pbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuZ3JhZGxlLmludGVybmFsLnRhc2tzLkJhc2VUYXNrCisKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwudGFza3MuTmRrVGFzawogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLklucHV0CiBpbXBvcnQgb3JnLmdyYWRsZS5hcGkudGFza3MuSW5wdXRGaWxlcwogaW1wb3J0IG9yZy5ncmFkbGUuYXBpLnRhc2tzLk91dHB1dERpcmVjdG9yeQpAQCAtMjMsNyArMjQsNyBAQAogLyoqCiAgKiBUYXNrIHRvIGNvbXBpbGUgUmVuZGVyc2NyaXB0IGZpbGVzLiBTdXBwb3J0cyBpbmNyZW1lbnRhbCB1cGRhdGUuCiAgKi8KLXB1YmxpYyBjbGFzcyBSZW5kZXJzY3JpcHRDb21waWxlIGV4dGVuZHMgQmFzZVRhc2sgeworcHVibGljIGNsYXNzIFJlbmRlcnNjcmlwdENvbXBpbGUgZXh0ZW5kcyBOZGtUYXNrIHsKIAogICAgIC8vIC0tLS0tIFBVQkxJQyBUQVNLIEFQSSAtLS0tLQogCkBAIC0zMyw2ICszNCwxMyBAQAogICAgIEBPdXRwdXREaXJlY3RvcnkKICAgICBGaWxlIHJlc091dHB1dERpcgogCisgICAgQE91dHB1dERpcmVjdG9yeQorICAgIEZpbGUgb2JqT3V0cHV0RGlyCisKKyAgICBAT3V0cHV0RGlyZWN0b3J5CisgICAgRmlsZSBsaWJPdXRwdXREaXIKKworCiAgICAgLy8gLS0tLS0gUFJJVkFURSBUQVNLIEFQSSAtLS0tLQogCiAgICAgQElucHV0RmlsZXMKQEAgLTQyLDE0ICs1MCwyMCBAQAogICAgIExpc3Q8RmlsZT4gaW1wb3J0RGlycwogCiAgICAgQElucHV0Ci0gICAgaW50IG9wdGltTGV2ZWwKLQotICAgIEBJbnB1dAogICAgIGludCB0YXJnZXRBcGkKIAogICAgIEBJbnB1dAorICAgIGJvb2xlYW4gc3VwcG9ydE1vZGUKKworICAgIEBJbnB1dAorICAgIGludCBvcHRpbUxldmVsCisKKyAgICBASW5wdXQKICAgICBib29sZWFuIGRlYnVnQnVpbGQKIAorICAgIEBJbnB1dAorICAgIGJvb2xlYW4gbmRrTW9kZQorCiAgICAgQFRhc2tBY3Rpb24KICAgICB2b2lkIHRhc2tBY3Rpb24oKSB7CiAgICAgICAgIC8vIHRoaXMgaXMgZnVsbCBydW4gKGFsd2F5cyksIGNsZWFuIHRoZSBwcmV2aW91cyBvdXRwdXRzCkBAIC01OSw2ICs3MywxMiBAQAogICAgICAgICBGaWxlIHJlc0Rlc3REaXIgPSBnZXRSZXNPdXRwdXREaXIoKQogICAgICAgICBlbXB0eUZvbGRlcihyZXNEZXN0RGlyKQogCisgICAgICAgIEZpbGUgb2JqRGVzdERpciA9IGdldE9iak91dHB1dERpcigpCisgICAgICAgIGVtcHR5Rm9sZGVyKG9iakRlc3REaXIpCisKKyAgICAgICAgRmlsZSBsaWJEZXN0RGlyID0gZ2V0TGliT3V0cHV0RGlyKCkKKyAgICAgICAgZW1wdHlGb2xkZXIobGliRGVzdERpcikKKwogICAgICAgICAvLyBnZXQgdGhlIGltcG9ydCBmb2xkZXJzLiBJZiB0aGUgLnJzaCBmaWxlcyBhcmUgbm90IGRpcmVjdGx5IHVuZGVyIHRoZSBpbXBvcnQgZm9sZGVycywKICAgICAgICAgLy8gd2UgbmVlZCB0byBnZXQgdGhlIGxlYWYgZm9sZGVycywgYXMgdGhpcyBpcyB3aGF0IGxsdm0tcnMtY2MgZXhwZWN0cy4KICAgICAgICAgTGlzdDxGaWxlPiBpbXBvcnRGb2xkZXJzID0gZ2V0QnVpbGRlcigpLmdldExlYWZGb2xkZXJzKCJyc2giLApAQCAtNjksOCArODksMTMgQEAKICAgICAgICAgICAgICAgICBpbXBvcnRGb2xkZXJzLAogICAgICAgICAgICAgICAgIHNvdXJjZURlc3REaXIsCiAgICAgICAgICAgICAgICAgcmVzRGVzdERpciwKKyAgICAgICAgICAgICAgICBvYmpEZXN0RGlyLAorICAgICAgICAgICAgICAgIGxpYkRlc3REaXIsCiAgICAgICAgICAgICAgICAgZ2V0VGFyZ2V0QXBpKCksCiAgICAgICAgICAgICAgICAgZ2V0RGVidWdCdWlsZCgpLAotICAgICAgICAgICAgICAgIGdldE9wdGltTGV2ZWwoKSkKKyAgICAgICAgICAgICAgICBnZXRPcHRpbUxldmVsKCksCisgICAgICAgICAgICAgICAgZ2V0TmRrTW9kZSgpLAorICAgICAgICAgICAgICAgIGdldFN1cHBvcnRNb2RlKCksCisgICAgICAgICAgICAgICAgZ2V0TmRrQ29uZmlnKCk/LmFiaUZpbHRlcnMpCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3NyYy9tYWluL2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvdGFza3MvUmVzb3VyY2VFeGNlcHRpb24uamF2YSBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL1Jlc291cmNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QxYjE0MgotLS0gL2Rldi9udWxsCisrKyBiL2dyYWRsZS9zcmMvbWFpbi9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL3Rhc2tzL1Jlc291cmNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmdyYWRsZS50YXNrczsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5jb21tb24ucmVzMi5NZXJnaW5nRXhjZXB0aW9uOworCisvKioKKyAqIEV4Y2VwdGlvbiB1c2VkIGZvciByZXNvdXJjZSBtZXJnaW5nIGVycm9ycywgdGhyb3duIHdoZW4KKyAqIGEge0BsaW5rIE1lcmdpbmdFeGNlcHRpb259IGlzIHRocm93biBieSB0aGUgcmVzb3VyY2UgbWVyZ2luZyBjb2RlLgorICogV2UgY2FuJ3QganVzdCByZXRocm93IHRoZSB7QGxpbmtwbGFpbiBNZXJnaW5nRXhjZXB0aW9ufSBiZWNhdXNlCisgKiBncmFkbGUgMS44IHNlZW1zIHRvIHdhbnQgYSBSdW50aW1lRXhjZXB0aW9uOyB3aXRob3V0IGl0IHlvdSBnZXQKKyAqIHRoZSBlcnJvciBtZXNzYWdlCisgKiB7QGNvZGUKKyAqICAgICA+IENvdWxkIG5vdCBjYWxsIEluY3JlbWVudGFsVGFzay50YXNrQWN0aW9uKCkgb24gdGFzayAnOk15UHJqOm1lcmdlRGVidWdSZXNvdXJjZXMnCisgKiB9CisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgIHB1YmxpYyBSZXNvdXJjZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlLCB0aHJvd2FibGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvdGVzdC9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0FwcFBsdWdpbkRzbFRlc3QuZ3Jvb3Z5IGIvZ3JhZGxlL3NyYy90ZXN0L2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvQXBwUGx1Z2luRHNsVGVzdC5ncm9vdnkKaW5kZXggNzU2ZGZjNy4uYmVmMmVjNyAxMDA2NDQKLS0tIGEvZ3JhZGxlL3NyYy90ZXN0L2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvQXBwUGx1Z2luRHNsVGVzdC5ncm9vdnkKKysrIGIvZ3JhZGxlL3NyYy90ZXN0L2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvQXBwUGx1Z2luRHNsVGVzdC5ncm9vdnkKQEAgLTI2NiwxOSArMjY2LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHRlc3RlZFZhcmlhbnROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFNldDxBcHBsaWNhdGlvblZhcmlhbnQ+IHZhcmlhbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFNldDxUZXN0VmFyaWFudD4gdGVzdFZhcmlhbnRzKSB7Ci0gICAgICAgIEFwcGxpY2F0aW9uVmFyaWFudCB2YXJpYW50ID0gZmluZE5hbWVkSXRlbSh2YXJpYW50cywgdmFyaWFudE5hbWUpCi0gICAgICAgIGFzc2VydE5vdE51bGwodmFyaWFudCkKKyAgICAgICAgQXBwbGljYXRpb25WYXJpYW50IHZhcmlhbnQgPSBmaW5kTmFtZWRJdGVtKHZhcmlhbnRzLCB2YXJpYW50TmFtZSwgInZhcmlhbnREYXRhIikKICAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJpYW50LnRlc3RWYXJpYW50KQogICAgICAgICBhc3NlcnRFcXVhbHModGVzdGVkVmFyaWFudE5hbWUsIHZhcmlhbnQudGVzdFZhcmlhbnQubmFtZSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhcmlhbnQudGVzdFZhcmlhbnQsIGZpbmROYW1lZEl0ZW0odGVzdFZhcmlhbnRzLCB0ZXN0ZWRWYXJpYW50TmFtZSkpCisgICAgICAgIGFzc2VydEVxdWFscyh2YXJpYW50LnRlc3RWYXJpYW50LCBmaW5kTmFtZWRJdGVtTWF5YmUodGVzdFZhcmlhbnRzLCB0ZXN0ZWRWYXJpYW50TmFtZSkpCiAgICAgICAgIGNoZWNrVGFza3ModmFyaWFudCkKICAgICAgICAgY2hlY2tUYXNrcyh2YXJpYW50LnRlc3RWYXJpYW50KQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tOb25UZXN0ZWRWYXJpYW50KEBOb25OdWxsIFN0cmluZyB2YXJpYW50TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBTZXQ8QXBwbGljYXRpb25WYXJpYW50PiB2YXJpYW50cykgewotICAgICAgICBBcHBsaWNhdGlvblZhcmlhbnQgdmFyaWFudCA9IGZpbmROYW1lZEl0ZW0odmFyaWFudHMsIHZhcmlhbnROYW1lKQotICAgICAgICBhc3NlcnROb3ROdWxsKHZhcmlhbnQpCisgICAgICAgIEFwcGxpY2F0aW9uVmFyaWFudCB2YXJpYW50ID0gZmluZE5hbWVkSXRlbSh2YXJpYW50cywgdmFyaWFudE5hbWUsICJ2YXJpYW50RGF0YSIpCiAgICAgICAgIGFzc2VydE51bGwodmFyaWFudC50ZXN0VmFyaWFudCkKICAgICAgICAgY2hlY2tUYXNrcyh2YXJpYW50KQogICAgIH0KZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvdGVzdC9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0FwcFBsdWdpbkludGVybmFsVGVzdC5ncm9vdnkgYi9ncmFkbGUvc3JjL3Rlc3QvZ3Jvb3Z5L2NvbS9hbmRyb2lkL2J1aWxkL2dyYWRsZS9BcHBQbHVnaW5JbnRlcm5hbFRlc3QuZ3Jvb3Z5CmluZGV4IGQ4NDAyNzIuLjQ1Nzg5NDUgMTAwNjQ0Ci0tLSBhL2dyYWRsZS9zcmMvdGVzdC9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL0FwcFBsdWdpbkludGVybmFsVGVzdC5ncm9vdnkKKysrIGIvZ3JhZGxlL3NyYy90ZXN0L2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvQXBwUGx1Z2luSW50ZXJuYWxUZXN0Lmdyb292eQpAQCAtNjAsMTQgKzYwLDkgQEAKICAgICAgICAgTGlzdDxCYXNlVmFyaWFudERhdGE+IHZhcmlhbnRzID0gcGx1Z2luLnZhcmlhbnREYXRhTGlzdAogICAgICAgICBhc3NlcnRFcXVhbHMoMywgdmFyaWFudHMuc2l6ZSgpKSAvLyBpbmNsdWRlcyB0aGUgdGVzdCB2YXJpYW50KHMpCiAKLSAgICAgICAgQmFzZVZhcmlhbnREYXRhIGRlYnVnVmFyaWFudCA9IGZpbmROYW1lZEl0ZW0odmFyaWFudHMsICJEZWJ1ZyIpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZGVidWdWYXJpYW50KQotCi0gICAgICAgIEJhc2VWYXJpYW50RGF0YSByZWxlYXNlID0gZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIlJlbGVhc2UiKQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlbGVhc2UpCi0KLSAgICAgICAgQmFzZVZhcmlhbnREYXRhIHRlc3QgPSBmaW5kTmFtZWRJdGVtKHZhcmlhbnRzLCAiVGVzdCIpCi0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdCkKKyAgICAgICAgZmluZE5hbWVkSXRlbSh2YXJpYW50cywgImRlYnVnIiwgInZhcmlhbnREYXRhIikKKyAgICAgICAgZmluZE5hbWVkSXRlbSh2YXJpYW50cywgInJlbGVhc2UiLCAidmFyaWFudERhdGEiKQorICAgICAgICBmaW5kTmFtZWRJdGVtKHZhcmlhbnRzLCAiZGVidWdUZXN0IiwgInZhcmlhbnREYXRhIikKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbmZpZygpIHsKQEAgLTEzOCwxNyArMTMzLDE0IEBACiAgICAgICAgIExpc3Q8QmFzZVZhcmlhbnREYXRhPiB2YXJpYW50cyA9IHBsdWdpbi52YXJpYW50RGF0YUxpc3QKICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHZhcmlhbnRzLnNpemUoKSkgLy8gaW5jbHVkZXMgdGhlIHRlc3QgdmFyaWFudChzKQogCi0gICAgICAgIEJhc2VWYXJpYW50RGF0YSBkZWJ1Z1ZhcmlhbnQgPSBmaW5kTmFtZWRJdGVtKHZhcmlhbnRzLCAiRGVidWciKQotICAgICAgICBhc3NlcnROb3ROdWxsKGRlYnVnVmFyaWFudCkKKyAgICAgICAgU3RyaW5nW10gdmFyaWFudE5hbWVzID0gWworICAgICAgICAgICAgICAgICJkZWJ1ZyIsICJyZWxlYXNlIiwgInN0YWdpbmciXQogCi0gICAgICAgIEJhc2VWYXJpYW50RGF0YSByZWxlYXNlVmFyaWFudCA9IGZpbmROYW1lZEl0ZW0odmFyaWFudHMsICJSZWxlYXNlIikKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZWxlYXNlVmFyaWFudCkKKyAgICAgICAgZm9yIChTdHJpbmcgdmFyaWFudE5hbWUgOiB2YXJpYW50TmFtZXMpIHsKKyAgICAgICAgICAgIGZpbmROYW1lZEl0ZW0odmFyaWFudHMsIHZhcmlhbnROYW1lLCAidmFyaWFudERhdGEiKQorICAgICAgICB9CiAKLSAgICAgICAgQmFzZVZhcmlhbnREYXRhIHN0YWdpbmdWYXJpYW50ID0gZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIlN0YWdpbmciKQotICAgICAgICBhc3NlcnROb3ROdWxsKHN0YWdpbmdWYXJpYW50KQotCi0gICAgICAgIEJhc2VWYXJpYW50RGF0YSB0ZXN0VmFyaWFudCA9IGZpbmROYW1lZEl0ZW0odmFyaWFudHMsICJUZXN0IikKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0VmFyaWFudCkKKyAgICAgICAgQmFzZVZhcmlhbnREYXRhIHRlc3RWYXJpYW50ID0gZmluZE5hbWVkSXRlbSh2YXJpYW50cywgInN0YWdpbmdUZXN0IiwgInZhcmlhbnREYXRhIikKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdGFnaW5nIiwgdGVzdFZhcmlhbnQudmFyaWFudENvbmZpZ3VyYXRpb24uYnVpbGRUeXBlLm5hbWUpCiAgICAgfQogCkBAIC0xNzksMTIgKzE3MSwxMyBAQAogICAgICAgICBMaXN0PEJhc2VWYXJpYW50RGF0YT4gdmFyaWFudHMgPSBwbHVnaW4udmFyaWFudERhdGFMaXN0CiAgICAgICAgIGFzc2VydEVxdWFscyg2LCB2YXJpYW50cy5zaXplKCkpIC8vIGluY2x1ZGVzIHRoZSB0ZXN0IHZhcmlhbnQocykKIAotICAgICAgICBhc3NlcnROb3ROdWxsKGZpbmROYW1lZEl0ZW0odmFyaWFudHMsICJGbGF2b3IxRGVidWciKSkKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmaW5kTmFtZWRJdGVtKHZhcmlhbnRzLCAiRmxhdm9yMVJlbGVhc2UiKSkKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmaW5kTmFtZWRJdGVtKHZhcmlhbnRzLCAiRmxhdm9yMVRlc3QiKSkKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmaW5kTmFtZWRJdGVtKHZhcmlhbnRzLCAiRmxhdm9yMkRlYnVnIikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkZsYXZvcjJSZWxlYXNlIikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkZsYXZvcjJUZXN0IikpCisgICAgICAgIFN0cmluZ1tdIHZhcmlhbnROYW1lcyA9IFsKKyAgICAgICAgICAgICAgICAiZmxhdm9yMURlYnVnIiwgImZsYXZvcjFSZWxlYXNlIiwgImZsYXZvcjFEZWJ1Z1Rlc3QiLAorICAgICAgICAgICAgICAgICJmbGF2b3IyRGVidWciLCAiZmxhdm9yMlJlbGVhc2UiLCAiZmxhdm9yMkRlYnVnVGVzdCJdCisKKyAgICAgICAgZm9yIChTdHJpbmcgdmFyaWFudE5hbWUgOiB2YXJpYW50TmFtZXMpIHsKKyAgICAgICAgICAgIGZpbmROYW1lZEl0ZW0odmFyaWFudHMsIHZhcmlhbnROYW1lLCAidmFyaWFudERhdGEiKQorICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpRmxhdm9ycygpIHsKQEAgLTIyNiwyNCArMjE5LDI5IEBACiAgICAgICAgIExpc3Q8QmFzZVZhcmlhbnREYXRhPiB2YXJpYW50cyA9IHBsdWdpbi52YXJpYW50RGF0YUxpc3QKICAgICAgICAgYXNzZXJ0RXF1YWxzKDE4LCB2YXJpYW50cy5zaXplKCkpICAgLy8gaW5jbHVkZXMgdGhlIHRlc3QgdmFyaWFudChzKQogCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkYxRmFEZWJ1ZyIpKQotICAgICAgICBhc3NlcnROb3ROdWxsKGZpbmROYW1lZEl0ZW0odmFyaWFudHMsICJGMUZiRGVidWciKSkKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmaW5kTmFtZWRJdGVtKHZhcmlhbnRzLCAiRjFGY0RlYnVnIikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkYyRmFEZWJ1ZyIpKQotICAgICAgICBhc3NlcnROb3ROdWxsKGZpbmROYW1lZEl0ZW0odmFyaWFudHMsICJGMkZiRGVidWciKSkKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmaW5kTmFtZWRJdGVtKHZhcmlhbnRzLCAiRjJGY0RlYnVnIikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkYxRmFSZWxlYXNlIikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkYxRmJSZWxlYXNlIikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkYxRmNSZWxlYXNlIikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkYyRmFSZWxlYXNlIikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkYyRmJSZWxlYXNlIikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkYyRmNSZWxlYXNlIikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkYxRmFUZXN0IikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkYxRmJUZXN0IikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkYxRmNUZXN0IikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkYyRmFUZXN0IikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkYyRmJUZXN0IikpCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkYyRmNUZXN0IikpCisgICAgICAgIFN0cmluZ1tdIHZhcmlhbnROYW1lcyA9IFsKKyAgICAgICAgICAgICAgICAiZjFGYURlYnVnIiwKKyAgICAgICAgICAgICAgICAiZjFGYkRlYnVnIiwKKyAgICAgICAgICAgICAgICAiZjFGY0RlYnVnIiwKKyAgICAgICAgICAgICAgICAiZjJGYURlYnVnIiwKKyAgICAgICAgICAgICAgICAiZjJGYkRlYnVnIiwKKyAgICAgICAgICAgICAgICAiZjJGY0RlYnVnIiwKKyAgICAgICAgICAgICAgICAiZjFGYVJlbGVhc2UiLAorICAgICAgICAgICAgICAgICJmMUZiUmVsZWFzZSIsCisgICAgICAgICAgICAgICAgImYxRmNSZWxlYXNlIiwKKyAgICAgICAgICAgICAgICAiZjJGYVJlbGVhc2UiLAorICAgICAgICAgICAgICAgICJmMkZiUmVsZWFzZSIsCisgICAgICAgICAgICAgICAgImYyRmNSZWxlYXNlIiwKKyAgICAgICAgICAgICAgICAiZjFGYURlYnVnVGVzdCIsCisgICAgICAgICAgICAgICAgImYxRmJEZWJ1Z1Rlc3QiLAorICAgICAgICAgICAgICAgICJmMUZjRGVidWdUZXN0IiwKKyAgICAgICAgICAgICAgICAiZjJGYURlYnVnVGVzdCIsCisgICAgICAgICAgICAgICAgImYyRmJEZWJ1Z1Rlc3QiLAorICAgICAgICAgICAgICAgICJmMkZjRGVidWdUZXN0Il07CisKKyAgICAgICAgZm9yIChTdHJpbmcgdmFyaWFudE5hbWUgOiB2YXJpYW50TmFtZXMpIHsKKyAgICAgICAgICAgIGZpbmROYW1lZEl0ZW0odmFyaWFudHMsIHZhcmlhbnROYW1lLCAidmFyaWFudERhdGEiKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaWduaW5nQ29uZmlncygpIHsKQEAgLTMxMiwzNyArMzEwLDMxIEBACiAgICAgICAgIEJhc2VWYXJpYW50RGF0YSB2YXJpYW50CiAgICAgICAgIFNpZ25pbmdDb25maWcgc2lnbmluZ0NvbmZpZwogCi0gICAgICAgIHZhcmlhbnQgPSBmaW5kTmFtZWRJdGVtKHZhcmlhbnRzLCAiRmxhdm9yMURlYnVnIikKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJpYW50KQorICAgICAgICB2YXJpYW50ID0gZmluZE5hbWVkSXRlbSh2YXJpYW50cywgImZsYXZvcjFEZWJ1ZyIsICJ2YXJpYW50RGF0YSIpCiAgICAgICAgIHNpZ25pbmdDb25maWcgPSB2YXJpYW50LnZhcmlhbnRDb25maWd1cmF0aW9uLnNpZ25pbmdDb25maWcKICAgICAgICAgYXNzZXJ0Tm90TnVsbChzaWduaW5nQ29uZmlnKQogICAgICAgICBhc3NlcnRFcXVhbHMoS2V5c3RvcmVIZWxwZXIuZGVmYXVsdERlYnVnS2V5c3RvcmVMb2NhdGlvbigpLCBzaWduaW5nQ29uZmlnLnN0b3JlRmlsZT8uYWJzb2x1dGVQYXRoKQogCi0gICAgICAgIHZhcmlhbnQgPSBmaW5kTmFtZWRJdGVtKHZhcmlhbnRzLCAiRmxhdm9yMVN0YWdpbmciKQotICAgICAgICBhc3NlcnROb3ROdWxsKHZhcmlhbnQpCisgICAgICAgIHZhcmlhbnQgPSBmaW5kTmFtZWRJdGVtKHZhcmlhbnRzLCAiZmxhdm9yMVN0YWdpbmciLCAidmFyaWFudERhdGEiKQogICAgICAgICBzaWduaW5nQ29uZmlnID0gdmFyaWFudC52YXJpYW50Q29uZmlndXJhdGlvbi5zaWduaW5nQ29uZmlnCiAgICAgICAgIGFzc2VydE51bGwoc2lnbmluZ0NvbmZpZykKIAotICAgICAgICB2YXJpYW50ID0gZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkZsYXZvcjFSZWxlYXNlIikKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJpYW50KQorICAgICAgICB2YXJpYW50ID0gZmluZE5hbWVkSXRlbSh2YXJpYW50cywgImZsYXZvcjFSZWxlYXNlIiwgInZhcmlhbnREYXRhIikKICAgICAgICAgc2lnbmluZ0NvbmZpZyA9IHZhcmlhbnQudmFyaWFudENvbmZpZ3VyYXRpb24uc2lnbmluZ0NvbmZpZwogICAgICAgICBhc3NlcnROb3ROdWxsKHNpZ25pbmdDb25maWcpCiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRmlsZShwcm9qZWN0LnByb2plY3REaXIsICJhMyIpLCBzaWduaW5nQ29uZmlnLnN0b3JlRmlsZSkKIAotICAgICAgICB2YXJpYW50ID0gZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkZsYXZvcjJEZWJ1ZyIpCi0gICAgICAgIGFzc2VydE5vdE51bGwodmFyaWFudCkKKyAgICAgICAgdmFyaWFudCA9IGZpbmROYW1lZEl0ZW0odmFyaWFudHMsICJmbGF2b3IyRGVidWciLCAidmFyaWFudERhdGEiKQogICAgICAgICBzaWduaW5nQ29uZmlnID0gdmFyaWFudC52YXJpYW50Q29uZmlndXJhdGlvbi5zaWduaW5nQ29uZmlnCiAgICAgICAgIGFzc2VydE5vdE51bGwoc2lnbmluZ0NvbmZpZykKICAgICAgICAgYXNzZXJ0RXF1YWxzKEtleXN0b3JlSGVscGVyLmRlZmF1bHREZWJ1Z0tleXN0b3JlTG9jYXRpb24oKSwgc2lnbmluZ0NvbmZpZy5zdG9yZUZpbGU/LmFic29sdXRlUGF0aCkKIAotICAgICAgICB2YXJpYW50ID0gZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkZsYXZvcjJTdGFnaW5nIikKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJpYW50KQorICAgICAgICB2YXJpYW50ID0gZmluZE5hbWVkSXRlbSh2YXJpYW50cywgImZsYXZvcjJTdGFnaW5nIiwgInZhcmlhbnREYXRhIikKICAgICAgICAgc2lnbmluZ0NvbmZpZyA9IHZhcmlhbnQudmFyaWFudENvbmZpZ3VyYXRpb24uc2lnbmluZ0NvbmZpZwogICAgICAgICBhc3NlcnROb3ROdWxsKHNpZ25pbmdDb25maWcpCiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRmlsZShwcm9qZWN0LnByb2plY3REaXIsICJhMSIpLCBzaWduaW5nQ29uZmlnLnN0b3JlRmlsZSkKIAotICAgICAgICB2YXJpYW50ID0gZmluZE5hbWVkSXRlbSh2YXJpYW50cywgIkZsYXZvcjJSZWxlYXNlIikKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJpYW50KQorICAgICAgICB2YXJpYW50ID0gZmluZE5hbWVkSXRlbSh2YXJpYW50cywgImZsYXZvcjJSZWxlYXNlIiwgInZhcmlhbnREYXRhIikKICAgICAgICAgc2lnbmluZ0NvbmZpZyA9IHZhcmlhbnQudmFyaWFudENvbmZpZ3VyYXRpb24uc2lnbmluZ0NvbmZpZwogICAgICAgICBhc3NlcnROb3ROdWxsKHNpZ25pbmdDb25maWcpCiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRmlsZShwcm9qZWN0LnByb2plY3REaXIsICJhMyIpLCBzaWduaW5nQ29uZmlnLnN0b3JlRmlsZSkKZGlmZiAtLWdpdCBhL2dyYWRsZS9zcmMvdGVzdC9ncm9vdnkvY29tL2FuZHJvaWQvYnVpbGQvZ3JhZGxlL2ludGVybmFsL3Rlc3QvQmFzZVRlc3QuZ3Jvb3Z5IGIvZ3JhZGxlL3NyYy90ZXN0L2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdGVzdC9CYXNlVGVzdC5ncm9vdnkKaW5kZXggNWE5NjAwOS4uMjY5YTU1NyAxMDA3NTUKLS0tIGEvZ3JhZGxlL3NyYy90ZXN0L2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdGVzdC9CYXNlVGVzdC5ncm9vdnkKKysrIGIvZ3JhZGxlL3NyYy90ZXN0L2dyb292eS9jb20vYW5kcm9pZC9idWlsZC9ncmFkbGUvaW50ZXJuYWwvdGVzdC9CYXNlVGVzdC5ncm9vdnkKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5ncmFkbGUuaW50ZXJuYWwudGVzdAogaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk5vbk51bGwKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5OdWxsYWJsZQogaW1wb3J0IGNvbS5hbmRyb2lkLnNka2xpYi5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RQcm9wZXJ0aWVzCiBpbXBvcnQgY29tLmFuZHJvaWQuc2RrbGliLmludGVybmFsLnByb2plY3QuUHJvamVjdFByb3BlcnRpZXNXb3JraW5nQ29weQogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZQpAQCAtMTAwLDEwICsxMDEsMzEgQEAKICAgICAgICAgcmV0dXJuIG51bGwKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIEZpbGUgY3JlYXRlTG9jYWxQcm9wKEZpbGUgcHJvamVjdCwgRmlsZSBzZGtEaXIpIHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBTREsgZm9sZGVyIGFzIGJ1aWx0IGZyb20gdGhlIEFuZHJvaWQgc291cmNlIHRyZWUuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGdldE5ka0RpcigpIHsKKyAgICAgICAgU3RyaW5nIGFuZHJvaWRIb21lID0gU3lzdGVtLmdldGVudigiQU5EUk9JRF9OREtfSE9NRSIpOworICAgICAgICBpZiAoYW5kcm9pZEhvbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYW5kcm9pZEhvbWUpOworICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWxlZCB0byBmaW5kIE5ESyBpbiBBTkRST0lEX05ES19IT01FPSIgKyBhbmRyb2lkSG9tZSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgRmlsZSBjcmVhdGVMb2NhbFByb3AoQE5vbk51bGwgRmlsZSBwcm9qZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgRmlsZSBzZGtEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgRmlsZSBuZGtEaXIpIHsKICAgICAgICAgUHJvamVjdFByb3BlcnRpZXNXb3JraW5nQ29weSBsb2NhbFByb3AgPSBQcm9qZWN0UHJvcGVydGllcy5jcmVhdGUoCiAgICAgICAgICAgICAgICAgcHJvamVjdC5hYnNvbHV0ZVBhdGgsIFByb2plY3RQcm9wZXJ0aWVzLlByb3BlcnR5VHlwZS5MT0NBTCkKICAgICAgICAgbG9jYWxQcm9wLnNldFByb3BlcnR5KFByb2plY3RQcm9wZXJ0aWVzLlBST1BFUlRZX1NESywgc2RrRGlyLmFic29sdXRlUGF0aCkKKyAgICAgICAgaWYgKG5ka0RpciAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2NhbFByb3Auc2V0UHJvcGVydHkoUHJvamVjdFByb3BlcnRpZXMuUFJPUEVSVFlfTkRLLCBuZGtEaXIuYWJzb2x1dGVQYXRoKQorICAgICAgICB9CiAgICAgICAgIGxvY2FsUHJvcC5zYXZlKCkKIAogICAgICAgICByZXR1cm4gKEZpbGUpIGxvY2FsUHJvcC5maWxlCkBAIC0xMTIsMTQgKzEzNCwxNSBAQAogICAgIHByb3RlY3RlZCBGaWxlIHJ1blRhc2tzT24oU3RyaW5nIG5hbWUsIFN0cmluZyBncmFkbGVWZXJzaW9uLCBTdHJpbmcuLi4gdGFza3MpIHsKICAgICAgICAgRmlsZSBwcm9qZWN0ID0gbmV3IEZpbGUodGVzdERpciwgbmFtZSkKIAotICAgICAgICBydW5HcmFkbGVUYXNrcyhzZGtEaXIsIGdyYWRsZVZlcnNpb24sIHByb2plY3QsIHRhc2tzKQorICAgICAgICBydW5HcmFkbGVUYXNrcyhzZGtEaXIsIG5ka0RpciwgZ3JhZGxlVmVyc2lvbiwgcHJvamVjdCwgdGFza3MpCiAKICAgICAgICAgcmV0dXJuIHByb2plY3Q7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJ1bkdyYWRsZVRhc2tzKEZpbGUgc2RrRGlyLCBTdHJpbmcgZ3JhZGxlVmVyc2lvbiwKKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcnVuR3JhZGxlVGFza3MoRmlsZSBzZGtEaXIsIEZpbGUgbmRrRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ3JhZGxlVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBwcm9qZWN0LCBTdHJpbmcuLi4gdGFza3MpIHsKLSAgICAgICAgRmlsZSBsb2NhbFByb3AgPSBjcmVhdGVMb2NhbFByb3AocHJvamVjdCwgc2RrRGlyKQorICAgICAgICBGaWxlIGxvY2FsUHJvcCA9IGNyZWF0ZUxvY2FsUHJvcChwcm9qZWN0LCBzZGtEaXIsIG5ka0RpcikKIAogICAgICAgICB0cnkgewogCkBAIC0xNjAsOCArMTgzLDggQEAKICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgaXRlbSB0byByZXR1cm4KICAgICAgKiBAcmV0dXJuIHRoZSBmb3VuZCBpdGVtIG9yIG51bGwKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIDxUPiBUIGZpbmROYW1lZEl0ZW0oQE5vbk51bGwgQ29sbGVjdGlvbjxUPiBpdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIG5hbWUpIHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIDxUPiBUIGZpbmROYW1lZEl0ZW1NYXliZShATm9uTnVsbCBDb2xsZWN0aW9uPFQ+IGl0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBuYW1lKSB7CiAgICAgICAgIGZvciAoVCBpdGVtIDogaXRlbXMpIHsKICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhpdGVtLm5hbWUpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0KQEAgLTE3MCw0ICsxOTMsMTggQEAKIAogICAgICAgICByZXR1cm4gbnVsbAogICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgaXRlbSBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGl0ZW1zLiBUaGUgaXRlbXMgKm11c3QqIGhhdmUgYSAibmFtZSIgcHJvcGVydHkuCisgICAgICogQHBhcmFtIGl0ZW1zIHRoZSBpdGVtIGNvbGxlY3Rpb24gdG8gc2VhcmNoIGZvciBhIG1hdGNoCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGl0ZW0gdG8gcmV0dXJuCisgICAgICogQHJldHVybiB0aGUgZm91bmQgaXRlbSBvciBudWxsCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyA8VD4gVCBmaW5kTmFtZWRJdGVtKEBOb25OdWxsIENvbGxlY3Rpb248VD4gaXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgdHlwZU5hbWUpIHsKKyAgICAgICAgVCBmb3VuZEl0ZW0gPSBmaW5kTmFtZWRJdGVtTWF5YmUoaXRlbXMsIG5hbWUpOworICAgICAgICBhc3NlcnROb3ROdWxsKCIkbmFtZSAkdHlwZU5hbWUgbnVsbC1jaGVjayIsIGZvdW5kSXRlbSkKKyAgICAgICAgcmV0dXJuIGZvdW5kSXRlbQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMgYi9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCmluZGV4IGZmOTIzYmIuLmI1ZDk5MjAgMTAwNjQ0Ci0tLSBhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKKysrIGIvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpAQCAtMyw0ICszLDQgQEAKIGRpc3RyaWJ1dGlvblBhdGg9d3JhcHBlci9kaXN0cwogemlwU3RvcmVCYXNlPUdSQURMRV9VU0VSX0hPTUUKIHppcFN0b3JlUGF0aD13cmFwcGVyL2Rpc3RzCi1kaXN0cmlidXRpb25Vcmw9Li4vLi4vLi4vZXh0ZXJuYWwvZ3JhZGxlL2dyYWRsZS0xLjctYmluLnppcAorZGlzdHJpYnV0aW9uVXJsPS4uLy4uLy4uL2V4dGVybmFsL2dyYWRsZS9ncmFkbGUtMS45LWJpbi56aXAKZGlmZiAtLWdpdCBhL2phdmFkb2MuZ3JhZGxlIGIvamF2YWRvYy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwODQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFkb2MuZ3JhZGxlCkBAIC0wLDAgKzEsMTYgQEAKK2phdmFkb2MgeworICAgIGV4Y2x1ZGUgICAgICAgICAgICAgICAiKiovaW50ZXJuYWwvKioiCisgICAgb3B0aW9ucy5tZW1iZXJMZXZlbCA9IG9yZy5ncmFkbGUuZXh0ZXJuYWwuamF2YWRvYy5KYXZhZG9jTWVtYmVyTGV2ZWwuUFJPVEVDVEVECisKKyAgICB0aXRsZSAgICAgICAgICAgICAgICAgcHJvamVjdC5leHQucG9tTmFtZQorfQorCit0YXNrIGphdmFkb2NKYXIodHlwZTogSmFyLCBkZXBlbmRzT246amF2YWRvYykgeworICAgIGNsYXNzaWZpZXIgICAgICAgICAnamF2YWRvYycKKyAgICBmcm9tICAgICAgICAgICAgICAgamF2YWRvYy5kZXN0aW5hdGlvbkRpcgorfQorCisvLyBhZGQgamF2YWRvYyBqYXIgdGFza3MgYXMgYXJ0aWZhY3RzCithcnRpZmFjdHMgeworICAgIGFyY2hpdmVzIGphdmFkb2NKYXIKK30KZGlmZiAtLWdpdCBhL3B1Ymxpc2guZ3JhZGxlIGIvcHVibGlzaC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4YTMxOQotLS0gL2Rldi9udWxsCisrKyBiL3B1Ymxpc2guZ3JhZGxlCkBAIC0wLDAgKzEsODcgQEAKK2FwcGx5IHBsdWdpbjogJ3NpZ25pbmcnCisKK2RlZiBnZXRWZXJzaW9uKCkgeworICAgIGlmIChwcm9qZWN0LmhhcygicmVsZWFzZSIpKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0LmV4dC5iYXNlVmVyc2lvbgorICAgIH0KKworICAgIHJldHVybiBwcm9qZWN0LmV4dC5iYXNlVmVyc2lvbiArICctU05BUFNIT1QnCit9CisKK3ZlcnNpb24gPSBnZXRWZXJzaW9uKCkKKwordGFzayBwdWJsaXNoTG9jYWwodHlwZTogVXBsb2FkKSB7CisgICAgY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25zLmFyY2hpdmVzCisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgbWF2ZW5EZXBsb3llciB7CisgICAgICAgICAgICByZXBvc2l0b3J5KHVybDogdXJpKCIkcm9vdFByb2plY3QuZXh0LmFuZHJvaWRIb3N0T3V0L3JlcG8iKSkKKyAgICAgICAgfQorICAgIH0KK30KKworcHJvamVjdC5leHQuc29uYXR5cGVVc2VybmFtZSA9IGhhc1Byb3BlcnR5KCdzb25hdHlwZVVzZXJuYW1lJykgPyBzb25hdHlwZVVzZXJuYW1lIDogIiIKK3Byb2plY3QuZXh0LnNvbmF0eXBlUGFzc3dvcmQgPSBoYXNQcm9wZXJ0eSgnc29uYXR5cGVQYXNzd29yZCcpID8gc29uYXR5cGVQYXNzd29yZCA6ICIiCisKK3VwbG9hZEFyY2hpdmVzIHsKKyAgICByZXBvc2l0b3JpZXMgeworICAgICAgICBtYXZlbkRlcGxveWVyIHsKKyAgICAgICAgICAgIGJlZm9yZURlcGxveW1lbnQgeyBNYXZlbkRlcGxveW1lbnQgZGVwbG95bWVudCAtPgorICAgICAgICAgICAgICAgIGlmICghcHJvamVjdC5oYXMoInJlbGVhc2UiKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RvcEV4ZWN1dGlvbkV4Y2VwdGlvbigidXBsb2FkQXJjaGl2ZXMgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgcmVsZWFzZS5ncmFkbGUgaW5pdCBzY3JpcHQiKQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0LmV4dC5zb25hdHlwZVVzZXJuYW1lLmxlbmd0aCgpID09IDAgfHwgcHJvamVjdC5leHQuc29uYXR5cGVQYXNzd29yZC5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdG9wRXhlY3V0aW9uRXhjZXB0aW9uKCJ1cGxvYWRBcmNoaXZlcyBjYW5ub3QgYmUgY2FsbGVkIHdpdGhvdXQgc29uYXR5cGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIikKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzaWduaW5nLnNpZ25Qb20oZGVwbG95bWVudCkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVwb3NpdG9yeSh1cmw6ICJodHRwczovL29zcy5zb25hdHlwZS5vcmcvc2VydmljZS9sb2NhbC9zdGFnaW5nL2RlcGxveS9tYXZlbjIvIikgeworICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uKHVzZXJOYW1lOiBwcm9qZWN0LmV4dC5zb25hdHlwZVVzZXJuYW1lLCBwYXNzd29yZDogcHJvamVjdC5leHQuc29uYXR5cGVQYXNzd29yZCkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9tLnByb2plY3QgeworICAgICAgICAgICAgICAgIG5hbWUgcHJvamVjdC5leHQucG9tTmFtZQorICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIHByb2plY3QuZXh0LnBvbURlc2MKKyAgICAgICAgICAgICAgICB1cmwgJ2h0dHA6Ly90b29scy5hbmRyb2lkLmNvbScKKyAgICAgICAgICAgICAgICBpbmNlcHRpb25ZZWFyICcyMDA3JworCisgICAgICAgICAgICAgICAgbGljZW5zZXMgeworICAgICAgICAgICAgICAgICAgICBsaWNlbnNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgJ1RoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAnCisgICAgICAgICAgICAgICAgICAgICAgICB1cmwgJ2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQnCisgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24gJ3JlcG8nCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzY20geworICAgICAgICAgICAgICAgICAgICB1cmwgJ2h0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3Rvb2xzL2J1aWxkJworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uICdnaXQ6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vdG9vbHMvYnVpbGQuZ2l0JworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXZlbG9wZXJzIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2ZWxvcGVyIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgJ1RoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QnCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIGN1c3RvbSB0YXNrcyBmb3IgY3JlYXRpbmcgc291cmNlL2phdmFkb2MgamFycwordGFzayBzb3VyY2VzSmFyKHR5cGU6IEphciwgZGVwZW5kc09uOmNsYXNzZXMpIHsKKyAgICBjbGFzc2lmaWVyID0gJ3NvdXJjZXMnCisgICAgZnJvbSBzb3VyY2VTZXRzLm1haW4uYWxsU291cmNlCit9CisKKy8vIGFkZCBzb3VyY2UgamFyIHRhc2tzIGFzIGFydGlmYWN0cworYXJ0aWZhY3RzIHsKKyAgICBhcmNoaXZlcyBqYXIKKyAgICBhcmNoaXZlcyBzb3VyY2VzSmFyCit9CisKK3NpZ25pbmcgeworICAgIHJlcXVpcmVkIHsgcHJvamVjdC5oYXMoInJlbGVhc2UiKSAmJiBncmFkbGUudGFza0dyYXBoLmhhc1Rhc2soInVwbG9hZEFyY2hpdmVzIikgfQorICAgIHNpZ24gY29uZmlndXJhdGlvbnMuYXJjaGl2ZXMKK30KZGlmZiAtLWdpdCBhL3Rlc3RzLzNyZFBhcnR5VGVzdHMvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvM3JkUGFydHlUZXN0cy9idWlsZC5ncmFkbGUKaW5kZXggNjJhNDQwNS4uYjg5OWY5YSAxMDA2NDQKLS0tIGEvdGVzdHMvM3JkUGFydHlUZXN0cy9idWlsZC5ncmFkbGUKKysrIGIvdGVzdHMvM3JkUGFydHlUZXN0cy9idWlsZC5ncmFkbGUKQEAgLTMsNiArMyw2IEBACiAgICAgICAgIG1hdmVuIHsgdXJsICcuLi8uLi8uLi8uLi9vdXQvaG9zdC9ncmFkbGUvcmVwbycgfQogICAgIH0KICAgICBkZXBlbmRlbmNpZXMgewotICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjUuMC1TTkFQU0hPVCcKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC43LjAtU05BUFNIT1QnCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvM3JkUGFydHlUZXN0cy9idWlsZFNyYy9idWlsZC5ncmFkbGUgYi90ZXN0cy8zcmRQYXJ0eVRlc3RzL2J1aWxkU3JjL2J1aWxkLmdyYWRsZQppbmRleCAyYjc4MTA0Li44ZTFjNzU3IDEwMDY0NAotLS0gYS90ZXN0cy8zcmRQYXJ0eVRlc3RzL2J1aWxkU3JjL2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy8zcmRQYXJ0eVRlc3RzL2J1aWxkU3JjL2J1aWxkLmdyYWRsZQpAQCAtNiw1ICs2LDUgQEAKIH0KIAogZGVwZW5kZW5jaWVzIHsKLSAgICBjb21waWxlICdjb20uYW5kcm9pZC50b29scy5idWlsZDpidWlsZGVyLXRlc3QtYXBpOjAuNS4wLVNOQVBTSE9UJworICAgIGNvbXBpbGUgJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmJ1aWxkZXItdGVzdC1hcGk6MC43LjAtU05BUFNIT1QnCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvM3JkUGFydHlUZXN0cy9idWlsZFNyYy9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2Jhc2ljL2J1aWxkc2NyaXB0L0Zha2VEZXZpY2UuamF2YSBiL3Rlc3RzLzNyZFBhcnR5VGVzdHMvYnVpbGRTcmMvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9idWlsZHNjcmlwdC9GYWtlRGV2aWNlLmphdmEKaW5kZXggOWZiZTllMS4uZGY4MTBmZSAxMDA2NDQKLS0tIGEvdGVzdHMvM3JkUGFydHlUZXN0cy9idWlsZFNyYy9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2Jhc2ljL2J1aWxkc2NyaXB0L0Zha2VEZXZpY2UuamF2YQorKysgYi90ZXN0cy8zcmRQYXJ0eVRlc3RzL2J1aWxkU3JjL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvYnVpbGRzY3JpcHQvRmFrZURldmljZS5qYXZhCkBAIC0xMiw2ICsxMiw3IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKQEAgLTEyMCw4ICsxMjEsOCBAQAogICAgIH0KIAogICAgIEBOb25OdWxsCi0gICAgcHVibGljIFN0cmluZyBnZXRBYmkoKSB7Ci0gICAgICAgIHJldHVybiAiZmFrZSI7CisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBYmlzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiZmFrZSIpOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0RGVuc2l0eSgpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGwvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvYWlkbC9idWlsZC5ncmFkbGUKaW5kZXggMjg5MGFlZC4uZGFhY2VjYyAxMDA2NDQKLS0tIGEvdGVzdHMvYWlkbC9idWlsZC5ncmFkbGUKKysrIGIvdGVzdHMvYWlkbC9idWlsZC5ncmFkbGUKQEAgLTMsNyArMyw3IEBACiAgICAgICAgIG1hdmVuIHsgdXJsICcuLi8uLi8uLi8uLi9vdXQvaG9zdC9ncmFkbGUvcmVwbycgfQogICAgIH0KICAgICBkZXBlbmRlbmNpZXMgewotICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjUuMC1TTkFQU0hPVCcKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC43LjAtU05BUFNIT1QnCiAgICAgfQogfQogYXBwbHkgcGx1Z2luOiAnYW5kcm9pZCcKZGlmZiAtLWdpdCBhL3Rlc3RzL2FwaS9idWlsZC5ncmFkbGUgYi90ZXN0cy9hcGkvYnVpbGQuZ3JhZGxlCmluZGV4IDYyYTQ0MDUuLmI4OTlmOWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwaS9idWlsZC5ncmFkbGUKKysrIGIvdGVzdHMvYXBpL2J1aWxkLmdyYWRsZQpAQCAtMyw2ICszLDYgQEAKICAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNS4wLVNOQVBTSE9UJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hcHBsaWJ0ZXN0L2J1aWxkLmdyYWRsZSBiL3Rlc3RzL2FwcGxpYnRlc3QvYnVpbGQuZ3JhZGxlCmluZGV4IDYyYTQ0MDUuLmI4OTlmOWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcGxpYnRlc3QvYnVpbGQuZ3JhZGxlCisrKyBiL3Rlc3RzL2FwcGxpYnRlc3QvYnVpbGQuZ3JhZGxlCkBAIC0zLDYgKzMsNiBAQAogICAgICAgICBtYXZlbiB7IHVybCAnLi4vLi4vLi4vLi4vb3V0L2hvc3QvZ3JhZGxlL3JlcG8nIH0KICAgICB9CiAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC41LjAtU05BUFNIT1QnCisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FydGlmYWN0QXBpL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL2FydGlmYWN0QXBpL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTE4MzgyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXJ0aWZhY3RBcGkvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsMTA1IEBACitidWlsZHNjcmlwdCB7CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CisgICAgfQorICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJworICAgIH0KK30KKworYXBwbHkgcGx1Z2luOiAnYW5kcm9pZCcKKworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuQXJ0aWZhY3RNZXRhRGF0YQoraW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkZXIubW9kZWwuU291cmNlUHJvdmlkZXIKKworYW5kcm9pZC5yZWdpc3RlckFydGlmYWN0VHlwZSgiX190ZXN0X18iLCBmYWxzZSwgQXJ0aWZhY3RNZXRhRGF0YS5UWVBFX0pBVkEpCisKK2FuZHJvaWQuYnVpbGRUeXBlcy5hbGwgeyB0eXBlIC0+CisgICAgcHJvamVjdC5hbmRyb2lkLnJlZ2lzdGVyQnVpbGRUeXBlU291cmNlUHJvdmlkZXIoIl9fdGVzdF9fIiwgdHlwZSwgZ2V0UHJvdmlkZXIoImJ1aWxkVHlwZTokdHlwZS5uYW1lIikpCit9CisKK2FuZHJvaWQucHJvZHVjdEZsYXZvcnMuYWxsIHsgZmxhdm9yIC0+CisgICAgcHJvamVjdC5hbmRyb2lkLnJlZ2lzdGVyUHJvZHVjdEZsYXZvclNvdXJjZVByb3ZpZGVyKCJfX3Rlc3RfXyIsIGZsYXZvciwgZ2V0UHJvdmlkZXIoInByb2R1Y3RGbGF2b3I6JGZsYXZvci5uYW1lIikpCit9CisKK2FuZHJvaWQuYXBwbGljYXRpb25WYXJpYW50cy5hbGwgeyB2YXJpYW50IC0+CisgICAgcHJvamVjdC5hbmRyb2lkLnJlZ2lzdGVySmF2YUFydGlmYWN0KAorICAgICAgICAgICAgIl9fdGVzdF9fIiwKKyAgICAgICAgICAgIHZhcmlhbnQsCisgICAgICAgICAgICAiYXNzZW1ibGU6JHZhcmlhbnQubmFtZSIsCisgICAgICAgICAgICAiY29tcGlsZTokdmFyaWFudC5uYW1lIiwKKyAgICAgICAgICAgIG5ldyBGaWxlKCJjbGFzc2VzRm9sZGVyOiR2YXJpYW50Lm5hbWUiKSwKKyAgICAgICAgICAgIGdldFByb3ZpZGVyKCJwcm92aWRlcjokdmFyaWFudC5uYW1lIikpCit9CisKK2FuZHJvaWQgeworICAgIGNvbXBpbGVTZGtWZXJzaW9uIDE1CisgICAgYnVpbGRUb29sc1ZlcnNpb24gIjE4LjAuMSIKKworICAgIGZsYXZvckdyb3VwcyAgInByaWNpbmciLCAicmVsZWFzZVR5cGUiCisKKyAgICBwcm9kdWN0Rmxhdm9ycyB7CisKKyAgICAgICAgYmV0YSB7CisgICAgICAgICAgICBmbGF2b3JHcm91cCAicmVsZWFzZVR5cGUiCisgICAgICAgIH0KKworICAgICAgICBub3JtYWwgeworICAgICAgICAgICAgZmxhdm9yR3JvdXAgInJlbGVhc2VUeXBlIgorICAgICAgICB9CisKKyAgICAgICAgZnJlZSB7CisgICAgICAgICAgICBmbGF2b3JHcm91cCAicHJpY2luZyIKKyAgICAgICAgfQorCisgICAgICAgIHBhaWQgeworICAgICAgICAgICAgZmxhdm9yR3JvdXAgInByaWNpbmciCisgICAgICAgIH0KKyAgICB9Cit9CisKK3B1YmxpYyBjbGFzcyBTb3VyY2VQcm92aWRlckltcGwgaW1wbGVtZW50cyBTb3VyY2VQcm92aWRlciwgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICBTb3VyY2VQcm92aWRlckltcGwoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZQorICAgIH0KKyAgICAKKyAgICBGaWxlIGdldE1hbmlmZXN0RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKG5hbWUpCisgICAgfQorCisgICAgQ29sbGVjdGlvbjxGaWxlPiBnZXRKYXZhRGlyZWN0b3JpZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKQorICAgIH0KKworICAgIENvbGxlY3Rpb248RmlsZT4gZ2V0UmVzb3VyY2VzRGlyZWN0b3JpZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKQorICAgIH0KKworICAgIENvbGxlY3Rpb248RmlsZT4gZ2V0QWlkbERpcmVjdG9yaWVzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkKKyAgICB9CisKKyAgICBDb2xsZWN0aW9uPEZpbGU+IGdldFJlbmRlcnNjcmlwdERpcmVjdG9yaWVzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkKKyAgICB9CisKKyAgICBDb2xsZWN0aW9uPEZpbGU+IGdldEpuaURpcmVjdG9yaWVzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkKKyAgICB9CisKKyAgICBDb2xsZWN0aW9uPEZpbGU+IGdldFJlc0RpcmVjdG9yaWVzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkKKyAgICB9CisKKyAgICBDb2xsZWN0aW9uPEZpbGU+IGdldEFzc2V0c0RpcmVjdG9yaWVzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkKKyAgICAgfQorfQorCitTb3VyY2VQcm92aWRlciBnZXRQcm92aWRlcihTdHJpbmcgbmFtZSkgeworICAgcmV0dXJuIG5ldyBTb3VyY2VQcm92aWRlckltcGwobmFtZSkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9hcnRpZmFjdEFwaS9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvYXJ0aWZhY3RBcGkvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzM1YTViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXJ0aWZhY3RBcGkvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDEzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3RzLm92ZXJsYXkyIj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNvbiI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5NYWluIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9hcnRpZmFjdEFwaS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL292ZXJsYXkyL01haW4uamF2YSBiL3Rlc3RzL2FydGlmYWN0QXBpL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvb3ZlcmxheTIvTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YTBhODMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hcnRpZmFjdEFwaS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL292ZXJsYXkyL01haW4uamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3RzLm92ZXJsYXkyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBNYWluIGV4dGVuZHMgQWN0aXZpdHkKK3sKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkKKyAgICB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1haW4pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FydGlmYWN0QXBpL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9pY29uLnBuZyBiL3Rlc3RzL2FydGlmYWN0QXBpL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDdjNjlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXJ0aWZhY3RBcGkvc3JjL21haW4vcmVzL2RyYXdhYmxlL2ljb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2FydGlmYWN0QXBpL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9ub19vdmVybGF5LnBuZyBiL3Rlc3RzL2FydGlmYWN0QXBpL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9ub19vdmVybGF5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2UxYWRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXJ0aWZhY3RBcGkvc3JjL21haW4vcmVzL2RyYXdhYmxlL25vX292ZXJsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2FydGlmYWN0QXBpL3NyYy9tYWluL3Jlcy9sYXlvdXQvbWFpbi54bWwgYi90ZXN0cy9hcnRpZmFjdEFwaS9zcmMvbWFpbi9yZXMvbGF5b3V0L21haW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDA1NDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hcnRpZmFjdEFwaS9zcmMvbWFpbi9yZXMvbGF5b3V0L21haW4ueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICA+CisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL25vX292ZXJsYXkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm9fb3ZlcmxheSIgLz4KKzwvTGluZWFyTGF5b3V0PgorCmRpZmYgLS1naXQgYS90ZXN0cy9hcnRpZmFjdEFwaS9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvdGVzdHMvYXJ0aWZhY3RBcGkvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTQyMGU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXJ0aWZhY3RBcGkvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cmVzb3VyY2VzPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiPl9UZXN0LU92ZXJsYXkyPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2Fzc2V0cy9idWlsZC5ncmFkbGUgYi90ZXN0cy9hc3NldHMvYnVpbGQuZ3JhZGxlCmluZGV4IGYyMTBmY2YuLmVmM2QwYWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2Fzc2V0cy9idWlsZC5ncmFkbGUKKysrIGIvdGVzdHMvYXNzZXRzL2J1aWxkLmdyYWRsZQpAQCAtMyw3ICszLDcgQEAKICAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNS4wLVNOQVBTSE9UJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2F0dHJPcmRlci9idWlsZC5ncmFkbGUgYi90ZXN0cy9hdHRyT3JkZXIvYnVpbGQuZ3JhZGxlCmluZGV4IDYyYTQ0MDUuLmI4OTlmOWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F0dHJPcmRlci9idWlsZC5ncmFkbGUKKysrIGIvdGVzdHMvYXR0ck9yZGVyL2J1aWxkLmdyYWRsZQpAQCAtMyw2ICszLDYgQEAKICAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNS4wLVNOQVBTSE9UJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvcmVwby9idWlsZC5ncmFkbGUgYi90ZXN0cy9hdXRvcmVwby9idWlsZC5ncmFkbGUKaW5kZXggNzBhZmQyZS4uZDEwYmFkYiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b3JlcG8vYnVpbGQuZ3JhZGxlCisrKyBiL3Rlc3RzL2F1dG9yZXBvL2J1aWxkLmdyYWRsZQpAQCAtMyw3ICszLDcgQEAKICAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNS4wLVNOQVBTSE9UJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKICAgICB9CiB9CiBhcHBseSBwbHVnaW46ICdhbmRyb2lkJwpkaWZmIC0tZ2l0IGEvdGVzdHMvYmFzaWMvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvYmFzaWMvYnVpbGQuZ3JhZGxlCmluZGV4IDM4ZGNjNTIuLmIxYzk3NDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2Jhc2ljL2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy9iYXNpYy9idWlsZC5ncmFkbGUKQEAgLTMsNyArMyw3IEBACiAgICAgICAgIG1hdmVuIHsgdXJsICcuLi8uLi8uLi8uLi9vdXQvaG9zdC9ncmFkbGUvcmVwbycgfQogICAgIH0KICAgICBkZXBlbmRlbmNpZXMgewotICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjUuMC1TTkFQU0hPVCcKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC43LjAtU05BUFNIT1QnCiAgICAgfQogfQogYXBwbHkgcGx1Z2luOiAnYW5kcm9pZCcKQEAgLTQwLDggKzQwLDE0IEBACiAgICAgICAgIG1pblNka1ZlcnNpb24gMTYKICAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiAxNgogCi0gICAgICAgIGJ1aWxkQ29uZmlnICJwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIERFRkFVTFQgPSB0cnVlOyIsIFwKLSAgICAgICAgICAgICAgICAgICAgInByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGT08gPSBcImZvb1wiOyIKKyAgICAgICAgdGVzdEluc3RydW1lbnRhdGlvblJ1bm5lciAiYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCisgICAgICAgIHRlc3RIYW5kbGVQcm9maWxpbmcgZmFsc2UKKworICAgICAgICBidWlsZENvbmZpZ0ZpZWxkICJib29sZWFuIiwgIkRFRkFVTFQiLCAidHJ1ZSIKKyAgICAgICAgYnVpbGRDb25maWdGaWVsZCAiU3RyaW5nIiwgIkZPTyIsICJcImZvb1wiIgorCisgICAgICAgIHJlc0NvbmZpZyAiZW4iCisgICAgICAgIHJlc0NvbmZpZ3MgIm5vZHBpIiwgImhkcGkiCiAgICAgfQogCiAgICAgYnVpbGRUeXBlcyB7CkBAIC00OSw3ICs1NSw3IEBACiAgICAgICAgICAgICBwYWNrYWdlTmFtZVN1ZmZpeCAiLmRlYnVnIgogICAgICAgICAgICAgc2lnbmluZ0NvbmZpZyBzaWduaW5nQ29uZmlncy5teUNvbmZpZwogCi0gICAgICAgICAgICBidWlsZENvbmZpZyAicHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUJVRzIgPSBmYWxzZTsiCisgICAgICAgICAgICBidWlsZENvbmZpZ0ZpZWxkICJTdHJpbmciLCAiRk9PIiwgIlwiYmFyXCIiCiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2Jhc2ljL3NyYy9pbnN0cnVtZW50VGVzdC9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2Jhc2ljL01haW5UZXN0LmphdmEgYi90ZXN0cy9iYXNpYy9zcmMvaW5zdHJ1bWVudFRlc3QvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9NYWluVGVzdC5qYXZhCmluZGV4IDdjZjczMjkuLjlmNGIyZGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2Jhc2ljL3NyYy9pbnN0cnVtZW50VGVzdC9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2Jhc2ljL01haW5UZXN0LmphdmEKKysrIGIvdGVzdHMvYmFzaWMvc3JjL2luc3RydW1lbnRUZXN0L2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvTWFpblRlc3QuamF2YQpAQCAtMzQsNSArMzQsMTAgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlY29uZGl0aW9ucygpIHsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChtVGV4dFZpZXcpOwogICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkQ29uZmlnKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIEJ1aWxkQ29uZmlnLkZPTyk7CisgICAgfQogfQogCmRpZmYgLS1naXQgYS90ZXN0cy9iYXNpY011bHRpRmxhdm9ycy9idWlsZC5ncmFkbGUgYi90ZXN0cy9iYXNpY011bHRpRmxhdm9ycy9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiY2U0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDM1IEBACitidWlsZHNjcmlwdCB7CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CisgICAgfQorICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJworICAgIH0KK30KK2FwcGx5IHBsdWdpbjogJ2FuZHJvaWQnCisKK2FuZHJvaWQgeworICAgIGNvbXBpbGVTZGtWZXJzaW9uIDE1CisgICAgYnVpbGRUb29sc1ZlcnNpb24gIjE4LjAuMSIKKworICAgIGZsYXZvckdyb3VwcyAgInByaWNpbmciLCAicmVsZWFzZVR5cGUiCisKKyAgICBwcm9kdWN0Rmxhdm9ycyB7CisKKyAgICAgICAgYmV0YSB7CisgICAgICAgICAgICBmbGF2b3JHcm91cCAicmVsZWFzZVR5cGUiCisgICAgICAgIH0KKworICAgICAgICBub3JtYWwgeworICAgICAgICAgICAgZmxhdm9yR3JvdXAgInJlbGVhc2VUeXBlIgorICAgICAgICB9CisKKyAgICAgICAgZnJlZSB7CisgICAgICAgICAgICBmbGF2b3JHcm91cCAicHJpY2luZyIKKyAgICAgICAgfQorCisgICAgICAgIHBhaWQgeworICAgICAgICAgICAgZmxhdm9yR3JvdXAgInByaWNpbmciCisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvYmFzaWNNdWx0aUZsYXZvcnMvc3JjL2YxL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9iYXNpY011bHRpRmxhdm9ycy9zcmMvZjEvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTU0YzA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYmFzaWNNdWx0aUZsYXZvcnMvc3JjL2YxL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5fVGVzdC1GbGF2b3JlZC1mMTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dCI+RjEgdGV4dDwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS90ZXN0cy9iYXNpY011bHRpRmxhdm9ycy9zcmMvZjFTdGFnaW5nL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9iYXNpY011bHRpRmxhdm9ycy9zcmMvZjFTdGFnaW5nL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyNDIyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL3NyYy9mMVN0YWdpbmcvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cmVzb3VyY2VzPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dCI+RjEtU3RhZ2luZyB0ZXh0PC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL3NyYy9mMi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvYmFzaWNNdWx0aUZsYXZvcnMvc3JjL2YyL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwYmI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL3NyYy9mMi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgcGFja2FnZT0iIj4KKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnRlc3RzLmZsYXZvcmVkLk90aGVyQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL290aGVyX2FjdGl2aXR5Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL3NyYy9mMi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcmVkL090aGVyQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL3NyYy9mMi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcmVkL090aGVyQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmZhYzljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYmFzaWNNdWx0aUZsYXZvcnMvc3JjL2YyL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9yZWQvT3RoZXJBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdHMuZmxhdm9yZWQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworcHVibGljIGNsYXNzIE90aGVyQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eQoreworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKQorICAgIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubWFpbjIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL3NyYy9mMi9yZXMvbGF5b3V0L21haW4yLnhtbCBiL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL3NyYy9mMi9yZXMvbGF5b3V0L21haW4yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGMzYzQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYmFzaWNNdWx0aUZsYXZvcnMvc3JjL2YyL3Jlcy9sYXlvdXQvbWFpbjIueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICA+Cis8VGV4dFZpZXcKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDp0ZXh0PSJUZXN0IEFwcCAtIEZsYXZvcmVkIC0gZjIiCisgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0MiIKKyAgICAvPgorPC9MaW5lYXJMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL3NyYy9mMi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvdGVzdHMvYmFzaWNNdWx0aUZsYXZvcnMvc3JjL2YyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI1M2ZkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL3NyYy9mMi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxyZXNvdXJjZXM+CisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSI+X1Rlc3QtRmxhdm9yZWQtZjI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im90aGVyX2FjdGl2aXR5Ij5fVGVzdC1mMi1hY3QyPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9iYXNpY011bHRpRmxhdm9ycy9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMWMzMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9iYXNpY011bHRpRmxhdm9ycy9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQudGVzdHMuZmxhdm9yZWQiPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIiBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY29uIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLk1haW4iCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9yZWQvTWFpbi5qYXZhIGIvdGVzdHMvYmFzaWNNdWx0aUZsYXZvcnMvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9mbGF2b3JlZC9NYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkZWJkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9yZWQvTWFpbi5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdHMuZmxhdm9yZWQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworcHVibGljIGNsYXNzIE1haW4gZXh0ZW5kcyBBY3Rpdml0eQoreworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKQorICAgIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubWFpbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYmFzaWNNdWx0aUZsYXZvcnMvc3JjL21haW4vcmVzL2RyYXdhYmxlL2ljb24ucG5nIGIvdGVzdHMvYmFzaWNNdWx0aUZsYXZvcnMvc3JjL21haW4vcmVzL2RyYXdhYmxlL2ljb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2M2OWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9iYXNpY011bHRpRmxhdm9ycy9zcmMvbWFpbi9yZXMvZHJhd2FibGUvaWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvYmFzaWNNdWx0aUZsYXZvcnMvc3JjL21haW4vcmVzL2xheW91dC9tYWluLnhtbCBiL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL3NyYy9tYWluL3Jlcy9sYXlvdXQvbWFpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0ZTk3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Jhc2ljTXVsdGlGbGF2b3JzL3NyYy9tYWluL3Jlcy9sYXlvdXQvbWFpbi54bWwKQEAgLTAsMCArMSwxNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgID4KKzxUZXh0VmlldworICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCisgICAgLz4KKzwvTGluZWFyTGF5b3V0PgorCmRpZmYgLS1naXQgYS90ZXN0cy9iYXNpY011bHRpRmxhdm9ycy9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvdGVzdHMvYmFzaWNNdWx0aUZsYXZvcnMvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQ4MjYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYmFzaWNNdWx0aUZsYXZvcnMvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cmVzb3VyY2VzPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiPiMjIzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dCI+ZGVmYXVsdCB0ZXh0PC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDkyZmExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsMTAgQEAKK3Rhc2soInByaW50VGFza3MiKSA8PCB7CisgICAgcHJvamVjdC50YXNrcy5lYWNoIHsgdCAtPgorICAgICAgICBwcmludCgiJHt0Lm5hbWV9IC0+ICIpCisgICAgICAgIHQuZGVwZW5kc09uLmVhY2ggeyB0MiAtPgorICAgICAgICAgICAgaWYgKHQyIGluc3RhbmNlb2YgVGFzaykKKyAgICAgICAgICAgICAgICBwcmludCgiJHt0Mi5uYW1lfSwgIikKKyAgICAgICAgfQorICAgICAgICBwcmludGxuKCIiKQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9kZXBlbmRlbmNpZXMvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvZGVwZW5kZW5jaWVzL2J1aWxkLmdyYWRsZQppbmRleCAwZjE1YzAyLi5hNzgxMGFjIDEwMDY0NAotLS0gYS90ZXN0cy9kZXBlbmRlbmNpZXMvYnVpbGQuZ3JhZGxlCisrKyBiL3Rlc3RzL2RlcGVuZGVuY2llcy9idWlsZC5ncmFkbGUKQEAgLTMsNyArMyw3IEBACiAgICAgICAgIG1hdmVuIHsgdXJsICcuLi8uLi8uLi8uLi9vdXQvaG9zdC9ncmFkbGUvcmVwbycgfQogICAgIH0KICAgICBkZXBlbmRlbmNpZXMgewotICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjUuMC1TTkFQU0hPVCcKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC43LjAtU05BUFNIT1QnCiAgICAgfQogfQogYXBwbHkgcGx1Z2luOiAnYW5kcm9pZCcKZGlmZiAtLWdpdCBhL3Rlc3RzL2RlcGVuZGVuY3lDaGVja2VyL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL2RlcGVuZGVuY3lDaGVja2VyL2J1aWxkLmdyYWRsZQppbmRleCBkNTkxNDA1Li43NzFmYTU0IDEwMDY0NAotLS0gYS90ZXN0cy9kZXBlbmRlbmN5Q2hlY2tlci9idWlsZC5ncmFkbGUKKysrIGIvdGVzdHMvZGVwZW5kZW5jeUNoZWNrZXIvYnVpbGQuZ3JhZGxlCkBAIC0zLDcgKzMsNyBAQAogICAgICAgICBtYXZlbiB7IHVybCAnLi4vLi4vLi4vLi4vb3V0L2hvc3QvZ3JhZGxlL3JlcG8nIH0KICAgICB9CiAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC41LjAtU05BUFNIT1QnCisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJwogICAgIH0KIH0KIGFwcGx5IHBsdWdpbjogJ2FuZHJvaWQnCmRpZmYgLS1naXQgYS90ZXN0cy9mbGF2b3JlZC9idWlsZC5ncmFkbGUgYi90ZXN0cy9mbGF2b3JlZC9idWlsZC5ncmFkbGUKaW5kZXggZWRjNmZhNS4uZDA4YzNmZSAxMDA2NDQKLS0tIGEvdGVzdHMvZmxhdm9yZWQvYnVpbGQuZ3JhZGxlCisrKyBiL3Rlc3RzL2ZsYXZvcmVkL2J1aWxkLmdyYWRsZQpAQCAtMyw3ICszLDcgQEAKICAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNS4wLVNOQVBTSE9UJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKICAgICB9CiB9CiBhcHBseSBwbHVnaW46ICdhbmRyb2lkJwpAQCAtMTUsMjggKzE1LDIzIEBACiAgICAgdGVzdEJ1aWxkVHlwZSA9ICJzdGFnaW5nIgogCiAgICAgZGVmYXVsdENvbmZpZyB7Ci0gICAgICAgIGJ1aWxkQ29uZmlnICJwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIERFRkFVTFQgPSB0cnVlOyIsIFwKLSAgICAgICAgICAgICAgICAgICAgInByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGT08gPSBcImZvb1wiOyIKICAgICB9CiAKICAgICBwcm9kdWN0Rmxhdm9ycyB7CiAgICAgICAgIGYxIHsKICAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gImNvbS5hbmRyb2lkLnRlc3RzLmZsYXZvcmVkLmYxIgogICAgICAgICAgICAgdmVyc2lvbk5hbWUgPSAiMS4wLjAtZjEiCi0gICAgICAgICAgICBidWlsZENvbmZpZyAicHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZMQVZPUiA9IFwiZjFcIjsiCiAgICAgICAgIH0KICAgICAgICAgZjIgewogICAgICAgICAgICAgcGFja2FnZU5hbWUgPSAiY29tLmFuZHJvaWQudGVzdHMuZmxhdm9yZWQuZjIiCiAgICAgICAgICAgICB2ZXJzaW9uTmFtZSA9ICIxLjAuMC1mMiIKLSAgICAgICAgICAgIGJ1aWxkQ29uZmlnICJwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkxBVk9SID0gXCJmMlwiOyIKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIGJ1aWxkVHlwZXMgewogICAgICAgICBkZWJ1ZyB7CiAgICAgICAgICAgICBwYWNrYWdlTmFtZVN1ZmZpeCA9ICIuZGVidWciCiAgICAgICAgICAgICB2ZXJzaW9uTmFtZVN1ZmZpeCA9ICIuRCIKLSAgICAgICAgICAgIGJ1aWxkQ29uZmlnICJwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIERFQlVHMiA9IGZhbHNlOyIKICAgICAgICAgfQogICAgICAgICBzdGFnaW5nIHsKICAgICAgICAgICAgIHBhY2thZ2VOYW1lU3VmZml4ID0gIi5zdGFnaW5nIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmxhdm9yZWQvc3JjL2YxL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9mbGF2b3JlZC9zcmMvZjEvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCBmMDgxZjQwLi43MTU0YzA0IDEwMDY0NAotLS0gYS90ZXN0cy9mbGF2b3JlZC9zcmMvZjEvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi90ZXN0cy9mbGF2b3JlZC9zcmMvZjEvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMSw0ICsxLDUgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8cmVzb3VyY2VzPgogICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiPl9UZXN0LUZsYXZvcmVkLWYxPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0Ij5GMSB0ZXh0PC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZsYXZvcmVkL3NyYy9mMVN0YWdpbmcvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3Rlc3RzL2ZsYXZvcmVkL3NyYy9mMVN0YWdpbmcvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODI0MjJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmxhdm9yZWQvc3JjL2YxU3RhZ2luZy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxyZXNvdXJjZXM+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0Ij5GMS1TdGFnaW5nIHRleHQ8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmxhdm9yZWQvc3JjL2luc3RydW1lbnRUZXN0L2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9yZWQvTWFpblRlc3QuamF2YSBiL3Rlc3RzL2ZsYXZvcmVkL3NyYy9pbnN0cnVtZW50VGVzdC9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcmVkL01haW5UZXN0LmphdmEKaW5kZXggZjQ0ZTBmMC4uYjIyYzUzZCAxMDA2NDQKLS0tIGEvdGVzdHMvZmxhdm9yZWQvc3JjL2luc3RydW1lbnRUZXN0L2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9yZWQvTWFpblRlc3QuamF2YQorKysgYi90ZXN0cy9mbGF2b3JlZC9zcmMvaW5zdHJ1bWVudFRlc3QvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9mbGF2b3JlZC9NYWluVGVzdC5qYXZhCkBAIC0zNCw1ICszNCwxNCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVjb25kaXRpb25zKCkgewogICAgICAgICBhc3NlcnROb3ROdWxsKG1UZXh0Vmlldyk7CiAgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2luZ1RleHQoKSB7CisgICAgICAgIGlmICgiZjEiLmVxdWFscyhCdWlsZENvbmZpZy5GTEFWT1IpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkYxLVN0YWdpbmcgdGV4dCIsIG1UZXh0Vmlldy5nZXRUZXh0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWZhdWx0IHRleHQiLCBtVGV4dFZpZXcuZ2V0VGV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvZmxhdm9yZWQvc3JjL21haW4vcmVzL2xheW91dC9tYWluLnhtbCBiL3Rlc3RzL2ZsYXZvcmVkL3NyYy9tYWluL3Jlcy9sYXlvdXQvbWFpbi54bWwKaW5kZXggMDU4NzE1Zi4uOWQ0ZTk3NiAxMDA2NDQKLS0tIGEvdGVzdHMvZmxhdm9yZWQvc3JjL21haW4vcmVzL2xheW91dC9tYWluLnhtbAorKysgYi90ZXN0cy9mbGF2b3JlZC9zcmMvbWFpbi9yZXMvbGF5b3V0L21haW4ueG1sCkBAIC03LDcgKzcsNyBAQAogPFRleHRWaWV3CiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6dGV4dD0iVGVzdCBBcHAgLSBGbGF2b3JlZCIKKyAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dCIKICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCiAgICAgLz4KIDwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmxhdm9yZWQvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3Rlc3RzL2ZsYXZvcmVkL3NyYy9tYWluL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggMjRkYjU0NS4uNDZkODI2MCAxMDA2NDQKLS0tIGEvdGVzdHMvZmxhdm9yZWQvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi90ZXN0cy9mbGF2b3JlZC9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0xLDQgKzEsNSBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KIDxyZXNvdXJjZXM+CiAgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSI+IyMjPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0Ij5kZWZhdWx0IHRleHQ8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmxhdm9ybGliL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL2ZsYXZvcmxpYi9idWlsZC5ncmFkbGUKaW5kZXggZjIxMGZjZi4uZWYzZDBhYSAxMDA2NDQKLS0tIGEvdGVzdHMvZmxhdm9ybGliL2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy9mbGF2b3JsaWIvYnVpbGQuZ3JhZGxlCkBAIC0zLDcgKzMsNyBAQAogICAgICAgICBtYXZlbiB7IHVybCAnLi4vLi4vLi4vLi4vb3V0L2hvc3QvZ3JhZGxlL3JlcG8nIH0KICAgICB9CiAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC41LjAtU05BUFNIT1QnCisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvZmxhdm9ybGliV2l0aEZhaWxlZFRlc3RzL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL2ZsYXZvcmxpYldpdGhGYWlsZWRUZXN0cy9idWlsZC5ncmFkbGUKaW5kZXggZjIxMGZjZi4uZWYzZDBhYSAxMDA2NDQKLS0tIGEvdGVzdHMvZmxhdm9ybGliV2l0aEZhaWxlZFRlc3RzL2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy9mbGF2b3JsaWJXaXRoRmFpbGVkVGVzdHMvYnVpbGQuZ3JhZGxlCkBAIC0zLDcgKzMsNyBAQAogICAgICAgICBtYXZlbiB7IHVybCAnLi4vLi4vLi4vLi4vb3V0L2hvc3QvZ3JhZGxlL3JlcG8nIH0KICAgICB9CiAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC41LjAtU05BUFNIT1QnCisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvZmxhdm9ycy9idWlsZC5ncmFkbGUgYi90ZXN0cy9mbGF2b3JzL2J1aWxkLmdyYWRsZQppbmRleCBjZDgxZjk5Li4xYjFjNjgzIDEwMDY0NAotLS0gYS90ZXN0cy9mbGF2b3JzL2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy9mbGF2b3JzL2J1aWxkLmdyYWRsZQpAQCAtMyw3ICszLDcgQEAKICAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNS4wLVNOQVBTSE9UJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKICAgICB9CiB9CiBhcHBseSBwbHVnaW46ICdhbmRyb2lkJwpAQCAtMTcsMjEgKzE3LDE2IEBACiAgICAgcHJvZHVjdEZsYXZvcnMgewogICAgICAgICBmMSB7CiAgICAgICAgICAgICBmbGF2b3JHcm91cCAgICJncm91cDEiCi0KLSAgICAgICAgICAgIGJ1aWxkQ29uZmlnICAgInB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEdST1VQMSA9IFwiRjFcIjsiCiAgICAgICAgIH0KICAgICAgICAgZjIgewogICAgICAgICAgICAgZmxhdm9yR3JvdXAgICAiZ3JvdXAxIgotICAgICAgICAgICAgYnVpbGRDb25maWcgICAicHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgR1JPVVAxID0gXCJGMlwiOyIKICAgICAgICAgfQogCiAgICAgICAgIGZhIHsKICAgICAgICAgICAgIGZsYXZvckdyb3VwICAgImdyb3VwMiIKLSAgICAgICAgICAgIGJ1aWxkQ29uZmlnICAgInB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEdST1VQMiA9IFwiRkFcIjsiCiAgICAgICAgIH0KICAgICAgICAgZmIgewogICAgICAgICAgICAgZmxhdm9yR3JvdXAgICAiZ3JvdXAyIgotICAgICAgICAgICAgYnVpbGRDb25maWcgICAicHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgR1JPVVAyID0gXCJGQlwiOyIKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2YxL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9ycy9ncm91cDEvU29tZUNsYXNzLmphdmEgYi90ZXN0cy9mbGF2b3JzL3NyYy9mMS9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcnMvZ3JvdXAxL1NvbWVDbGFzcy5qYXZhCmluZGV4IGE1YzMwYjIuLmZmYmY1YWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2YxL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9ycy9ncm91cDEvU29tZUNsYXNzLmphdmEKKysrIGIvdGVzdHMvZmxhdm9ycy9zcmMvZjEvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9mbGF2b3JzL2dyb3VwMS9Tb21lQ2xhc3MuamF2YQpAQCAtMiw2ICsyLDYgQEAKIAogcHVibGljIGNsYXNzIFNvbWVDbGFzcyB7CiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkYxIjsKKyAgICAgICAgcmV0dXJuICJmMSI7CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2YxL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9mbGF2b3JzL3NyYy9mMS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDczZTc1ODQuLmI0ZGIzZTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2YxL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvdGVzdHMvZmxhdm9ycy9zcmMvZjEvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8cmVzb3VyY2VzPgogCi0gICAgPHN0cmluZyBuYW1lPSJncm91cDFfc3RyaW5nIj5GMTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZ2VuZXJhbF9zdHJpbmciPkYxPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJncm91cDFfc3RyaW5nIj5mMTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ2VuZXJhbF9zdHJpbmciPmYxPC9zdHJpbmc+CiAKIDwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2YyL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9ycy9ncm91cDEvU29tZUNsYXNzLmphdmEgYi90ZXN0cy9mbGF2b3JzL3NyYy9mMi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcnMvZ3JvdXAxL1NvbWVDbGFzcy5qYXZhCmluZGV4IDU5NzQ1ODcuLjA5MzI3YTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2YyL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9ycy9ncm91cDEvU29tZUNsYXNzLmphdmEKKysrIGIvdGVzdHMvZmxhdm9ycy9zcmMvZjIvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9mbGF2b3JzL2dyb3VwMS9Tb21lQ2xhc3MuamF2YQpAQCAtMiw2ICsyLDYgQEAKIAogcHVibGljIGNsYXNzIFNvbWVDbGFzcyB7CiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkYyIjsKKyAgICAgICAgcmV0dXJuICJmMiI7CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2YyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9mbGF2b3JzL3NyYy9mMi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDg1NWU3ZjYuLjdhMzA2ZmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2YyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvdGVzdHMvZmxhdm9ycy9zcmMvZjIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8cmVzb3VyY2VzPgogCi0gICAgPHN0cmluZyBuYW1lPSJncm91cDFfc3RyaW5nIj5GMjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZ2VuZXJhbF9zdHJpbmciPkYyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJncm91cDFfc3RyaW5nIj5mMjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ2VuZXJhbF9zdHJpbmciPmYyPC9zdHJpbmc+CiAKIDwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2ZhL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9ycy9ncm91cDIvU29tZUNsYXNzLmphdmEgYi90ZXN0cy9mbGF2b3JzL3NyYy9mYS9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcnMvZ3JvdXAyL1NvbWVDbGFzcy5qYXZhCmluZGV4IDQwYTkzOWUuLmFlNzY3N2IgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2ZhL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9ycy9ncm91cDIvU29tZUNsYXNzLmphdmEKKysrIGIvdGVzdHMvZmxhdm9ycy9zcmMvZmEvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9mbGF2b3JzL2dyb3VwMi9Tb21lQ2xhc3MuamF2YQpAQCAtMiw2ICsyLDYgQEAKIAogcHVibGljIGNsYXNzIFNvbWVDbGFzcyB7CiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkZBIjsKKyAgICAgICAgcmV0dXJuICJmYSI7CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2ZhL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9mbGF2b3JzL3NyYy9mYS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDMzMWNiOTAuLmY4Y2VmZTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2ZhL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvdGVzdHMvZmxhdm9ycy9zcmMvZmEvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8cmVzb3VyY2VzPgogCi0gICAgPHN0cmluZyBuYW1lPSJncm91cDJfc3RyaW5nIj5GQTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZ2VuZXJhbF9zdHJpbmciPkZBPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJncm91cDJfc3RyaW5nIj5mYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ2VuZXJhbF9zdHJpbmciPmZhPC9zdHJpbmc+CiAKIDwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2ZiL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9ycy9ncm91cDIvU29tZUNsYXNzLmphdmEgYi90ZXN0cy9mbGF2b3JzL3NyYy9mYi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcnMvZ3JvdXAyL1NvbWVDbGFzcy5qYXZhCmluZGV4IDc0NDFiNjEuLjU3NjhkNjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2ZiL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9ycy9ncm91cDIvU29tZUNsYXNzLmphdmEKKysrIGIvdGVzdHMvZmxhdm9ycy9zcmMvZmIvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9mbGF2b3JzL2dyb3VwMi9Tb21lQ2xhc3MuamF2YQpAQCAtMiw2ICsyLDYgQEAKIAogcHVibGljIGNsYXNzIFNvbWVDbGFzcyB7CiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkZCIjsKKyAgICAgICAgcmV0dXJuICJmYiI7CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2ZiL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9mbGF2b3JzL3NyYy9mYi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IGZhMDczM2YuLjhmYTI0ZGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2ZiL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvdGVzdHMvZmxhdm9ycy9zcmMvZmIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8cmVzb3VyY2VzPgogCi0gICAgPHN0cmluZyBuYW1lPSJncm91cDJfc3RyaW5nIj5GQjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZ2VuZXJhbF9zdHJpbmciPkZCPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJncm91cDJfc3RyaW5nIj5mYjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ2VuZXJhbF9zdHJpbmciPmZiPC9zdHJpbmc+CiAKIDwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2luc3RydW1lbnRUZXN0RjEvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9mbGF2b3JzL01haW5BY3Rpdml0eUdyb3VwMVRlc3QuamF2YSBiL3Rlc3RzL2ZsYXZvcnMvc3JjL2luc3RydW1lbnRUZXN0RjEvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9mbGF2b3JzL01haW5BY3Rpdml0eUdyb3VwMVRlc3QuamF2YQppbmRleCAyYzA0M2VmLi45Mzc5ZDk2IDEwMDY0NAotLS0gYS90ZXN0cy9mbGF2b3JzL3NyYy9pbnN0cnVtZW50VGVzdEYxL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9ycy9NYWluQWN0aXZpdHlHcm91cDFUZXN0LmphdmEKKysrIGIvdGVzdHMvZmxhdm9ycy9zcmMvaW5zdHJ1bWVudFRlc3RGMS9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcnMvTWFpbkFjdGl2aXR5R3JvdXAxVGVzdC5qYXZhCkBAIC04MCwxNyArODAsMTcgQEAKIAogICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlc092ZXJsYXkoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRjEiLCBtUmVzT3ZlckxheS5nZXRUZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkYxIiwgbVJlc092ZXJMYXkxLmdldFRleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZjEiLCBtUmVzT3ZlckxheS5nZXRUZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImYxIiwgbVJlc092ZXJMYXkxLmdldFRleHQoKSk7CiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRDb25maWcoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRjEiLCBtQnVpbGRDb25maWcxLmdldFRleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZjEiLCBtQnVpbGRDb25maWcxLmdldFRleHQoKSk7CiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29kZU92ZXJsYXkoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRjEiLCBtQ29kZU92ZXJsYXkxLmdldFRleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZjEiLCBtQ29kZU92ZXJsYXkxLmdldFRleHQoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmxhdm9ycy9zcmMvaW5zdHJ1bWVudFRlc3RGMi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcnMvTWFpbkFjdGl2aXR5R3JvdXAxVGVzdC5qYXZhIGIvdGVzdHMvZmxhdm9ycy9zcmMvaW5zdHJ1bWVudFRlc3RGMi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcnMvTWFpbkFjdGl2aXR5R3JvdXAxVGVzdC5qYXZhCmluZGV4IDQxZTllY2YuLjhlY2QwNTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2luc3RydW1lbnRUZXN0RjIvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9mbGF2b3JzL01haW5BY3Rpdml0eUdyb3VwMVRlc3QuamF2YQorKysgYi90ZXN0cy9mbGF2b3JzL3NyYy9pbnN0cnVtZW50VGVzdEYyL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9ycy9NYWluQWN0aXZpdHlHcm91cDFUZXN0LmphdmEKQEAgLTgwLDE3ICs4MCwxNyBAQAogCiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzT3ZlcmxheSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGMiIsIG1SZXNPdmVyTGF5LmdldFRleHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRjIiLCBtUmVzT3ZlckxheTEuZ2V0VGV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmMiIsIG1SZXNPdmVyTGF5LmdldFRleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZjIiLCBtUmVzT3ZlckxheTEuZ2V0VGV4dCgpKTsKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZENvbmZpZygpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGMiIsIG1CdWlsZENvbmZpZzEuZ2V0VGV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmMiIsIG1CdWlsZENvbmZpZzEuZ2V0VGV4dCgpKTsKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb2RlT3ZlcmxheSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGMiIsIG1Db2RlT3ZlcmxheTEuZ2V0VGV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmMiIsIG1Db2RlT3ZlcmxheTEuZ2V0VGV4dCgpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9mbGF2b3JzL3NyYy9pbnN0cnVtZW50VGVzdEZhL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9ycy9NYWluQWN0aXZpdHlHcm91cDJUZXN0LmphdmEgYi90ZXN0cy9mbGF2b3JzL3NyYy9pbnN0cnVtZW50VGVzdEZhL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9ycy9NYWluQWN0aXZpdHlHcm91cDJUZXN0LmphdmEKaW5kZXggMGQwZmVlMi4uM2U1MTIyNSAxMDA2NDQKLS0tIGEvdGVzdHMvZmxhdm9ycy9zcmMvaW5zdHJ1bWVudFRlc3RGYS9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcnMvTWFpbkFjdGl2aXR5R3JvdXAyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2ZsYXZvcnMvc3JjL2luc3RydW1lbnRUZXN0RmEvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9mbGF2b3JzL01haW5BY3Rpdml0eUdyb3VwMlRlc3QuamF2YQpAQCAtODIsMTcgKzgyLDE3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFJlc092ZXJsYXkoKSB7CiAgICAgICAgIC8vIGJlY2F1c2UgdGhpcyBncm91cCBoYXMgbG93ZXIgcHJpb3JpdHksIHdlIGNoZWNrIHRoYXQgdGhlIHJlc291cmNlIGZyb20KICAgICAgICAgLy8gdGhpcyBmbGF2b3IgaXMgbm90IHVzZWQuCi0gICAgICAgIGFzc2VydEZhbHNlKCJGQSIuZXF1YWxzKG1SZXNPdmVyTGF5LmdldFRleHQoKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZBIiwgbVJlc092ZXJMYXkyLmdldFRleHQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJmYSIuZXF1YWxzKG1SZXNPdmVyTGF5LmdldFRleHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZhIiwgbVJlc092ZXJMYXkyLmdldFRleHQoKSk7CiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRDb25maWcoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRkEiLCBtQnVpbGRDb25maWcyLmdldFRleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmEiLCBtQnVpbGRDb25maWcyLmdldFRleHQoKSk7CiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29kZU92ZXJsYXkoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRkEiLCBtQ29kZU92ZXJsYXkyLmdldFRleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmEiLCBtQ29kZU92ZXJsYXkyLmdldFRleHQoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmxhdm9ycy9zcmMvaW5zdHJ1bWVudFRlc3RGYi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcnMvTWFpbkFjdGl2aXR5R3JvdXAyVGVzdC5qYXZhIGIvdGVzdHMvZmxhdm9ycy9zcmMvaW5zdHJ1bWVudFRlc3RGYi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcnMvTWFpbkFjdGl2aXR5R3JvdXAyVGVzdC5qYXZhCmluZGV4IDZmOTJhZGYuLmYxMWI1Y2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZsYXZvcnMvc3JjL2luc3RydW1lbnRUZXN0RmIvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9mbGF2b3JzL01haW5BY3Rpdml0eUdyb3VwMlRlc3QuamF2YQorKysgYi90ZXN0cy9mbGF2b3JzL3NyYy9pbnN0cnVtZW50VGVzdEZiL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvZmxhdm9ycy9NYWluQWN0aXZpdHlHcm91cDJUZXN0LmphdmEKQEAgLTgyLDE3ICs4MiwxNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNPdmVybGF5KCkgewogICAgICAgICAvLyBiZWNhdXNlIHRoaXMgZ3JvdXAgaGFzIGxvd2VyIHByaW9yaXR5LCB3ZSBjaGVjayB0aGF0IHRoZSByZXNvdXJjZSBmcm9tCiAgICAgICAgIC8vIHRoaXMgZmxhdm9yIGlzIG5vdCB1c2VkLgotICAgICAgICBhc3NlcnRGYWxzZSgiRkIiLmVxdWFscyhtUmVzT3ZlckxheS5nZXRUZXh0KCkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGQiIsIG1SZXNPdmVyTGF5Mi5nZXRUZXh0KCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiZmIiLmVxdWFscyhtUmVzT3ZlckxheS5nZXRUZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmYiIsIG1SZXNPdmVyTGF5Mi5nZXRUZXh0KCkpOwogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkQ29uZmlnKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIkZCIiwgbUJ1aWxkQ29uZmlnMi5nZXRUZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZiIiwgbUJ1aWxkQ29uZmlnMi5nZXRUZXh0KCkpOwogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvZGVPdmVybGF5KCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIkZCIiwgbUNvZGVPdmVybGF5Mi5nZXRUZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZiIiwgbUNvZGVPdmVybGF5Mi5nZXRUZXh0KCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZsYXZvcnMvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9mbGF2b3JzL01haW5BY3Rpdml0eS5qYXZhIGIvdGVzdHMvZmxhdm9ycy9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcnMvTWFpbkFjdGl2aXR5LmphdmEKaW5kZXggNjk2ODY0My4uZmYyYjQ3YyAxMDA2NDQKLS0tIGEvdGVzdHMvZmxhdm9ycy9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcnMvTWFpbkFjdGl2aXR5LmphdmEKKysrIGIvdGVzdHMvZmxhdm9ycy9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2ZsYXZvcnMvTWFpbkFjdGl2aXR5LmphdmEKQEAgLTE0LDEwICsxNCwxMCBAQAogICAgICAgICBUZXh0VmlldyB0djsKIAogICAgICAgICB0diA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuYnVpbGRjb25maWcxKTsKLSAgICAgICAgdHYuc2V0VGV4dChCdWlsZENvbmZpZy5HUk9VUDEpOworICAgICAgICB0di5zZXRUZXh0KEJ1aWxkQ29uZmlnLkZMQVZPUl9ncm91cDEpOwogCiAgICAgICAgIHR2ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5idWlsZGNvbmZpZzIpOwotICAgICAgICB0di5zZXRUZXh0KEJ1aWxkQ29uZmlnLkdST1VQMik7CisgICAgICAgIHR2LnNldFRleHQoQnVpbGRDb25maWcuRkxBVk9SX2dyb3VwMik7CiAKICAgICAgICAgdHYgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmNvZGVvdmVybGF5MSk7CiAgICAgICAgIHR2LnNldFRleHQoY29tLmFuZHJvaWQudGVzdHMuZmxhdm9ycy5ncm91cDEuU29tZUNsYXNzLmdldFN0cmluZygpKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dlbkZvbGRlckFwaS9idWlsZC5ncmFkbGUgYi90ZXN0cy9nZW5Gb2xkZXJBcGkvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMzUzNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nZW5Gb2xkZXJBcGkvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsNDUgQEAKK2J1aWxkc2NyaXB0IHsKKyAgICByZXBvc2l0b3JpZXMgeworICAgICAgICBtYXZlbiB7IHVybCAnLi4vLi4vLi4vLi4vb3V0L2hvc3QvZ3JhZGxlL3JlcG8nIH0KKyAgICB9CisgICAgZGVwZW5kZW5jaWVzIHsKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC43LjAtU05BUFNIT1QnCisgICAgfQorfQorYXBwbHkgcGx1Z2luOiAnYW5kcm9pZCcKKworYW5kcm9pZCB7CisgICAgY29tcGlsZVNka1ZlcnNpb24gMTUKKyAgICBidWlsZFRvb2xzVmVyc2lvbiAiMTguMC4xIgorfQorCisKK3B1YmxpYyBjbGFzcyBHZW5lcmF0ZUNvZGUgZXh0ZW5kcyBEZWZhdWx0VGFzayB7CisgICAgQElucHV0CisgICAgU3RyaW5nIHZhbHVlCisKKyAgICBAT3V0cHV0RmlsZQorICAgIEZpbGUgb3V0cHV0RmlsZQorCisgICAgQFRhc2tBY3Rpb24KKyAgICB2b2lkIHRhc2tBY3Rpb24oKSB7CisgICAgICAgIGdldE91dHB1dEZpbGUoKS50ZXh0ID0KKyAgICAgICAgICAgICJwYWNrYWdlIGNvbS5jdXN0b207XG4iICsKKyAgICAgICAgICAgICJwdWJsaWMgY2xhc3MgRm9vIHtcbiIgKworICAgICAgICAgICAgIiAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCdWlsZERhdGUoKSB7IHJldHVybiBcIiR7Z2V0VmFsdWUoKX1cIjsgfVxuIiArCisgICAgICAgICAgICAifVxuIjsKKyAgICB9Cit9CisKKworYW5kcm9pZC5hcHBsaWNhdGlvblZhcmlhbnRzLmFsbCB7IHZhcmlhbnQgLT4KKworICAgIC8vIGNyZWF0ZSBhIHRhc2sgdGhhdCBnZW5lcmF0ZXMgYSBqYXZhIGNsYXNzCisgICAgRmlsZSBzb3VyY2VGb2xkZXIgPSBmaWxlKCIke2J1aWxkRGlyfS9jdXN0b21Db2RlLyR7dmFyaWFudC5kaXJOYW1lfSIpCisgICAgZGVmIGphdmFHZW5lcmF0aW9uVGFzayA9IHRhc2tzLmNyZWF0ZShuYW1lOiAiZ2VuZXJhdGVkQ29kZUZvciR7dmFyaWFudC5uYW1lLmNhcGl0YWxpemUoKX0iLCB0eXBlOiBHZW5lcmF0ZUNvZGUpIHsKKyAgICAgICAgdmFsdWUgbmV3IERhdGUoKS5mb3JtYXQoInl5eXktTU0tZGQnVCdISDptbSdaJyIsIFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSkKKyAgICAgICAgb3V0cHV0RmlsZSBmaWxlKCIke3NvdXJjZUZvbGRlci5hYnNvbHV0ZVBhdGh9L2NvbS9jdXN0b20vRm9vLmphdmEiKQorICAgIH0KKworICAgIHZhcmlhbnQucmVnaXN0ZXJKYXZhR2VuZXJhdGluZ1Rhc2soamF2YUdlbmVyYXRpb25UYXNrLCBzb3VyY2VGb2xkZXIpCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ2VuRm9sZGVyQXBpL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9nZW5Gb2xkZXJBcGkvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzRkOTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ2VuRm9sZGVyQXBpL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwxMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0cy5iYXNpYyI+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljb24iPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTWFpbiIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZ2VuRm9sZGVyQXBpL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvTWFpbi5qYXZhIGIvdGVzdHMvZ2VuRm9sZGVyQXBpL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMDU4MjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nZW5Gb2xkZXJBcGkvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9NYWluLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0cy5iYXNpYzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgTWFpbiBleHRlbmRzIEFjdGl2aXR5Cit7CisgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBmaXJzdCBjcmVhdGVkLiAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpCisgICAgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5tYWluKTsKKworICAgICAgICBUZXh0VmlldyB0diA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7CisgICAgICAgIHR2LnNldFRleHQoY29tLmN1c3RvbS5Gb28uZ2V0QnVpbGREYXRlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dlbkZvbGRlckFwaS9zcmMvbWFpbi9yZXMvZHJhd2FibGUvaWNvbi5wbmcgYi90ZXN0cy9nZW5Gb2xkZXJBcGkvc3JjL21haW4vcmVzL2RyYXdhYmxlL2ljb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2M2OWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nZW5Gb2xkZXJBcGkvc3JjL21haW4vcmVzL2RyYXdhYmxlL2ljb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2dlbkZvbGRlckFwaS9zcmMvbWFpbi9yZXMvbGF5b3V0L21haW4ueG1sIGIvdGVzdHMvZ2VuRm9sZGVyQXBpL3NyYy9tYWluL3Jlcy9sYXlvdXQvbWFpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4MTdjZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dlbkZvbGRlckFwaS9zcmMvbWFpbi9yZXMvbGF5b3V0L21haW4ueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICA+Cis8VGV4dFZpZXcKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDp0ZXh0PSJUZXN0IEFwcCAtIEdlbkZvbGRlckFwaSIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCisgICAgLz4KKzwvTGluZWFyTGF5b3V0PgorCmRpZmYgLS1naXQgYS90ZXN0cy9nZW5Gb2xkZXJBcGkvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3Rlc3RzL2dlbkZvbGRlckFwaS9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZWU4OGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nZW5Gb2xkZXJBcGkvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cmVzb3VyY2VzPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiPl9UZXN0LWdlbkZvbGRlckFwaTwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZC9idWlsZC5ncmFkbGUgYi90ZXN0cy9saWJQcm9ndWFyZC9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmODZlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYlByb2d1YXJkL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDI2IEBACitidWlsZHNjcmlwdCB7CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CisgICAgfQorICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJworICAgIH0KK30KKworYXBwbHkgcGx1Z2luOiAnYW5kcm9pZC1saWJyYXJ5JworCithbmRyb2lkIHsKKyAgICBjb21waWxlU2RrVmVyc2lvbiAxNQorICAgIGJ1aWxkVG9vbHNWZXJzaW9uICIxOC4wLjEiCisKKyAgICBkZWZhdWx0Q29uZmlnIHsKKyAgICAgICAgdmVyc2lvbkNvZGUgMTIKKyAgICAgICAgdmVyc2lvbk5hbWUgIjIuMCIKKyAgICAgICAgbWluU2RrVmVyc2lvbiAxNgorICAgICAgICB0YXJnZXRTZGtWZXJzaW9uIDE2CisgICAgICAgIHByb2d1YXJkRmlsZSAnY29uZmlnLnBybycKKyAgICB9CisgICAgcmVsZWFzZSB7CisgICAgICAgIHJ1blByb2d1YXJkIHRydWUKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZC9jb25maWcucHJvIGIvdGVzdHMvbGliUHJvZ3VhcmQvY29uZmlnLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjY0Zjg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmQvY29uZmlnLnBybwpAQCAtMCwwICsxLDMgQEAKKy1rZWVwIHB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC50ZXN0cy5iYXNpYy5TdHJpbmdQcm92aWRlciB7CisgICAgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZyhpbnQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliUHJvZ3VhcmQvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2xpYlByb2d1YXJkL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzYTI4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYlByb2d1YXJkL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljIj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2Jhc2ljL1N0cmluZ1Byb3ZpZGVyLmphdmEgYi90ZXN0cy9saWJQcm9ndWFyZC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2Jhc2ljL1N0cmluZ1Byb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmZTkyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYlByb2d1YXJkL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvU3RyaW5nUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExIEBACitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljOworCitpbXBvcnQgamF2YS5sYW5nLkludGVnZXI7CisKK3B1YmxpYyBjbGFzcyBTdHJpbmdQcm92aWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHByb2d1YXJkSW50ID0gNTsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhpbnQgZm9vKSB7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGZvbyArIHByb2d1YXJkSW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZENvbnN1bWVyRmlsZXMvQS50eHQgYi90ZXN0cy9saWJQcm9ndWFyZENvbnN1bWVyRmlsZXMvQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwZjEwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYlByb2d1YXJkQ29uc3VtZXJGaWxlcy9BLnR4dApAQCAtMCwwICsxIEBACitBCmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZENvbnN1bWVyRmlsZXMvQi50eHQgYi90ZXN0cy9saWJQcm9ndWFyZENvbnN1bWVyRmlsZXMvQi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzYjc4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYlByb2d1YXJkQ29uc3VtZXJGaWxlcy9CLnR4dApAQCAtMCwwICsxIEBACitCCmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZENvbnN1bWVyRmlsZXMvQy50eHQgYi90ZXN0cy9saWJQcm9ndWFyZENvbnN1bWVyRmlsZXMvQy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjNThkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYlByb2d1YXJkQ29uc3VtZXJGaWxlcy9DLnR4dApAQCAtMCwwICsxIEBACitDCmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZENvbnN1bWVyRmlsZXMvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvbGliUHJvZ3VhcmRDb25zdW1lckZpbGVzL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTQ1M2UwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRDb25zdW1lckZpbGVzL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDMyIEBACitidWlsZHNjcmlwdCB7CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CisgICAgfQorICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJworICAgIH0KK30KKworYXBwbHkgcGx1Z2luOiAnYW5kcm9pZC1saWJyYXJ5JworCithbmRyb2lkIHsKKyAgICBjb21waWxlU2RrVmVyc2lvbiAxNQorICAgIGJ1aWxkVG9vbHNWZXJzaW9uICIxOC4wLjEiCisKKyAgICBkZWZhdWx0Q29uZmlnIHsKKyAgICAgICAgdmVyc2lvbkNvZGUgMTIKKyAgICAgICAgdmVyc2lvbk5hbWUgIjIuMCIKKyAgICAgICAgbWluU2RrVmVyc2lvbiAxNgorICAgICAgICB0YXJnZXRTZGtWZXJzaW9uIDE2CisgICAgICAgIHByb2d1YXJkRmlsZSAnY29uZmlnLnBybycKKyAgICAgICAgY29uc3VtZXJQcm9ndWFyZEZpbGVzICdBLnR4dCcKKyAgICB9CisKKyAgICBkZWJ1ZyB7CisgICAgfQorCisgICAgcmVsZWFzZSB7CisgICAgICAgIHJ1blByb2d1YXJkIHRydWUKKyAgICAgICAgY29uc3VtZXJQcm9ndWFyZEZpbGVzICdCLnR4dCcsICdDLnR4dCcKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZENvbnN1bWVyRmlsZXMvY29uZmlnLnBybyBiL3Rlc3RzL2xpYlByb2d1YXJkQ29uc3VtZXJGaWxlcy9jb25maWcucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NjRmODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZENvbnN1bWVyRmlsZXMvY29uZmlnLnBybwpAQCAtMCwwICsxLDMgQEAKKy1rZWVwIHB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC50ZXN0cy5iYXNpYy5TdHJpbmdQcm92aWRlciB7CisgICAgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZyhpbnQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliUHJvZ3VhcmRDb25zdW1lckZpbGVzL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9saWJQcm9ndWFyZENvbnN1bWVyRmlsZXMvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTNhMjg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRDb25zdW1lckZpbGVzL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljIj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZENvbnN1bWVyRmlsZXMvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9TdHJpbmdQcm92aWRlci5qYXZhIGIvdGVzdHMvbGliUHJvZ3VhcmRDb25zdW1lckZpbGVzL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvU3RyaW5nUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGZlOTI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRDb25zdW1lckZpbGVzL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvU3RyaW5nUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExIEBACitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljOworCitpbXBvcnQgamF2YS5sYW5nLkludGVnZXI7CisKK3B1YmxpYyBjbGFzcyBTdHJpbmdQcm92aWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHByb2d1YXJkSW50ID0gNTsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhpbnQgZm9vKSB7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGZvbyArIHByb2d1YXJkSW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9hcHAvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvYXBwL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTY2YmY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvYXBwL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDM1IEBACithcHBseSBwbHVnaW46ICdhbmRyb2lkJworCityZXBvc2l0b3JpZXMgeworICAgIG1hdmVuQ2VudHJhbCgpCit9CisKK2RlcGVuZGVuY2llcyB7CisgICAgY29tcGlsZSBwcm9qZWN0KCc6bGliJykKK30KKworYW5kcm9pZCB7CisgICAgY29tcGlsZVNka1ZlcnNpb24gMTUKKyAgICBidWlsZFRvb2xzVmVyc2lvbiAiMTguMC4xIgorCisgICAgdGVzdEJ1aWxkVHlwZSAicHJvZ3VhcmQiCisKKyAgICBkZWZhdWx0Q29uZmlnIHsKKyAgICAgICAgdmVyc2lvbkNvZGUgMTIKKyAgICAgICAgdmVyc2lvbk5hbWUgIjIuMCIKKyAgICAgICAgbWluU2RrVmVyc2lvbiAxNgorICAgICAgICB0YXJnZXRTZGtWZXJzaW9uIDE2CisgICAgfQorCisgICAgYnVpbGRUeXBlcyB7CisgICAgICAgIHByb2d1YXJkLmluaXRXaXRoKGJ1aWxkVHlwZXMuZGVidWcpCisgICAgICAgIHByb2d1YXJkIHsKKyAgICAgICAgICAgIHJ1blByb2d1YXJkIHRydWUKKyAgICAgICAgICAgIHByb2d1YXJkRmlsZXMgZ2V0RGVmYXVsdFByb2d1YXJkRmlsZSgncHJvZ3VhcmQtYW5kcm9pZC50eHQnKSwgJ2NvbmZpZy5wcm8nCisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZXhPcHRpb25zIHsKKyAgICAgICAgaW5jcmVtZW50YWwgZmFsc2UKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9hcHAvY29uZmlnLnBybyBiL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2FwcC9jb25maWcucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjE5NzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9hcHAvY29uZmlnLnBybwpAQCAtMCwwICsxLDIgQEAKKy1rZWVwIGNsYXNzIGNvbS5nb29nbGUuKioKKy1kb250d2FybiBjb20uZ29vZ2xlLioqCmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9hcHAvc3JjL2luc3RydW1lbnRUZXN0L2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvTWFpblRlc3QuamF2YSBiL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2FwcC9zcmMvaW5zdHJ1bWVudFRlc3QvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9NYWluVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiM2ZmMzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9hcHAvc3JjL2luc3RydW1lbnRUZXN0L2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvTWFpblRlc3QuamF2YQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljOworCitpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgTWFpblRlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxNYWluPiB7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UZXh0VmlldzsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4ge0BsaW5rIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSB0aGF0IHRlc3RzIHRoZSB7QGxpbmsgTWFpbn0gYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIE1haW5UZXN0KCkgeworICAgICAgICBzdXBlcihNYWluLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBmaW5hbCBNYWluIGEgPSBnZXRBY3Rpdml0eSgpOworICAgICAgICAvLyBlbnN1cmUgYSB2YWxpZCBoYW5kbGUgdG8gdGhlIGFjdGl2aXR5IGhhcyBiZWVuIHJldHVybmVkCisgICAgICAgIGFzc2VydE5vdE51bGwoYSk7CisgICAgICAgIG1UZXh0VmlldyA9IChUZXh0VmlldykgYS5maW5kVmlld0J5SWQoUi5pZC5kYXRlVGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgJ3Rlc3QgcHJlY29uZGl0aW9ucycgaXMgYSBjb252ZW50aW9uIHRvIHNpZ25hbCB0aGF0IGlmIHRoaXMKKyAgICAgKiB0ZXN0IGRvZXNuJ3QgcGFzcywgdGhlIHRlc3QgY2FzZSB3YXMgbm90IHNldCB1cCBwcm9wZXJseSBhbmQgaXQgbWlnaHQKKyAgICAgKiBleHBsYWluIGFueSBhbmQgYWxsIGZhaWx1cmVzIGluIG90aGVyIHRlc3RzLiAgVGhpcyBpcyBub3QgZ3VhcmFudGVlZAorICAgICAqIHRvIHJ1biBiZWZvcmUgb3RoZXIgdGVzdHMsIGFzIGp1bml0IHVzZXMgcmVmbGVjdGlvbiB0byBmaW5kIHRoZSB0ZXN0cy4KKyAgICAgKi8KKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVjb25kaXRpb25zKCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG1UZXh0Vmlldyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRleHRWaWV3Q29udGVudCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGcmVkQmFybmV5IiwgbVRleHRWaWV3LmdldFRleHQoKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9hcHAvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2FwcC9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOGQ1NzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9hcHAvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljIj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNvbiI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5NYWluIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJjb20uYmxhaCIgLz4KKworICAgIDxwZXJtaXNzaW9uLWdyb3VwIGFuZHJvaWQ6bmFtZT0iZm9vLnBlcm1pc3Npb24tZ3JvdXAuQ09TVF9NT05FWSIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9hcHBfbmFtZSIgLz4KKworICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iZm9vLnBlcm1pc3Npb24uU0VORF9TTVMiCisgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJmb28ucGVybWlzc2lvbi1ncm91cC5DT1NUX01PTkVZIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL2FwcF9uYW1lIiAvPgorCisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJmb28uYmxhaC5TRU5EX1NNUyIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImZvby5wZXJtaXNzaW9uLWdyb3VwLkNPU1RfTU9ORVkiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvYXBwX25hbWUiIC8+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9NYWluLmphdmEgYi90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9NYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhNjk1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2FwcC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2Jhc2ljL01haW4uamF2YQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgTWFpbiBleHRlbmRzIEFjdGl2aXR5Cit7CisKKyAgICBwcml2YXRlIGludCBmb28gPSAxMjM0OworCisgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBmaXJzdCBjcmVhdGVkLiAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpCisgICAgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5tYWluKTsKKworICAgICAgICBUZXh0VmlldyB0diA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZGF0ZVRleHQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB1c2UgcmVmbGVjdGlvbiB0byBtYWtlIHN1cmUgdGhlIGNsYXNzIHdhc24ndCBvYmZ1c2NhdGVkCisgICAgICAgICAgICBDbGFzczw/PiB0aGVDbGFzcyA9IENsYXNzLmZvck5hbWUoImNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljLlN0cmluZ0dldHRlciIpOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHRoZUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRTdHJpbmciKTsKKyAgICAgICAgICAgIHR2LnNldFRleHQoKFN0cmluZykgbWV0aG9kLmludm9rZShudWxsKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2FwcC9zcmMvbWFpbi9yZXMvZHJhd2FibGUvaWNvbi5wbmcgYi90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9hcHAvc3JjL21haW4vcmVzL2RyYXdhYmxlL2ljb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2M2OWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9hcHAvc3JjL21haW4vcmVzL2RyYXdhYmxlL2ljb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2FwcC9zcmMvbWFpbi9yZXMvbGF5b3V0L21haW4ueG1sIGIvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvYXBwL3NyYy9tYWluL3Jlcy9sYXlvdXQvbWFpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhYjA5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2FwcC9zcmMvbWFpbi9yZXMvbGF5b3V0L21haW4ueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICA+Cis8VGV4dFZpZXcKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDp0ZXh0PSJUZXN0IEFwcCAtIEJhc2ljIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKKyAgICAvPgorPFRleHRWaWV3CisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6dGV4dD0iIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGF0ZVRleHQiCisgICAgLz4KKzwvTGluZWFyTGF5b3V0PgorCmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9hcHAvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2FwcC9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZWEyZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9hcHAvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cmVzb3VyY2VzPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiPl9UZXN0LUJhc2ljPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODk5ZjlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsOCBAQAorYnVpbGRzY3JpcHQgeworICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIG1hdmVuIHsgdXJsICcuLi8uLi8uLi8uLi9vdXQvaG9zdC9ncmFkbGUvcmVwbycgfQorICAgIH0KKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9saWIvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvbGliL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGNiODQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvbGliL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDMwIEBACithcHBseSBwbHVnaW46ICdhbmRyb2lkLWxpYnJhcnknCisKK3JlcG9zaXRvcmllcyB7CisgICAgbWF2ZW5DZW50cmFsKCkKK30KKworZGVwZW5kZW5jaWVzIHsKKyAgICBjb21waWxlICdjb20uZ29vZ2xlLmd1YXZhOmd1YXZhOjExLjAuMicKKyAgICBjb21waWxlIGZpbGVUcmVlKGRpcjogJ2xpYnMnLCBpbmNsdWRlOiAnKi5qYXInKQorfQorCithbmRyb2lkIHsKKyAgICBjb21waWxlU2RrVmVyc2lvbiAxNQorICAgIGJ1aWxkVG9vbHNWZXJzaW9uICIxOC4wLjEiCisKKyAgICBkZWZhdWx0Q29uZmlnIHsKKyAgICAgICAgdmVyc2lvbkNvZGUgMTIKKyAgICAgICAgdmVyc2lvbk5hbWUgIjIuMCIKKyAgICAgICAgbWluU2RrVmVyc2lvbiAxNgorICAgICAgICB0YXJnZXRTZGtWZXJzaW9uIDE2CisgICAgICAgIHByb2d1YXJkRmlsZSAnY29uZmlnLnBybycKKyAgICAgICAgY29uc3VtZXJQcm9ndWFyZEZpbGVzICdjb25maWcucHJvJworICAgIH0KKyAgICBkZWJ1ZyB7CisgICAgICAgIHJ1blByb2d1YXJkIHRydWUKKyAgICB9CisgICAgcmVsZWFzZSB7CisgICAgICAgIHJ1blByb2d1YXJkIHRydWUKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9saWIvY29uZmlnLnBybyBiL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2xpYi9jb25maWcucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZmQ3YmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9saWIvY29uZmlnLnBybwpAQCAtMCwwICsxLDMgQEAKKy1rZWVwIHB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC50ZXN0cy5iYXNpYy5TdHJpbmdHZXR0ZXIgeworICAgIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2xpYi9saWJzL3V0aWwtMS4wLmphciBiL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2xpYi9saWJzL3V0aWwtMS4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTQ3MWRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvbGliL2xpYnMvdXRpbC0xLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2xpYi9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvbGliL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwYTM1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL2xpYi9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0cy5iYXNpYyI+CisgICAgPGFwcGxpY2F0aW9uIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvbGliL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvU3RyaW5nR2V0dGVyLmphdmEgYi90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9saWIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9TdHJpbmdHZXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWU1ZTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvbGliL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvU3RyaW5nR2V0dGVyLmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0cy5iYXNpYzsKKworaW1wb3J0IGphdmEubGFuZy5TdHJpbmc7CitpbXBvcnQgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcjsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLm11bHRpcHJvamVjdC5wZXJzb24uUGVvcGxlOworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQubXVsdGlwcm9qZWN0LnBlcnNvbi5QZXJzb247CisKK3B1YmxpYyBjbGFzcyBTdHJpbmdHZXR0ZXJ7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoKSB7CisgICAgICAgICByZXR1cm4gZ2V0U3RyaW5nSW50ZXJuYWwoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nSW50ZXJuYWwoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBJdGVyYWJsZTxQZXJzb24+IHBlb3BsZSA9IG5ldyBQZW9wbGUoKTsKKyAgICAgICAgZm9yIChQZXJzb24gcGVyc29uIDogcGVvcGxlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQocGVyc29uLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvc2V0dGluZ3MuZ3JhZGxlIGIvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvc2V0dGluZ3MuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZGIyYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZEphckRlcC9zZXR0aW5ncy5ncmFkbGUKQEAgLTAsMCArMSwyIEBACitpbmNsdWRlICdhcHAnCitpbmNsdWRlICdsaWInCmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZEphckRlcC91dGlsL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL2xpYlByb2d1YXJkSmFyRGVwL3V0aWwvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZjc3MjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZEphckRlcC91dGlsL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDggQEAKK2FwcGx5IHBsdWdpbjogJ2phdmEnCisKK2RlcGVuZGVuY2llcyB7CisgICAgY29tcGlsZSAnY29tLmdvb2dsZS5ndWF2YTpndWF2YToxMS4wLjInCit9CisKK3NvdXJjZUNvbXBhdGliaWxpdHkgPSAiMS42IgordGFyZ2V0Q29tcGF0aWJpbGl0eSA9ICIxLjYiCmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZEphckRlcC91dGlsL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvYW5kcm9pZC9tdWx0aXByb2plY3QvcGVyc29uL1Blb3BsZS5qYXZhIGIvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvdXRpbC9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL2FuZHJvaWQvbXVsdGlwcm9qZWN0L3BlcnNvbi9QZW9wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjk5MjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvdXRpbC9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL2FuZHJvaWQvbXVsdGlwcm9qZWN0L3BlcnNvbi9QZW9wbGUuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQubXVsdGlwcm9qZWN0LnBlcnNvbjsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCitwdWJsaWMgY2xhc3MgUGVvcGxlIGltcGxlbWVudHMgSXRlcmFibGU8UGVyc29uPiB7CisgICAgcHVibGljIEl0ZXJhdG9yPFBlcnNvbj4gaXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBMaXN0cy5uZXdBcnJheUxpc3QobmV3IFBlcnNvbigiRnJlZCIpLCBuZXcgUGVyc29uKCJCYXJuZXkiKSkuaXRlcmF0b3IoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZEphckRlcC91dGlsL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvYW5kcm9pZC9tdWx0aXByb2plY3QvcGVyc29uL1BlcnNvbi5qYXZhIGIvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvdXRpbC9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL2FuZHJvaWQvbXVsdGlwcm9qZWN0L3BlcnNvbi9QZXJzb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjRhYTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRKYXJEZXAvdXRpbC9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL2FuZHJvaWQvbXVsdGlwcm9qZWN0L3BlcnNvbi9QZXJzb24uamF2YQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQubXVsdGlwcm9qZWN0LnBlcnNvbjsKKworcHVibGljIGNsYXNzIFBlcnNvbiB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgIHB1YmxpYyBQZXJzb24oU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2FwcC9idWlsZC5ncmFkbGUgYi90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9hcHAvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MjMwOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9hcHAvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsMzEgQEAKK2FwcGx5IHBsdWdpbjogJ2FuZHJvaWQnCisKK2RlcGVuZGVuY2llcyB7CisgICAgY29tcGlsZSBwcm9qZWN0KCc6bGliJykKK30KKworYW5kcm9pZCB7CisgICAgY29tcGlsZVNka1ZlcnNpb24gMTUKKyAgICBidWlsZFRvb2xzVmVyc2lvbiAiMTguMC4xIgorCisgICAgdGVzdEJ1aWxkVHlwZSAicHJvZ3VhcmQiCisKKyAgICBkZWZhdWx0Q29uZmlnIHsKKyAgICAgICAgdmVyc2lvbkNvZGUgMTIKKyAgICAgICAgdmVyc2lvbk5hbWUgIjIuMCIKKyAgICAgICAgbWluU2RrVmVyc2lvbiAxNgorICAgICAgICB0YXJnZXRTZGtWZXJzaW9uIDE2CisgICAgfQorCisgICAgYnVpbGRUeXBlcyB7CisgICAgICAgIHByb2d1YXJkLmluaXRXaXRoKGJ1aWxkVHlwZXMuZGVidWcpCisgICAgICAgIHByb2d1YXJkIHsKKyAgICAgICAgICAgIHJ1blByb2d1YXJkIHRydWUKKyAgICAgICAgICAgIHByb2d1YXJkRmlsZXMgZ2V0RGVmYXVsdFByb2d1YXJkRmlsZSgncHJvZ3VhcmQtYW5kcm9pZC50eHQnKSwgJ2NvbmZpZy5wcm8nCisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZXhPcHRpb25zIHsKKyAgICAgICAgaW5jcmVtZW50YWwgZmFsc2UKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9hcHAvY29uZmlnLnBybyBiL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2FwcC9jb25maWcucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YWFkYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9hcHAvY29uZmlnLnBybwpAQCAtMCwwICsxLDMgQEAKKy1rZWVwIHB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC50ZXN0cy5iYXNpYy5NYWluIHsKKyAgICBwdWJsaWMgdm9pZCBnZXRPYmZ1c2NhdGVkTWV0aG9kKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9hcHAvc3JjL2luc3RydW1lbnRUZXN0L2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvTWFpblRlc3QuamF2YSBiL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2FwcC9zcmMvaW5zdHJ1bWVudFRlc3QvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9NYWluVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Mjg5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9hcHAvc3JjL2luc3RydW1lbnRUZXN0L2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvTWFpblRlc3QuamF2YQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljOworCitpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIE1haW5UZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8TWFpbj4geworCisgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGV4dFZpZXc7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMn0gdGhhdCB0ZXN0cyB0aGUge0BsaW5rIE1haW59IGFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBNYWluVGVzdCgpIHsKKyAgICAgICAgc3VwZXIoTWFpbi5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgZmluYWwgTWFpbiBhID0gZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgLy8gZW5zdXJlIGEgdmFsaWQgaGFuZGxlIHRvIHRoZSBhY3Rpdml0eSBoYXMgYmVlbiByZXR1cm5lZAorICAgICAgICBhc3NlcnROb3ROdWxsKGEpOworICAgICAgICBtVGV4dFZpZXcgPSAoVGV4dFZpZXcpIGEuZmluZFZpZXdCeUlkKFIuaWQuZGF0ZVRleHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lICd0ZXN0IHByZWNvbmRpdGlvbnMnIGlzIGEgY29udmVudGlvbiB0byBzaWduYWwgdGhhdCBpZiB0aGlzCisgICAgICogdGVzdCBkb2Vzbid0IHBhc3MsIHRoZSB0ZXN0IGNhc2Ugd2FzIG5vdCBzZXQgdXAgcHJvcGVybHkgYW5kIGl0IG1pZ2h0CisgICAgICogZXhwbGFpbiBhbnkgYW5kIGFsbCBmYWlsdXJlcyBpbiBvdGhlciB0ZXN0cy4gIFRoaXMgaXMgbm90IGd1YXJhbnRlZWQKKyAgICAgKiB0byBydW4gYmVmb3JlIG90aGVyIHRlc3RzLCBhcyBqdW5pdCB1c2VzIHJlZmxlY3Rpb24gdG8gZmluZCB0aGUgdGVzdHMuCisgICAgICovCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlY29uZGl0aW9ucygpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtVGV4dFZpZXcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0Vmlld0NvbnRlbnQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiMTIzNCIsIG1UZXh0Vmlldy5nZXRUZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdW1lclByb2d1YXJkUnVsZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBNYWluIGEgPSBnZXRBY3Rpdml0eSgpOworICAgICAgICAgICAgYS5nZXRPYmZ1c2NhdGVkTWV0aG9kKCk7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRlZCBOb1N1Y2hNZXRob2RFcnJvciIpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gdGVzdCBwYXNzZWQKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvYXBwL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9hcHAvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjhkNTcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvYXBwL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0cy5iYXNpYyI+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljb24iPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTWFpbiIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iY29tLmJsYWgiIC8+CisKKyAgICA8cGVybWlzc2lvbi1ncm91cCBhbmRyb2lkOm5hbWU9ImZvby5wZXJtaXNzaW9uLWdyb3VwLkNPU1RfTU9ORVkiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvYXBwX25hbWUiIC8+CisKKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImZvby5wZXJtaXNzaW9uLlNFTkRfU01TIgorICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb25Hcm91cD0iZm9vLnBlcm1pc3Npb24tZ3JvdXAuQ09TVF9NT05FWSIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9hcHBfbmFtZSIgLz4KKworICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iZm9vLmJsYWguU0VORF9TTVMiCisgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJmb28ucGVybWlzc2lvbi1ncm91cC5DT1NUX01PTkVZIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL2FwcF9uYW1lIiAvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvTWFpbi5qYXZhIGIvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYWViY2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9NYWluLmphdmEKQEAgLTAsMCArMSw0NiBAQAorcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0cy5iYXNpYzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBNYWluIGV4dGVuZHMgQWN0aXZpdHkKK3sKKworICAgIHByaXZhdGUgaW50IGZvbyA9IDEyMzQ7CisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkKKyAgICB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1haW4pOworCisgICAgICAgIFRleHRWaWV3IHR2ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5kYXRlVGV4dCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHVzZSByZWZsZWN0aW9uIHRvIG1ha2Ugc3VyZSB0aGUgY2xhc3Mgd2Fzbid0IG9iZnVzY2F0ZWQKKyAgICAgICAgICAgIENsYXNzPD8+IHRoZUNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiY29tLmFuZHJvaWQudGVzdHMuYmFzaWMuU3RyaW5nR2V0dGVyIik7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gdGhlQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImdldFN0cmluZyIsIGludC5jbGFzcyk7CisgICAgICAgICAgICB0di5zZXRUZXh0KChTdHJpbmcpIG1ldGhvZC5pbnZva2UobnVsbCwgZm9vKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHVzZSByZWZsZWN0aW9uIHRvIGdldCBhIG1ldGhvZCB0aGF0IHNob3VsZCBiZSBvYmZ1c2NhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2V0T2JmdXNjYXRlZE1ldGhvZCgpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb257CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzczw/PiB0aGVDbGFzcyA9IENsYXNzLmZvck5hbWUoImNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljLlN0cmluZ0dldHRlciIpOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHRoZUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRTdHJpbmdJbnRlcm5hbCIsIGludC5jbGFzcyk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9hcHAvc3JjL21haW4vcmVzL2RyYXdhYmxlL2ljb24ucG5nIGIvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvYXBwL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDdjNjlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvYXBwL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9hcHAvc3JjL21haW4vcmVzL2xheW91dC9tYWluLnhtbCBiL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2FwcC9zcmMvbWFpbi9yZXMvbGF5b3V0L21haW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YWIwOTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9hcHAvc3JjL21haW4vcmVzL2xheW91dC9tYWluLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgPgorPFRleHRWaWV3CisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6dGV4dD0iVGVzdCBBcHAgLSBCYXNpYyIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCisgICAgLz4KKzxUZXh0VmlldworICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOnRleHQ9IiIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2RhdGVUZXh0IgorICAgIC8+Cis8L0xpbmVhckxheW91dD4KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvYXBwL3NyYy9tYWluL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9hcHAvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGVhMmQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvYXBwL3NyYy9tYWluL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5fVGVzdC1CYXNpYzwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9idWlsZC5ncmFkbGUgYi90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5OWY5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDggQEAKK2J1aWxkc2NyaXB0IHsKKyAgICByZXBvc2l0b3JpZXMgeworICAgICAgICBtYXZlbiB7IHVybCAnLi4vLi4vLi4vLi4vb3V0L2hvc3QvZ3JhZGxlL3JlcG8nIH0KKyAgICB9CisgICAgZGVwZW5kZW5jaWVzIHsKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC43LjAtU05BUFNIT1QnCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvbGliL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2xpYi9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzY2NmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2xpYi9idWlsZC5ncmFkbGUKQEAgLTAsMCArMSwyMiBAQAorYXBwbHkgcGx1Z2luOiAnYW5kcm9pZC1saWJyYXJ5JworCitkZXBlbmRlbmNpZXMgeworICAgIGNvbXBpbGUgcHJvamVjdCgnOmxpYjInKQorfQorCithbmRyb2lkIHsKKyAgICBjb21waWxlU2RrVmVyc2lvbiAxNQorICAgIGJ1aWxkVG9vbHNWZXJzaW9uICIxOC4wLjEiCisKKyAgICBkZWZhdWx0Q29uZmlnIHsKKyAgICAgICAgdmVyc2lvbkNvZGUgMTIKKyAgICAgICAgdmVyc2lvbk5hbWUgIjIuMCIKKyAgICAgICAgbWluU2RrVmVyc2lvbiAxNgorICAgICAgICB0YXJnZXRTZGtWZXJzaW9uIDE2CisgICAgICAgIHByb2d1YXJkRmlsZSAnY29uZmlnLnBybycKKyAgICAgICAgY29uc3VtZXJQcm9ndWFyZEZpbGVzICdjb25zdW1lclJ1bGVzLnBybycKKyAgICB9CisgICAgcmVsZWFzZSB7CisgICAgICAgIHJ1blByb2d1YXJkIHRydWUKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9saWIvY29uZmlnLnBybyBiL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2xpYi9jb25maWcucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjdjYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9saWIvY29uZmlnLnBybwpAQCAtMCwwICsxLDMgQEAKKy1rZWVwIHB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC50ZXN0cy5iYXNpYy5TdHJpbmdHZXR0ZXIgeworICAgIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoaW50KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2xpYi9jb25zdW1lclJ1bGVzLnBybyBiL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2xpYi9jb25zdW1lclJ1bGVzLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDliZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvbGliL2NvbnN1bWVyUnVsZXMucHJvCkBAIC0wLDAgKzEsNiBAQAorLWtlZXAgcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljLlN0cmluZ0dldHRlciB7CisgICAgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZyhpbnQpOworfQorLWtlZXAgcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljLlN0cmluZ0dldHRlciB7CisgICAgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZ0ludGVybmFsKGludCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9saWIvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2xpYi9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MGEzNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9saWIvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQudGVzdHMuYmFzaWMiPgorICAgIDxhcHBsaWNhdGlvbiAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2xpYi9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2Jhc2ljL1N0cmluZ0dldHRlci5qYXZhIGIvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvbGliL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvU3RyaW5nR2V0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5ZjM1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2xpYi9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2Jhc2ljL1N0cmluZ0dldHRlci5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdHMuYmFzaWM7CisKK2ltcG9ydCBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworcHVibGljIGNsYXNzIFN0cmluZ0dldHRlcnsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhpbnQgZm9vKSB7CisgICAgICAgICByZXR1cm4gZ2V0U3RyaW5nSW50ZXJuYWwoZm9vKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdJbnRlcm5hbChpbnQgZm9vKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB1c2UgcmVmbGVjdGlvbiB0byBtYWtlIHN1cmUgdGhlIGNsYXNzIHdhc24ndCBvYmZ1c2NhdGVkCisgICAgICAgICAgICBDbGFzczw/PiB0aGVDbGFzcyA9IENsYXNzLmZvck5hbWUoImNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljLlN0cmluZ1Byb3ZpZGVyIik7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gdGhlQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImdldFN0cmluZyIsIGludC5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgbWV0aG9kLmludm9rZShudWxsLCBmb28pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9saWIyL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2xpYjIvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZGE0ZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9saWIyL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDE4IEBACithcHBseSBwbHVnaW46ICdhbmRyb2lkLWxpYnJhcnknCisKK2FuZHJvaWQgeworICAgIGNvbXBpbGVTZGtWZXJzaW9uIDE1CisgICAgYnVpbGRUb29sc1ZlcnNpb24gIjE4LjAuMSIKKworICAgIGRlZmF1bHRDb25maWcgeworICAgICAgICB2ZXJzaW9uQ29kZSAxMgorICAgICAgICB2ZXJzaW9uTmFtZSAiMi4wIgorICAgICAgICBtaW5TZGtWZXJzaW9uIDE2CisgICAgICAgIHRhcmdldFNka1ZlcnNpb24gMTYKKyAgICAgICAgcHJvZ3VhcmRGaWxlICdjb25maWcucHJvJworCWNvbnN1bWVyUHJvZ3VhcmRGaWxlcyAnY29uZmlnLnBybycKKyAgICB9CisgICAgcmVsZWFzZSB7CisJcnVuUHJvZ3VhcmQgdHJ1ZQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2xpYjIvY29uZmlnLnBybyBiL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2xpYjIvY29uZmlnLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjY0Zjg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvbGliMi9jb25maWcucHJvCkBAIC0wLDAgKzEsMyBAQAorLWtlZXAgcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLnRlc3RzLmJhc2ljLlN0cmluZ1Byb3ZpZGVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKGludCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9saWIyL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9saWIyL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzYTI4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2xpYjIvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQudGVzdHMuYmFzaWMiPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2xpYjIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9TdHJpbmdQcm92aWRlci5qYXZhIGIvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvbGliMi9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2Jhc2ljL1N0cmluZ1Byb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4MTkwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYlByb2d1YXJkTGliRGVwL2xpYjIvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9TdHJpbmdQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0cy5iYXNpYzsKKworcHVibGljIGNsYXNzIFN0cmluZ1Byb3ZpZGVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhpbnQgZm9vKSB7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGZvbyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvc2V0dGluZ3MuZ3JhZGxlIGIvdGVzdHMvbGliUHJvZ3VhcmRMaWJEZXAvc2V0dGluZ3MuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YWMyZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJQcm9ndWFyZExpYkRlcC9zZXR0aW5ncy5ncmFkbGUKQEAgLTAsMCArMSwzIEBACitpbmNsdWRlICdhcHAnCitpbmNsdWRlICdsaWInCitpbmNsdWRlICdsaWIyJwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliVGVzdERlcC9idWlsZC5ncmFkbGUgYi90ZXN0cy9saWJUZXN0RGVwL2J1aWxkLmdyYWRsZQppbmRleCAwYmUxNGFlLi5lNjNmYzYyIDEwMDY0NAotLS0gYS90ZXN0cy9saWJUZXN0RGVwL2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy9saWJUZXN0RGVwL2J1aWxkLmdyYWRsZQpAQCAtMyw3ICszLDcgQEAKICAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNS4wLVNOQVBTSE9UJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYnNUZXN0L2J1aWxkLmdyYWRsZSBiL3Rlc3RzL2xpYnNUZXN0L2J1aWxkLmdyYWRsZQppbmRleCBmMjEwZmNmLi5lZjNkMGFhIDEwMDY0NAotLS0gYS90ZXN0cy9saWJzVGVzdC9idWlsZC5ncmFkbGUKKysrIGIvdGVzdHMvbGlic1Rlc3QvYnVpbGQuZ3JhZGxlCkBAIC0zLDcgKzMsNyBAQAogICAgICAgICBtYXZlbiB7IHVybCAnLi4vLi4vLi4vLi4vb3V0L2hvc3QvZ3JhZGxlL3JlcG8nIH0KICAgICB9CiAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC41LjAtU05BUFNIT1QnCisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvbG9jYWxKYXJzL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL2xvY2FsSmFycy9idWlsZC5ncmFkbGUKaW5kZXggNmM1NDBjNC4uZDg4Nzc3OCAxMDA2NDQKLS0tIGEvdGVzdHMvbG9jYWxKYXJzL2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy9sb2NhbEphcnMvYnVpbGQuZ3JhZGxlCkBAIC0zLDcgKzMsNyBAQAogICAgICAgICBtYXZlbiB7IHVybCAnLi4vLi4vLi4vLi4vb3V0L2hvc3QvZ3JhZGxlL3JlcG8nIH0KICAgICB9CiAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC41LjAtU05BUFNIT1QnCisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvbWlncmF0ZWQvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvbWlncmF0ZWQvYnVpbGQuZ3JhZGxlCmluZGV4IDM3ZWZmZmEuLmU0MzMzNGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL21pZ3JhdGVkL2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy9taWdyYXRlZC9idWlsZC5ncmFkbGUKQEAgLTMsNyArMyw3IEBACiAgICAgICAgIG1hdmVuIHsgdXJsICcuLi8uLi8uLi8uLi9vdXQvaG9zdC9ncmFkbGUvcmVwbycgfQogICAgIH0KICAgICBkZXBlbmRlbmNpZXMgewotICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjUuMC1TTkFQU0hPVCcKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC43LjAtU05BUFNIT1QnCiAgICAgfQogfQogYXBwbHkgcGx1Z2luOiAnYW5kcm9pZCcKZGlmZiAtLWdpdCBhL3Rlc3RzL211bHRpcHJvamVjdC9iYXNlTGlicmFyeS9zcmMvbWFpbi9qYXZhL2NvbS9zYW1wbGUvYW5kcm9pZC9tdWx0aXByb2plY3QvbGlicmFyeS9QZXJzb25WaWV3LmphdmEgYi90ZXN0cy9tdWx0aXByb2plY3QvYmFzZUxpYnJhcnkvc3JjL21haW4vamF2YS9jb20vc2FtcGxlL2FuZHJvaWQvbXVsdGlwcm9qZWN0L2xpYnJhcnkvUGVyc29uVmlldy5qYXZhCmluZGV4IGIyMTg1MzIuLjlkM2I5OTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL211bHRpcHJvamVjdC9iYXNlTGlicmFyeS9zcmMvbWFpbi9qYXZhL2NvbS9zYW1wbGUvYW5kcm9pZC9tdWx0aXByb2plY3QvbGlicmFyeS9QZXJzb25WaWV3LmphdmEKKysrIGIvdGVzdHMvbXVsdGlwcm9qZWN0L2Jhc2VMaWJyYXJ5L3NyYy9tYWluL2phdmEvY29tL3NhbXBsZS9hbmRyb2lkL211bHRpcHJvamVjdC9saWJyYXJ5L1BlcnNvblZpZXcuamF2YQpAQCAtMSwxMCArMSwxMCBAQAotcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLm11bHRpcHJvamVjdC5saWJyYXJ5OworcGFja2FnZSBjb20uc2FtcGxlLmFuZHJvaWQubXVsdGlwcm9qZWN0LmxpYnJhcnk7CiAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLm11bHRpcHJvamVjdC5wZXJzb24uUGVyc29uOwogCi1jbGFzcyBQZXJzb25WaWV3IGV4dGVuZHMgVGV4dFZpZXcgeworcHVibGljIGNsYXNzIFBlcnNvblZpZXcgZXh0ZW5kcyBUZXh0VmlldyB7CiAgICAgcHVibGljIFBlcnNvblZpZXcoQ29udGV4dCBjb250ZXh0LCBQZXJzb24gcGVyc29uKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQpOwogICAgICAgICBzZXRUZXh0U2l6ZSgyMCk7CmRpZmYgLS1naXQgYS90ZXN0cy9tdWx0aXByb2plY3QvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvbXVsdGlwcm9qZWN0L2J1aWxkLmdyYWRsZQppbmRleCA2YzU0MGM0Li5kODg3Nzc4IDEwMDY0NAotLS0gYS90ZXN0cy9tdWx0aXByb2plY3QvYnVpbGQuZ3JhZGxlCisrKyBiL3Rlc3RzL211bHRpcHJvamVjdC9idWlsZC5ncmFkbGUKQEAgLTMsNyArMyw3IEBACiAgICAgICAgIG1hdmVuIHsgdXJsICcuLi8uLi8uLi8uLi9vdXQvaG9zdC9ncmFkbGUvcmVwbycgfQogICAgIH0KICAgICBkZXBlbmRlbmNpZXMgewotICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjUuMC1TTkFQU0hPVCcKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC43LjAtU05BUFNIT1QnCiAgICAgfQogfQogCmRpZmYgLS1naXQgYS90ZXN0cy9tdWx0aXByb2plY3QvbGlicmFyeS9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL2FuZHJvaWQvbXVsdGlwcm9qZWN0L2xpYnJhcnkvU2hvd1Blb3BsZUFjdGl2aXR5LmphdmEgYi90ZXN0cy9tdWx0aXByb2plY3QvbGlicmFyeS9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL2FuZHJvaWQvbXVsdGlwcm9qZWN0L2xpYnJhcnkvU2hvd1Blb3BsZUFjdGl2aXR5LmphdmEKaW5kZXggYTNmMjE5NS4uYjBmOGIxMiAxMDA2NDQKLS0tIGEvdGVzdHMvbXVsdGlwcm9qZWN0L2xpYnJhcnkvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9hbmRyb2lkL211bHRpcHJvamVjdC9saWJyYXJ5L1Nob3dQZW9wbGVBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL211bHRpcHJvamVjdC9saWJyYXJ5L3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvYW5kcm9pZC9tdWx0aXByb2plY3QvbGlicmFyeS9TaG93UGVvcGxlQWN0aXZpdHkuamF2YQpAQCAtMTEsNiArMTEsNyBAQAogCiBpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5tdWx0aXByb2plY3QucGVyc29uLlBlcnNvbjsKIGltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLm11bHRpcHJvamVjdC5wZXJzb24uUGVvcGxlOworaW1wb3J0IGNvbS5zYW1wbGUuYW5kcm9pZC5tdWx0aXByb2plY3QubGlicmFyeS5QZXJzb25WaWV3OwogCiBwdWJsaWMgY2xhc3MgU2hvd1Blb3BsZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXVsdGlyZXMvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvbXVsdGlyZXMvYnVpbGQuZ3JhZGxlCmluZGV4IDI5MGU3NjUuLjUwNDNkYWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL211bHRpcmVzL2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy9tdWx0aXJlcy9idWlsZC5ncmFkbGUKQEAgLTMsNyArMyw3IEBACiAgICAgICAgIG1hdmVuIHsgdXJsICcuLi8uLi8uLi8uLi9vdXQvaG9zdC9ncmFkbGUvcmVwbycgfQogICAgIH0KICAgICBkZXBlbmRlbmNpZXMgewotICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjUuMC1TTkFQU0hPVCcKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC43LjAtU05BUFNIT1QnCiAgICAgfQogfQogYXBwbHkgcGx1Z2luOiAnYW5kcm9pZCcKZGlmZiAtLWdpdCBhL3Rlc3RzL25ka0puaUxpYi9hcHAvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvbmRrSm5pTGliL2FwcC9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyNmIyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL25ka0puaUxpYi9hcHAvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsMjggQEAKK2FwcGx5IHBsdWdpbjogJ2FuZHJvaWQnCisKK2RlcGVuZGVuY2llcyB7CisgICAgY29tcGlsZSBwcm9qZWN0KCc6bGliJykKK30KKworYW5kcm9pZCB7CisgICAgY29tcGlsZVNka1ZlcnNpb24gMTUKKyAgICBidWlsZFRvb2xzVmVyc2lvbiAiMTguMC4xIgorCisgICAgcHJvZHVjdEZsYXZvcnMgeworICAgICAgICB4ODYgeworICAgICAgICAgICAgbmRrIHsKKyAgICAgICAgICAgICAgICBhYmlGaWx0ZXIgIng4NiIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhcm0geworICAgICAgICAgICAgbmRrIHsKKyAgICAgICAgICAgICAgICBhYmlGaWx0ZXIgImFybWVhYmktdjdhIgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1pcHMgeworICAgICAgICAgICAgbmRrIHsKKyAgICAgICAgICAgICAgICBhYmlGaWx0ZXIgIm1pcHMiCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrSm5pTGliL2FwcC9zcmMvaW5zdHJ1bWVudFRlc3QvamF2YS9jb20vZXhhbXBsZS9oZWxsb2puaS9saWIvSGVsbG9KbmlUZXN0LmphdmEgYi90ZXN0cy9uZGtKbmlMaWIvYXBwL3NyYy9pbnN0cnVtZW50VGVzdC9qYXZhL2NvbS9leGFtcGxlL2hlbGxvam5pL2xpYi9IZWxsb0puaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWFkYzcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrSm5pTGliL2FwcC9zcmMvaW5zdHJ1bWVudFRlc3QvamF2YS9jb20vZXhhbXBsZS9oZWxsb2puaS9saWIvSGVsbG9KbmlUZXN0LmphdmEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5oZWxsb2puaS5saWI7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKKworLyoqCisgKiBUaGlzIGlzIGEgc2ltcGxlIGZyYW1ld29yayBmb3IgYSB0ZXN0IG9mIGFuIEFwcGxpY2F0aW9uLiAgU2VlCisgKiB7QGxpbmsgYW5kcm9pZC50ZXN0LkFwcGxpY2F0aW9uVGVzdENhc2UgQXBwbGljYXRpb25UZXN0Q2FzZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24KKyAqIGhvdyB0byB3cml0ZSBhbmQgZXh0ZW5kIEFwcGxpY2F0aW9uIHRlc3RzLgorICogPHAvPgorICogVG8gcnVuIHRoaXMgdGVzdCwgeW91IGNhbiB0eXBlOgorICogYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgXAorICogLWUgY2xhc3MgY29tLmV4YW1wbGUuaGVsbG9qbmkuSGVsbG9KbmlUZXN0IFwKKyAqIGNvbS5leGFtcGxlLmhlbGxvam5pLnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb0puaVRlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlPEhlbGxvSm5pPiB7CisKKyAgICBwdWJsaWMgSGVsbG9KbmlUZXN0KCkgeworICAgICAgICBzdXBlcigiY29tLmV4YW1wbGUuaGVsbG9qbmkiLCBIZWxsb0puaS5jbGFzcyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Sm5pTmFtZSgpIHsKKyAgICAgICAgZmluYWwgSGVsbG9KbmkgYSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIC8vIGVuc3VyZSBhIHZhbGlkIGhhbmRsZSB0byB0aGUgYWN0aXZpdHkgaGFzIGJlZW4gcmV0dXJuZWQKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhKTsKKworICAgICAgICBhc3NlcnRGYWxzZSgidW5rbm93biIuZXF1YWxzKGEuam5pTmFtZUZyb21KTkkoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL25ka0puaUxpYi9hcHAvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL25ka0puaUxpYi9hcHAvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWU3Zjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrSm5pTGliL2FwcC9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgcGFja2FnZT0iY29tLmV4YW1wbGUuaGVsbG9qbmkuYXBwIgorICAgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKKyAgICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCI+CisKKyAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIzIiAvPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PiAKZGlmZiAtLWdpdCBhL3Rlc3RzL25ka0puaUxpYi9hcHAvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3Rlc3RzL25ka0puaUxpYi9hcHAvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTI2MDczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrSm5pTGliL2FwcC9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxyZXNvdXJjZXM+CisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSI+SGVsbG9Kbmk8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrSm5pTGliL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL25ka0puaUxpYi9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5OWY5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL25ka0puaUxpYi9idWlsZC5ncmFkbGUKQEAgLTAsMCArMSw4IEBACitidWlsZHNjcmlwdCB7CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CisgICAgfQorICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL25ka0puaUxpYi9saWIvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvbmRrSm5pTGliL2xpYi9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxODM0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL25ka0puaUxpYi9saWIvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsMTIgQEAKK2FwcGx5IHBsdWdpbjogJ2FuZHJvaWQtbGlicmFyeScKKworYW5kcm9pZCB7CisgICAgY29tcGlsZVNka1ZlcnNpb24gMTUKKyAgICBidWlsZFRvb2xzVmVyc2lvbiAiMTguMC4xIgorCisgICAgZGVmYXVsdENvbmZpZyB7CisgICAgICAgIG5kayB7CisgICAgICAgICAgICBtb2R1bGVOYW1lICJoZWxsby1qbmkiCisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrSm5pTGliL2xpYi9zcmMvaW5zdHJ1bWVudFRlc3QvamF2YS9jb20vZXhhbXBsZS9oZWxsb2puaS9saWIvSGVsbG9KbmlUZXN0LmphdmEgYi90ZXN0cy9uZGtKbmlMaWIvbGliL3NyYy9pbnN0cnVtZW50VGVzdC9qYXZhL2NvbS9leGFtcGxlL2hlbGxvam5pL2xpYi9IZWxsb0puaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWFkYzcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrSm5pTGliL2xpYi9zcmMvaW5zdHJ1bWVudFRlc3QvamF2YS9jb20vZXhhbXBsZS9oZWxsb2puaS9saWIvSGVsbG9KbmlUZXN0LmphdmEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5oZWxsb2puaS5saWI7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKKworLyoqCisgKiBUaGlzIGlzIGEgc2ltcGxlIGZyYW1ld29yayBmb3IgYSB0ZXN0IG9mIGFuIEFwcGxpY2F0aW9uLiAgU2VlCisgKiB7QGxpbmsgYW5kcm9pZC50ZXN0LkFwcGxpY2F0aW9uVGVzdENhc2UgQXBwbGljYXRpb25UZXN0Q2FzZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24KKyAqIGhvdyB0byB3cml0ZSBhbmQgZXh0ZW5kIEFwcGxpY2F0aW9uIHRlc3RzLgorICogPHAvPgorICogVG8gcnVuIHRoaXMgdGVzdCwgeW91IGNhbiB0eXBlOgorICogYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgXAorICogLWUgY2xhc3MgY29tLmV4YW1wbGUuaGVsbG9qbmkuSGVsbG9KbmlUZXN0IFwKKyAqIGNvbS5leGFtcGxlLmhlbGxvam5pLnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb0puaVRlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlPEhlbGxvSm5pPiB7CisKKyAgICBwdWJsaWMgSGVsbG9KbmlUZXN0KCkgeworICAgICAgICBzdXBlcigiY29tLmV4YW1wbGUuaGVsbG9qbmkiLCBIZWxsb0puaS5jbGFzcyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Sm5pTmFtZSgpIHsKKyAgICAgICAgZmluYWwgSGVsbG9KbmkgYSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIC8vIGVuc3VyZSBhIHZhbGlkIGhhbmRsZSB0byB0aGUgYWN0aXZpdHkgaGFzIGJlZW4gcmV0dXJuZWQKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhKTsKKworICAgICAgICBhc3NlcnRGYWxzZSgidW5rbm93biIuZXF1YWxzKGEuam5pTmFtZUZyb21KTkkoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL25ka0puaUxpYi9saWIvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL25ka0puaUxpYi9saWIvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjRmNTY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrSm5pTGliL2xpYi9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgcGFja2FnZT0iY29tLmV4YW1wbGUuaGVsbG9qbmkubGliIj4KKworICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjMiIC8+CisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuSGVsbG9KbmkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4gCmRpZmYgLS1naXQgYS90ZXN0cy9uZGtKbmlMaWIvbGliL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvaGVsbG9qbmkvbGliL0hlbGxvSm5pLmphdmEgYi90ZXN0cy9uZGtKbmlMaWIvbGliL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvaGVsbG9qbmkvbGliL0hlbGxvSm5pLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3YTBlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL25ka0puaUxpYi9saWIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9oZWxsb2puaS9saWIvSGVsbG9KbmkuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmV4YW1wbGUuaGVsbG9qbmkubGliOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKKworcHVibGljIGNsYXNzIEhlbGxvSm5pIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLyogQ3JlYXRlIGEgVGV4dFZpZXcgYW5kIHNldCBpdHMgY29udGVudC4KKyAgICAgICAgICogdGhlIHRleHQgaXMgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYSBuYXRpdmUKKyAgICAgICAgICogZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBUZXh0VmlldyAgdHYgPSBuZXcgVGV4dFZpZXcodGhpcyk7CisgICAgICAgIHR2LnNldFRleHQoIHN0cmluZ0Zyb21KTkkoKSApOworICAgICAgICBzZXRDb250ZW50Vmlldyh0dik7CisgICAgfQorCisgICAgLyogQSBuYXRpdmUgbWV0aG9kIHRoYXQgaXMgaW1wbGVtZW50ZWQgYnkgdGhlCisgICAgICogJ2hlbGxvLWpuaScgbmF0aXZlIGxpYnJhcnksIHdoaWNoIGlzIHBhY2thZ2VkCisgICAgICogd2l0aCB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBuYXRpdmUgU3RyaW5nICBzdHJpbmdGcm9tSk5JKCk7CisKKyAgICBwdWJsaWMgbmF0aXZlIFN0cmluZyBqbmlOYW1lRnJvbUpOSSgpOworCisgICAgLyogdGhpcyBpcyB1c2VkIHRvIGxvYWQgdGhlICdoZWxsby1qbmknIGxpYnJhcnkgb24gYXBwbGljYXRpb24KKyAgICAgKiBzdGFydHVwLiBUaGUgbGlicmFyeSBoYXMgYWxyZWFkeSBiZWVuIHVucGFja2VkIGludG8KKyAgICAgKiAvZGF0YS9kYXRhL2NvbS5leGFtcGxlLmhlbGxvam5pL2xpYi9saWJoZWxsby1qbmkuc28gYXQKKyAgICAgKiBpbnN0YWxsYXRpb24gdGltZSBieSB0aGUgcGFja2FnZSBtYW5hZ2VyLgorICAgICAqLworICAgIHN0YXRpYyB7CisgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiaGVsbG8tam5pIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrSm5pTGliL2xpYi9zcmMvbWFpbi9qbmkvaGVsbG8tam5pLmMgYi90ZXN0cy9uZGtKbmlMaWIvbGliL3NyYy9tYWluL2puaS9oZWxsby1qbmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWUyNTJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrSm5pTGliL2xpYi9zcmMvbWFpbi9qbmkvaGVsbG8tam5pLmMKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGpuaS5oPgorCisvKiBUaGlzIGlzIGEgdHJpdmlhbCBKTkkgZXhhbXBsZSB3aGVyZSB3ZSB1c2UgYSBuYXRpdmUgbWV0aG9kCisgKiB0byByZXR1cm4gYSBuZXcgVk0gU3RyaW5nLiBTZWUgdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSBzb3VyY2UKKyAqIGZpbGUgbG9jYXRlZCBhdDoKKyAqCisgKiAgIGFwcHMvc2FtcGxlcy9oZWxsby1qbmkvcHJvamVjdC9zcmMvY29tL2V4YW1wbGUvaGVsbG9qbmkvSGVsbG9KbmkuamF2YQorICovCitqc3RyaW5nCitKYXZhX2NvbV9leGFtcGxlX2hlbGxvam5pX2xpYl9IZWxsb0puaV9zdHJpbmdGcm9tSk5JKEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWYgZGVmaW5lZChfX2FybV9fKQorICAjaWYgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pCisgICAgI2lmIGRlZmluZWQoX19BUk1fTkVPTl9fKQorICAgICAgI2RlZmluZSBBQkkgImFybWVhYmktdjdhIHdpdGggTkVPTiIKKyAgICAjZWxzZQorICAgICAgI2RlZmluZSBBQkkgImFybWVhYmktdjdhIgorICAgICNlbmRpZgorICAjZWxzZQorICAgI2RlZmluZSBBQkkgImFybWVhYmkiCisgICNlbmRpZgorI2VsaWYgZGVmaW5lZChfX2kzODZfXykKKyAgICNkZWZpbmUgQUJJICJ4ODYiCisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKQorICAgI2RlZmluZSBBQkkgIm1pcHMiCisjZWxzZQorICAgI2RlZmluZSBBQkkgInVua25vd24iCisjZW5kaWYKKworICAgIHJldHVybiAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsICJIZWxsbyBmcm9tIEpOSSAhICBNeSBBQkkgaXMgIiBBQkkgIi4iKTsKK30KKworanN0cmluZworSmF2YV9jb21fZXhhbXBsZV9oZWxsb2puaV9saWJfSGVsbG9Kbmlfam5pTmFtZUZyb21KTkkoSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisgICNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfN0FfXykKKyAgICAjaWYgZGVmaW5lZChfX0FSTV9ORU9OX18pCisgICAgICAjZGVmaW5lIEFCSSAiYXJtZWFiaS12N2Egd2l0aCBORU9OIgorICAgICNlbHNlCisgICAgICAjZGVmaW5lIEFCSSAiYXJtZWFiaS12N2EiCisgICAgI2VuZGlmCisgICNlbHNlCisgICAjZGVmaW5lIEFCSSAiYXJtZWFiaSIKKyAgI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorICAgI2RlZmluZSBBQkkgIng4NiIKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCisgICAjZGVmaW5lIEFCSSAibWlwcyIKKyNlbHNlCisgICAjZGVmaW5lIEFCSSAidW5rbm93biIKKyNlbmRpZgorCisgICAgcmV0dXJuICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgQUJJKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL25ka0puaUxpYi9saWIvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3Rlc3RzL25ka0puaUxpYi9saWIvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTI2MDczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrSm5pTGliL2xpYi9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxyZXNvdXJjZXM+CisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSI+SGVsbG9Kbmk8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrSm5pTGliL3NldHRpbmdzLmdyYWRsZSBiL3Rlc3RzL25ka0puaUxpYi9zZXR0aW5ncy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzN2E1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL25ka0puaUxpYi9zZXR0aW5ncy5ncmFkbGUKQEAgLTAsMCArMSBAQAoraW5jbHVkZSAnYXBwJywgJ2xpYicKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9uZGtSc0hlbGxvQ29tcHV0ZS9BbmRyb2lkLm1rLm9sZCBiL3Rlc3RzL25ka1JzSGVsbG9Db21wdXRlL0FuZHJvaWQubWsub2xkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYmUxOWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9uZGtSc0hlbGxvQ29tcHV0ZS9BbmRyb2lkLm1rLm9sZApAQCAtMCwwICsxLDMxIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisgICAgICAgICAgICAgICAgICAgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEhlbGxvQ29tcHV0ZU5ESworTE9DQUxfU0RLX1ZFUlNJT04gOj0gMTQKKworTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliaGVsbG9jb21wdXRlbmRrCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpL2xpYmhlbGxvY29tcHV0ZW5kay9BbmRyb2lkLm1rClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrUnNIZWxsb0NvbXB1dGUvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvbmRrUnNIZWxsb0NvbXB1dGUvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ODk5YmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9uZGtSc0hlbGxvQ29tcHV0ZS9idWlsZC5ncmFkbGUKQEAgLTAsMCArMSw0MyBAQAorYnVpbGRzY3JpcHQgeworICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIG1hdmVuIHsgdXJsICcuLi8uLi8uLi8uLi9vdXQvaG9zdC9ncmFkbGUvcmVwbycgfQorICAgIH0KKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKKyAgICB9Cit9CithcHBseSBwbHVnaW46ICdhbmRyb2lkJworCithbmRyb2lkIHsKKyAgICBjb21waWxlU2RrVmVyc2lvbiAxOQorICAgIGJ1aWxkVG9vbHNWZXJzaW9uICIxOS4wLjEiCisKKyAgICBkZWZhdWx0Q29uZmlnIHsKKyAgICAgICAgcmVuZGVyc2NyaXB0TmRrTW9kZSB0cnVlCisgICAgICAgIG5kayB7CisgICAgICAgICAgICBtb2R1bGVOYW1lICJsaWJoZWxsb2NvbXB1dGVuZGsiCisgICAgICAgICAgICBzdGwgInN0bHBvcnRfc2hhcmVkIgorICAgICAgICB9CisKKyAgICB9CisKKyAgICBidWlsZFR5cGVzLmRlYnVnLmpuaURlYnVnQnVpbGQgdHJ1ZQorCisgICAgcHJvZHVjdEZsYXZvcnMgeworICAgICAgICB4ODYgeworICAgICAgICAgICAgbmRrIHsKKyAgICAgICAgICAgICAgICBhYmlGaWx0ZXIgIng4NiIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhcm0geworICAgICAgICAgICAgbmRrIHsKKyAgICAgICAgICAgICAgICBhYmlGaWx0ZXIgImFybWVhYmktdjdhIgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1pcHMgeworICAgICAgICAgICAgbmRrIHsKKyAgICAgICAgICAgICAgICBhYmlGaWx0ZXIgIm1pcHMiCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrUnNIZWxsb0NvbXB1dGUvbGliaGVsbG9jb21wdXRlbmRrL0FuZHJvaWQubWsub2xkIGIvdGVzdHMvbmRrUnNIZWxsb0NvbXB1dGUvbGliaGVsbG9jb21wdXRlbmRrL0FuZHJvaWQubWsub2xkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9uZGtSc0hlbGxvQ29tcHV0ZS9saWJoZWxsb2NvbXB1dGVuZGsvQW5kcm9pZC5tay5vbGQKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBpbmNsdWRlZCBieSB0aGUgSk5JIHRlc3QgYXBwLgorIworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9DTEFORyA6PSB0cnVlCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJoZWxsb2NvbXB1dGVuZGsKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9TUkNfRklMRVMgOj0gaGVsbG9Db21wdXRlTkRLLmNwcCBtb25vLnJzCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChKTklfSF9JTkNMVURFKQorTE9DQUxfQ19JTkNMVURFUyArPSBmcmFtZXdvcmtzL3JzL2NwcAorTE9DQUxfQ19JTkNMVURFUyArPSBmcmFtZXdvcmtzL3JzCitMT0NBTF9DX0lOQ0xVREVTICs9IGV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBiaW9uaWMvIGJpb25pYy9saWJzdGRjKysvaW5jbHVkZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmRsIGxpYmxvZyBsaWJqbmlncmFwaGljcworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJSU2NwcF9zdGF0aWMgbGlic3RscG9ydF9zdGF0aWMgbGliY3V0aWxzCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy9uZGtSc0hlbGxvQ29tcHV0ZS9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvbmRrUnNIZWxsb0NvbXB1dGUvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGI0NWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrUnNIZWxsb0NvbXB1dGUvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5leGFtcGxlLmFuZHJvaWQucnMuaGVsbG9jb21wdXRlbmRrIj4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIxNCIgLz4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iSGVsbG9Db21wdXRlTkRLIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iSGVsbG9Db21wdXRlTkRLIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL25ka1JzSGVsbG9Db21wdXRlL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9oZWxsb2NvbXB1dGVuZGsvSGVsbG9Db21wdXRlTkRLLmphdmEgYi90ZXN0cy9uZGtSc0hlbGxvQ29tcHV0ZS9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvaGVsbG9jb21wdXRlbmRrL0hlbGxvQ29tcHV0ZU5ESy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYzY0OTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9uZGtSc0hlbGxvQ29tcHV0ZS9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvaGVsbG9jb21wdXRlbmRrL0hlbGxvQ29tcHV0ZU5ESy5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQucnMuaGVsbG9jb21wdXRlbmRrOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKKworcHVibGljIGNsYXNzIEhlbGxvQ29tcHV0ZU5ESyBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwSW47CisgICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcE91dDsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiaGVsbG9jb21wdXRlbmRrIik7CisgICAgfQorCisgICAgbmF0aXZlIHZvaWQgbmF0aXZlTW9ubyhpbnQgWCwgaW50IFksIEJpdG1hcCBpbiwgQml0bWFwIG91dCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1haW4pOworCisgICAgICAgIG1CaXRtYXBJbiA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKKyAgICAgICAgbUJpdG1hcE91dCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAobUJpdG1hcEluLmdldFdpZHRoKCksIG1CaXRtYXBJbi5nZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpdG1hcEluLmdldENvbmZpZygpKTsKKworICAgICAgICBJbWFnZVZpZXcgaW4gPSAoSW1hZ2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5kaXNwbGF5aW4pOworICAgICAgICBpbi5zZXRJbWFnZUJpdG1hcChtQml0bWFwSW4pOworCisgICAgICAgIEltYWdlVmlldyBvdXQgPSAoSW1hZ2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5kaXNwbGF5b3V0KTsKKyAgICAgICAgb3V0LnNldEltYWdlQml0bWFwKG1CaXRtYXBPdXQpOworCisgICAgICAgIG5hdGl2ZU1vbm8obUJpdG1hcEluLmdldFdpZHRoKCksIG1CaXRtYXBJbi5nZXRIZWlnaHQoKSwgbUJpdG1hcEluLCBtQml0bWFwT3V0KTsKKworICAgIH0KKworICAgIHByaXZhdGUgQml0bWFwIGxvYWRCaXRtYXAoaW50IHJlc291cmNlKSB7CisgICAgICAgIGZpbmFsIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOworICAgICAgICBvcHRpb25zLmluUHJlZmVycmVkQ29uZmlnID0gQml0bWFwLkNvbmZpZy5BUkdCXzg4ODg7CisgICAgICAgIHJldHVybiBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGdldFJlc291cmNlcygpLCByZXNvdXJjZSwgb3B0aW9ucyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrUnNIZWxsb0NvbXB1dGUvc3JjL21haW4vam5pL2hlbGxvQ29tcHV0ZU5ESy5jcHAgYi90ZXN0cy9uZGtSc0hlbGxvQ29tcHV0ZS9zcmMvbWFpbi9qbmkvaGVsbG9Db21wdXRlTkRLLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQ1NTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrUnNIZWxsb0NvbXB1dGUvc3JjL21haW4vam5pL2hlbGxvQ29tcHV0ZU5ESy5jcHAKQEAgLTAsMCArMSw1OSBAQAorI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaXRtYXAuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8UmVuZGVyU2NyaXB0Lmg+CisKKyNpbmNsdWRlICJTY3JpcHRDX21vbm8uaCIKKworI2RlZmluZSAgTE9HX1RBRyAgICAiSGVsbG9Db21wdXRlTkRLIgorI2RlZmluZSAgTE9HSSguLi4pICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sTE9HX1RBRyxfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIExPR0UoLi4uKSAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUixMT0dfVEFHLF9fVkFfQVJHU19fKQorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6UlNDOworCitleHRlcm4gIkMiIEpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKK0phdmFfY29tX2V4YW1wbGVfYW5kcm9pZF9yc19oZWxsb2NvbXB1dGVuZGtfSGVsbG9Db21wdXRlTkRLX25hdGl2ZU1vbm8oSk5JRW52ICogZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGpiaXRtYXBJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBqYml0bWFwT3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKworICAgIHZvaWQqIGlucHV0UHRyID0gTlVMTDsKKyAgICB2b2lkKiBvdXRwdXRQdHIgPSBOVUxMOworCisgICAgQW5kcm9pZEJpdG1hcF9sb2NrUGl4ZWxzKGVudiwgamJpdG1hcEluLCAmaW5wdXRQdHIpOworICAgIEFuZHJvaWRCaXRtYXBfbG9ja1BpeGVscyhlbnYsIGpiaXRtYXBPdXQsICZvdXRwdXRQdHIpOworCisgICAgc3A8UlM+IHJzID0gbmV3IFJTKCk7CisgICAgcnMtPmluaXQoKTsKKworICAgIHNwPGNvbnN0IEVsZW1lbnQ+IGUgPSBFbGVtZW50OjpSR0JBXzg4ODgocnMpOworCisgICAgc3A8Y29uc3QgVHlwZT4gdCA9IFR5cGU6OmNyZWF0ZShycywgZSwgWCwgWSwgMCk7CisKKyAgICBzcDxBbGxvY2F0aW9uPiBpbnB1dEFsbG9jID0gQWxsb2NhdGlvbjo6Y3JlYXRlVHlwZWQocnMsIHQsIFJTX0FMTE9DQVRJT05fTUlQTUFQX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTX0FMTE9DQVRJT05fVVNBR0VfU0hBUkVEIHwgUlNfQUxMT0NBVElPTl9VU0FHRV9TQ1JJUFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHRyKTsKKyAgICBzcDxBbGxvY2F0aW9uPiBvdXRwdXRBbGxvYyA9IEFsbG9jYXRpb246OmNyZWF0ZVR5cGVkKHJzLCB0LCBSU19BTExPQ0FUSU9OX01JUE1BUF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNfQUxMT0NBVElPTl9VU0FHRV9TSEFSRUQgfCBSU19BTExPQ0FUSU9OX1VTQUdFX1NDUklQVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFB0cik7CisKKworICAgIGlucHV0QWxsb2MtPmNvcHkyRFJhbmdlRnJvbSgwLCAwLCBYLCBZLCBpbnB1dFB0cik7CisgICAgU2NyaXB0Q19tb25vKiBzYyA9IG5ldyBTY3JpcHRDX21vbm8ocnMpOworICAgIHNjLT5mb3JFYWNoX3Jvb3QoaW5wdXRBbGxvYywgb3V0cHV0QWxsb2MpOworICAgIG91dHB1dEFsbG9jLT5jb3B5MkRSYW5nZVRvKDAsIDAsIFgsIFksIG91dHB1dFB0cik7CisKKworICAgIEFuZHJvaWRCaXRtYXBfdW5sb2NrUGl4ZWxzKGVudiwgamJpdG1hcEluKTsKKyAgICBBbmRyb2lkQml0bWFwX3VubG9ja1BpeGVscyhlbnYsIGpiaXRtYXBPdXQpOworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9uZGtSc0hlbGxvQ29tcHV0ZS9zcmMvbWFpbi9yZXMvZHJhd2FibGUvZGF0YS5qcGcgYi90ZXN0cy9uZGtSc0hlbGxvQ29tcHV0ZS9zcmMvbWFpbi9yZXMvZHJhd2FibGUvZGF0YS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhODdiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL25ka1JzSGVsbG9Db21wdXRlL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9kYXRhLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9uZGtSc0hlbGxvQ29tcHV0ZS9zcmMvbWFpbi9yZXMvbGF5b3V0L21haW4ueG1sIGIvdGVzdHMvbmRrUnNIZWxsb0NvbXB1dGUvc3JjL21haW4vcmVzL2xheW91dC9tYWluLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjJjNzZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrUnNIZWxsb0NvbXB1dGUvc3JjL21haW4vcmVzL2xheW91dC9tYWluLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Rpc3BsYXlpbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMyMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNjZkaXAiIC8+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGlzcGxheW91dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMyMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNjZkaXAiIC8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrUnNIZWxsb0NvbXB1dGUvc3JjL21haW4vcnMvbW9uby5ycyBiL3Rlc3RzL25ka1JzSGVsbG9Db21wdXRlL3NyYy9tYWluL3JzL21vbm8ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhNWM3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL25ka1JzSGVsbG9Db21wdXRlL3NyYy9tYWluL3JzL21vbm8ucnMKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgdmVyc2lvbigxKQorI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uZXhhbXBsZS5hbmRyb2lkLnJzLmhlbGxvY29tcHV0ZW5kaykKKworY29uc3Qgc3RhdGljIGZsb2F0MyBnTW9ub011bHQgPSB7MC4yOTlmLCAwLjU4N2YsIDAuMTE0Zn07CisKK3ZvaWQgcm9vdChjb25zdCB1Y2hhcjQgKnZfaW4sIHVjaGFyNCAqdl9vdXQpIHsKKyAgICBmbG9hdDQgZjQgPSByc1VucGFja0NvbG9yODg4OCgqdl9pbik7CisKKyAgICBmbG9hdDMgbW9ubyA9IGRvdChmNC5yZ2IsIGdNb25vTXVsdCk7CisgICAgKnZfb3V0ID0gcnNQYWNrQ29sb3JUbzg4ODgobW9ubyk7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL25ka1NhbkFuZ2VsZXMvUkVBRE1FLnR4dCBiL3Rlc3RzL25ka1NhbkFuZ2VsZXMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGI4YTRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrU2FuQW5nZWxlcy9SRUFETUUudHh0CkBAIC0wLDAgKzEsNzcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK1NhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUNCitDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhDQorV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLw0KK1NlZSBmaWxlIGxpY2Vuc2UudHh0IGZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24uDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorVGhpcyBpcyBhbiBPcGVuR0wgRVMgcG9ydCBvZiB0aGUgc21hbGwgc2VsZi1ydW5uaW5nIGRlbW9uc3RyYXRpb24NCitjYWxsZWQgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIiwgd2hpY2ggd2FzIGZpcnN0IHByZXNlbnRlZCBpbiB0aGUNCitBc3NlbWJseScyMDA0IGV2ZW50LiBJdCB3b24gdGhlIGZpcnN0IHBsYWNlIGluIHRoZSA0IEtCIGludHJvDQorY29tcGV0aXRpb24gY2F0ZWdvcnkuDQorDQorVGhlIGRlbW9uc3RyYXRpb24gZmVhdHVyZXMgYSBzaWdodHNlZWluZyBvZiBhIGZ1dHVyaXN0aWMgY2l0eQ0KK2hhdmluZyBtYW55IGRpZmZlcmVudCBraW5kIG9mIGJ1aWxkaW5ncyBhbmQgaXRlbXMuIEV2ZXJ5dGhpbmcgaXMNCitmbGF0IHNoYWRlZCB3aXRoIHRocmVlIGRpZmZlcmVudCBsaWdodHMuDQorDQorVGhlIG9yaWdpbmFsIHZlcnNpb24gd2FzIG1hZGUgZm9yIGRlc2t0b3Agd2l0aCBPcGVuR0wuIEl0IHdhcw0KK25hdHVyYWxseSBoZWF2aWx5IHNpemUgb3B0aW1pemVkIGluIG9yZGVyIHRvIGZpdCBpdCBpbiB0aGUgc2l6ZQ0KK2xpbWl0LiBGb3IgdGhpcyBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlIG11Y2ggb2YgdGhlIGNvZGUgaXMNCitjbGVhbmVkIHVwIGFuZCB0aGUgc291bmQgaXMgcmVtb3ZlZC4gQWxzbyBkZXRhaWwgbGV2ZWwgaXMgbG93ZXJlZCwNCithbHRob3VnaCBpdCBzdGlsbCBjb250YWlucyBvdmVyIDYwMDAwIGZhY2VzLg0KKw0KK1RoZSBXaW4zMiAoMjAwMC9YUCkgYmluYXJ5IHBhY2thZ2Ugb2Ygb3JpZ2luYWwgdmVyc2lvbiBpcw0KK2F2YWlsYWJsZSBmcm9tIHRoaXMgYWRkcmVzczogaHR0cDovL2pldC5yby9maWxlcy9hbmdlbGVzLnppcA0KKw0KK0ZpcnN0IHZlcnNpb24gb2YgdGhpcyBPcGVuR0wgRVMgcG9ydCB3YXMgc3VibWl0dGVkIHRvIHRoZSBLaHJvbm9zDQorT3BlbkdMIEVTIENvZGluZyBDaGFsbGVuZ2UgaGVsZCBpbiAyMDA0LTIwMDUuDQorDQorQXMgYSBjb2RlIGV4YW1wbGUsIHRoaXMgc291cmNlIHNob3dzIHRoZSBmb2xsb3dpbmc6DQorICAqIEhvdyB0byBjcmVhdGUgYSBtaW5pbWFsIGFuZCBwb3J0YWJsZSBhZCBob2MgZnJhbWV3b3JrDQorICAgIGZvciBzbWFsbCB0ZXN0aW5nL2RlbW9uc3RyYXRpb24gcHJvZ3JhbXMuIFRoaXMgZnJhbWV3b3JrDQorICAgIGNvbXBpbGVzIGZvciBib3RoIGRlc2t0b3AgYW5kIFBvY2tldFBDIFdpbjMyIGVudmlyb25tZW50LA0KKyAgICBhbmQgYSBzZXBhcmF0ZSBzb3VyY2UgaXMgaW5jbHVkZWQgZm9yIExpbnV4IHdpdGggWDExLg0KKyAgKiBIb3cgdG8gZHluYW1pY2FsbHkgZmluZCBhbmQgdXNlIHRoZSBPcGVuR0wgRVMgRExMIG9yDQorICAgIHNoYXJlZCBvYmplY3QsIHNvIHRoYXQgdGhlIGxpYnJhcnkgaXMgbm90IG5lZWRlZCBhdA0KKyAgICB0aGUgY29tcGlsZS9saW5rIHN0YWdlLg0KKyAgKiBIb3cgdG8gdXNlIHRoZSBiYXNpYyBmZWF0dXJlcyBvZiBPcGVuR0wgRVMgMS4wLzEuMQ0KKyAgICBDb21tb24gTGl0ZSwgc3VjaCBhcyB2ZXJ0ZXggYXJyYXlzLCBjb2xvciBhcnJheXMgYW5kDQorICAgIGxpZ2h0aW5nLg0KKyAgKiBIb3cgdG8gY3JlYXRlIGEgc2VsZiBjb250YWluZWQgc21hbGwgZGVtb25zdHJhdGlvbg0KKyAgICBhcHBsaWNhdGlvbiB3aXRoIG9iamVjdHMgZ2VuZXJhdGVkIHVzaW5nIHByb2NlZHVyYWwNCisgICAgYWxnb3JpdGhtcy4NCisNCitBcyB0aGUgb3JpZ2luYWwgdmVyc2lvbiB3YXMgb3B0aW1pemVkIGZvciBzaXplIGluc3RlYWQgb2YNCitwZXJmb3JtYW5jZSwgdGhhdCBob2xkcyB0cnVlIGZvciB0aGlzIE9wZW5HTCBFUyB2ZXJzaW9uIGFzDQord2VsbC4gVGh1cyB0aGUgcGVyZm9ybWFuY2UgY291bGQgYmUgc2lnbmlmaWNhbnRseSBpbmNyZWFzZWQsDQorZm9yIGV4YW1wbGUgYnkgY2hhbmdpbmcgdGhlIGNvZGUgdG8gdXNlIGdsRHJhd0VsZW1lbnRzDQoraW5zdGVhZCBvZiBnbERyYXdBcnJheXMuIFRoZSBjb2RlIHVzZXMgb25seSBPcGVuR0wgRVMgMS4wDQorQ29tbW9uIExpdGUgLWxldmVsIGZ1bmN0aW9uIGNhbGxzIHdpdGhvdXQgYW55IGV4dGVuc2lvbnMuDQorDQorVGhlIHJlZmVyZW5jZSBPcGVuR0wgRVMgaW1wbGVtZW50YXRpb25zIHVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb246DQorICAqIEh5YnJpZCdzIE9wZW5HTCBFUyBBUEkgSW1wbGVtZW50YXRpb24gKEdlcmJlcmEpIHZlcnNpb24gMi4wLjQNCisgICAgUHJlYnVpbHQgV2luMzIgUEMgZXhlY3V0YWJsZTogU2FuT0dMRVMtR2VyYmVyYS5leGUNCisgICogUG93ZXJWUiBNQlggU0RLLCBPcGVuR0wgRVMgV2luZG93cyBQQyBFbXVsYXRpb24gdmVyc2lvbiAxLjA0LjE0LjAxNzANCisgICAgUHJlYnVpbHQgV2luMzIgUEMgZXhlY3V0YWJsZTogU2FuT0dMRVMtUFZSU0RLLmV4ZQ0KKw0KK05vdGUgdGhhdCBESVNBQkxFX0lNUE9SVEdMIHByZXByb2Nlc3NvciBtYWNybyBjYW4gYmUgdXNlZA0KK3RvIHNwZWNpZnkgbm90IHRvIHVzZSBkeW5hbWljIHJ1bnRpbWUgYmluZGluZyBvZiB0aGUgbGlicmFyeS4NCitZb3UgYWxzbyBuZWVkIHRvIGRlZmluZSBwcmVwcm9jZXNzb3IgbWFjcm8gUFZSU0RLIHRvIGNvbXBpbGUNCit0aGUgc291cmNlIHdpdGggUG93ZXJWUiBPcGVuR0wgRVMgU0RLLg0KKw0KK1RoZSBkZW1vIGFwcGxpY2F0aW9uIGlzIGJyaWVmbHkgdGVzdGVkIHdpdGggYSBmZXcgb3RoZXIgT3BlbkdMIEVTDQoraW1wbGVtZW50YXRpb25zIGFzIHdlbGwgKGUuZy4gVmluY2VudCwgR0xFU29uR0wgb24gTGludXgsIERlbGwNCitBeGltIFg1MHYpLiBNb3N0IG9mIHRoZXNlIG90aGVyIGltcGxlbWVudGF0aW9ucyByZW5kZXJlZCB0aGUgZGVtbw0KK2Vycm9uZW91c2x5IGluIHNvbWUgYXNwZWN0LiBUaGlzIG1heSBpbmRpY2F0ZSB0aGF0IHRoZSBkZW1vIHNvdXJjZQ0KK2NvdWxkIHN0aWxsIGhhdmUgc29tZSB3b3JrIHRvIGRvIHdpdGggY29tcGF0aWJpbGl0eSBhbmQgY29ycmVjdA0KK0FQSSB1c2FnZSwgYWx0aG91Z2ggdGhlIG5vbi1jb25mb3JtaW5nIGltcGxlbWVudGF0aW9ucyBhcmUgbW9zdA0KK3Byb2JhYmx5IHVuZmluaXNoZWQgYXMgd2VsbC4NCisNCitUaGFua3MgYW5kIEFja25vd2xlZGdlbWVudHM6DQorDQorKiBUb25pIEz2bm5iZXJnICghQ3ViZSkgY3JlYXRlZCB0aGUgbXVzaWMgZm9yIG9yaWdpbmFsIHZlcnNpb24sIHdoaWNoDQorICBpcyBub3QgZmVhdHVyZWQgaW4gdGhpcyBPcGVuR0wgRVMgcG9ydC4NCisqIFNhcmEgS2FwbGkgKHN0IFJhbmEpIGZvciBhZGRpdGlvbmFsIGNhbWVyYSB3b3JrLg0KKyogUGF1bCBCb3Vya2UgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXBlcnNoYXBlcy4NCisNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS90ZXN0cy9uZGtTYW5BbmdlbGVzL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL25ka1NhbkFuZ2VsZXMvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MzdlNzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9uZGtTYW5BbmdlbGVzL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDQzIEBACitidWlsZHNjcmlwdCB7CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CisgICAgfQorICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJworICAgIH0KK30KK2FwcGx5IHBsdWdpbjogJ2FuZHJvaWQnCisKK2FuZHJvaWQgeworICAgIGNvbXBpbGVTZGtWZXJzaW9uIDE1CisgICAgYnVpbGRUb29sc1ZlcnNpb24gIjE4LjAuMSIKKworICAgIGRlZmF1bHRDb25maWcgeworICAgICAgICBuZGsgeworICAgICAgICAgICAgbW9kdWxlTmFtZSAic2FuYW5nZWxlcyIKKyAgICAgICAgICAgIGNGbGFncyAiLURBTkRST0lEX05ESyAtRERJU0FCTEVfSU1QT1JUR0wiCisgICAgICAgICAgICBsZExpYnMgIkdMRVN2MV9DTSIsICJkbCIsICJsb2ciCisgICAgICAgICAgICBzdGwgInN0bHBvcnRfc3RhdGljIgorICAgICAgICB9CisgICAgfQorCisgICAgYnVpbGRUeXBlcy5kZWJ1Zy5qbmlEZWJ1Z0J1aWxkIHRydWUKKworICAgIHByb2R1Y3RGbGF2b3JzIHsKKyAgICAgICAgeDg2IHsKKyAgICAgICAgICAgIG5kayB7CisgICAgICAgICAgICAgICAgYWJpRmlsdGVyICJ4ODYiCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXJtIHsKKyAgICAgICAgICAgIG5kayB7CisgICAgICAgICAgICAgICAgYWJpRmlsdGVyICJhcm1lYWJpLXY3YSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtaXBzIHsKKyAgICAgICAgICAgIG5kayB7CisgICAgICAgICAgICAgICAgYWJpRmlsdGVyICJtaXBzIgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL25ka1NhbkFuZ2VsZXMvbGljZW5zZS1CU0QudHh0IGIvdGVzdHMvbmRrU2FuQW5nZWxlcy9saWNlbnNlLUJTRC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyNGUzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL25ka1NhbkFuZ2VsZXMvbGljZW5zZS1CU0QudHh0CkBAIC0wLDAgKzEsMzQgQEAKK1RoaXMgaXMgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvciB0aGUgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIg0KK09wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUgc291cmNlIGNvZGUNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlDQorQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIEpldHJvIExhdWhhDQorQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisNCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMNCithcmUgbWV0Og0KKw0KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0DQorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluDQorICAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKyAgICAgIGRpc3RyaWJ1dGlvbi4NCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBzb2Z0d2FyZSBwcm9kdWN0J3MgY29weXJpZ2h0IG93bmVyIG5vcg0KKyAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQ0KKyAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbg0KKyAgICAgIHBlcm1pc3Npb24uDQorDQorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCitPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQNCitUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SDQorUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQorTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTDQorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQpkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrU2FuQW5nZWxlcy9saWNlbnNlLUxHUEwudHh0IGIvdGVzdHMvbmRrU2FuQW5nZWxlcy9saWNlbnNlLUxHUEwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZTNmNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9uZGtTYW5BbmdlbGVzL2xpY2Vuc2UtTEdQTC50eHQKQEAgLTAsMCArMSw1MDQgQEAKKwkJICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMi4xLCBGZWJydWFyeSAxOTk5CisKKyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIExlc3NlciBHUEwuICBJdCBhbHNvIGNvdW50cworIGFzIHRoZSBzdWNjZXNzb3Igb2YgdGhlIEdOVSBMaWJyYXJ5IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGhlbmNlCisgdGhlIHZlcnNpb24gbnVtYmVyIDIuMS5dCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCitmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCisKKyAgVGhpcyBsaWNlbnNlLCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQorc3BlY2lhbGx5IGRlc2lnbmF0ZWQgc29mdHdhcmUgcGFja2FnZXMtLXR5cGljYWxseSBsaWJyYXJpZXMtLW9mIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBvdGhlciBhdXRob3JzIHdobyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91CitjYW4gdXNlIGl0IHRvbywgYnV0IHdlIHN1Z2dlc3QgeW91IGZpcnN0IHRoaW5rIGNhcmVmdWxseSBhYm91dCB3aGV0aGVyCit0aGlzIGxpY2Vuc2Ugb3IgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgdGhlIGJldHRlcgorc3RyYXRlZ3kgdG8gdXNlIGluIGFueSBwYXJ0aWN1bGFyIGNhc2UsIGJhc2VkIG9uIHRoZSBleHBsYW5hdGlvbnMgYmVsb3cuCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20gb2YgdXNlLAorbm90IHByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdAoreW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZQorZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCk7IHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldAoraXQgaWYgeW91IHdhbnQgaXQ7IHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIGFuZCB1c2UgcGllY2VzIG9mCitpdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGFyZSBpbmZvcm1lZCB0aGF0IHlvdSBjYW4gZG8KK3RoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCitkaXN0cmlidXRvcnMgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZXNlCityaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IKK3lvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnkgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcworb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoreW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQorY29kZS4gIElmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQorY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCit3aXRoIHRoZSBsaWJyYXJ5IGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZworaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIGEgdHdvLXN0ZXAgbWV0aG9kOiAoMSkgd2UgY29weXJpZ2h0IHRoZQorbGlicmFyeSwgYW5kICgyKSB3ZSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlLCB3aGljaCBnaXZlcyB5b3UgbGVnYWwKK3Blcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgorCisgIFRvIHByb3RlY3QgZWFjaCBkaXN0cmlidXRvciwgd2Ugd2FudCB0byBtYWtlIGl0IHZlcnkgY2xlYXIgdGhhdAordGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBmcmVlIGxpYnJhcnkuICBBbHNvLCBpZiB0aGUgbGlicmFyeSBpcworbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHRoZSByZWNpcGllbnRzIHNob3VsZCBrbm93Cit0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgc28gdGhhdCB0aGUgb3JpZ2luYWwKK2F1dGhvcidzIHJlcHV0YXRpb24gd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgcHJvYmxlbXMgdGhhdCBtaWdodCBiZQoraW50cm9kdWNlZCBieSBvdGhlcnMuCisMCisgIEZpbmFsbHksIHNvZnR3YXJlIHBhdGVudHMgcG9zZSBhIGNvbnN0YW50IHRocmVhdCB0byB0aGUgZXhpc3RlbmNlIG9mCithbnkgZnJlZSBwcm9ncmFtLiAgV2Ugd2lzaCB0byBtYWtlIHN1cmUgdGhhdCBhIGNvbXBhbnkgY2Fubm90CitlZmZlY3RpdmVseSByZXN0cmljdCB0aGUgdXNlcnMgb2YgYSBmcmVlIHByb2dyYW0gYnkgb2J0YWluaW5nIGEKK3Jlc3RyaWN0aXZlIGxpY2Vuc2UgZnJvbSBhIHBhdGVudCBob2xkZXIuICBUaGVyZWZvcmUsIHdlIGluc2lzdCB0aGF0CithbnkgcGF0ZW50IGxpY2Vuc2Ugb2J0YWluZWQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBtdXN0IGJlCitjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgZnJlZWRvbSBvZiB1c2Ugc3BlY2lmaWVkIGluIHRoaXMgbGljZW5zZS4KKworICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGxpY2Vuc2UsIHRoZSBHTlUgTGVzc2VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4gZGVzaWduYXRlZCBsaWJyYXJpZXMsIGFuZAoraXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBXZSB1c2UKK3RoaXMgbGljZW5zZSBmb3IgY2VydGFpbiBsaWJyYXJpZXMgaW4gb3JkZXIgdG8gcGVybWl0IGxpbmtpbmcgdGhvc2UKK2xpYnJhcmllcyBpbnRvIG5vbi1mcmVlIHByb2dyYW1zLgorCisgIFdoZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIGEgbGlicmFyeSwgd2hldGhlciBzdGF0aWNhbGx5IG9yIHVzaW5nCithIHNoYXJlZCBsaWJyYXJ5LCB0aGUgY29tYmluYXRpb24gb2YgdGhlIHR3byBpcyBsZWdhbGx5IHNwZWFraW5nIGEKK2NvbWJpbmVkIHdvcmssIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeS4gIFRoZSBvcmRpbmFyeQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGVyZWZvcmUgcGVybWl0cyBzdWNoIGxpbmtpbmcgb25seSBpZiB0aGUKK2VudGlyZSBjb21iaW5hdGlvbiBmaXRzIGl0cyBjcml0ZXJpYSBvZiBmcmVlZG9tLiAgVGhlIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBwZXJtaXRzIG1vcmUgbGF4IGNyaXRlcmlhIGZvciBsaW5raW5nIG90aGVyIGNvZGUgd2l0aAordGhlIGxpYnJhcnkuCisKKyAgV2UgY2FsbCB0aGlzIGxpY2Vuc2UgdGhlICJMZXNzZXIiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdAorZG9lcyBMZXNzIHRvIHByb3RlY3QgdGhlIHVzZXIncyBmcmVlZG9tIHRoYW4gdGhlIG9yZGluYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlLiAgSXQgYWxzbyBwcm92aWRlcyBvdGhlciBmcmVlIHNvZnR3YXJlIGRldmVsb3BlcnMgTGVzcworb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcworYXJlIHRoZSByZWFzb24gd2UgdXNlIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtYW55CitsaWJyYXJpZXMuICBIb3dldmVyLCB0aGUgTGVzc2VyIGxpY2Vuc2UgcHJvdmlkZXMgYWR2YW50YWdlcyBpbiBjZXJ0YWluCitzcGVjaWFsIGNpcmN1bXN0YW5jZXMuCisKKyAgRm9yIGV4YW1wbGUsIG9uIHJhcmUgb2NjYXNpb25zLCB0aGVyZSBtYXkgYmUgYSBzcGVjaWFsIG5lZWQgdG8KK2VuY291cmFnZSB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZSBvZiBhIGNlcnRhaW4gbGlicmFyeSwgc28gdGhhdCBpdCBiZWNvbWVzCithIGRlLWZhY3RvIHN0YW5kYXJkLiAgVG8gYWNoaWV2ZSB0aGlzLCBub24tZnJlZSBwcm9ncmFtcyBtdXN0IGJlCithbGxvd2VkIHRvIHVzZSB0aGUgbGlicmFyeS4gIEEgbW9yZSBmcmVxdWVudCBjYXNlIGlzIHRoYXQgYSBmcmVlCitsaWJyYXJ5IGRvZXMgdGhlIHNhbWUgam9iIGFzIHdpZGVseSB1c2VkIG5vbi1mcmVlIGxpYnJhcmllcy4gIEluIHRoaXMKK2Nhc2UsIHRoZXJlIGlzIGxpdHRsZSB0byBnYWluIGJ5IGxpbWl0aW5nIHRoZSBmcmVlIGxpYnJhcnkgdG8gZnJlZQorc29mdHdhcmUgb25seSwgc28gd2UgdXNlIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBJbiBvdGhlciBjYXNlcywgcGVybWlzc2lvbiB0byB1c2UgYSBwYXJ0aWN1bGFyIGxpYnJhcnkgaW4gbm9uLWZyZWUKK3Byb2dyYW1zIGVuYWJsZXMgYSBncmVhdGVyIG51bWJlciBvZiBwZW9wbGUgdG8gdXNlIGEgbGFyZ2UgYm9keSBvZgorZnJlZSBzb2Z0d2FyZS4gIEZvciBleGFtcGxlLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgR05VIEMgTGlicmFyeSBpbgorbm9uLWZyZWUgcHJvZ3JhbXMgZW5hYmxlcyBtYW55IG1vcmUgcGVvcGxlIHRvIHVzZSB0aGUgd2hvbGUgR05VCitvcGVyYXRpbmcgc3lzdGVtLCBhcyB3ZWxsIGFzIGl0cyB2YXJpYW50LCB0aGUgR05VL0xpbnV4IG9wZXJhdGluZworc3lzdGVtLgorCisgIEFsdGhvdWdoIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBMZXNzIHByb3RlY3RpdmUgb2YgdGhlCit1c2VycycgZnJlZWRvbSwgaXQgZG9lcyBlbnN1cmUgdGhhdCB0aGUgdXNlciBvZiBhIHByb2dyYW0gdGhhdCBpcworbGlua2VkIHdpdGggdGhlIExpYnJhcnkgaGFzIHRoZSBmcmVlZG9tIGFuZCB0aGUgd2hlcmV3aXRoYWwgdG8gcnVuCit0aGF0IHByb2dyYW0gdXNpbmcgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5LgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKKyJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCitmb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoZXJlYXMgdGhlIGxhdHRlciBtdXN0CitiZSBjb21iaW5lZCB3aXRoIHRoZSBsaWJyYXJ5IGluIG9yZGVyIHRvIHJ1bi4KKwwKKwkJICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSBvciBvdGhlcgorcHJvZ3JhbSB3aGljaCBjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3IKK290aGVyIGF1dGhvcml6ZWQgcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKK3RoaXMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4KK0VhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCisgIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKK3ByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcworKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KKworICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yaword2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKK2NvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCitwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCitzdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCitpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQorCisgICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCithbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAoraW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCithbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCitzdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCit3cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCithbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KKyAgCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncworY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKK3lvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCithcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAorYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKK3dhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCitMaWJyYXJ5LgorCisgIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCithbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCitmZWUuCisMCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KKyAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQorICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKKyAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5CisgICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCisgICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCisgICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKKyAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCisKKyAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcworICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKKyAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQorICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0CisgICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKKyAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCitpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQord2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwordGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwordGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAoraW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQordGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgordGhlc2Ugbm90aWNlcy4KKwwKKyAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgordGhhdCBjb3B5LCBzbyB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBhbGwKK3N1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCisKKyAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mCit0aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCisKKyAgNC4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKK2Rlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCit1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKK2l0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKK211c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Citmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQorc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCitkaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCisgIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCitMaWJyYXJ5LCBidXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBMaWJyYXJ5IGJ5IGJlaW5nIGNvbXBpbGVkIG9yCitsaW5rZWQgd2l0aCBpdCwgaXMgY2FsbGVkIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Ii4gIFN1Y2ggYQord29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAordGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5CitjcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKK2NvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlCitsaWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KK1NlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzdWNoIGV4ZWN1dGFibGVzLgorCisgIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCit0aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEKK2Rlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgorV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKK2xpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlCit0aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgorCisgIElmIHN1Y2ggYW4gb2JqZWN0IGZpbGUgdXNlcyBvbmx5IG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhCitzdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKK2Z1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKK2ZpbGUgaXMgdW5yZXN0cmljdGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgbGVnYWxseSBhIGRlcml2YXRpdmUKK3dvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCitMaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQorCisgIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5CitkaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KK0FueSBleGVjdXRhYmxlcyBjb250YWluaW5nIHRoYXQgd29yayBhbHNvIGZhbGwgdW5kZXIgU2VjdGlvbiA2LAord2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgorDAorICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tYmluZSBvcgorbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKK3dvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCit1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Cittb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKK2VuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgorCisgIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQorTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Cit0aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCitkdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQorY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQorZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQorb2YgdGhlc2UgdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKKyAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKKyAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgorICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCisgICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0CisgICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKKyAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAorICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCisgICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCisgICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KKyAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKKworICAgIGIpIFVzZSBhIHN1aXRhYmxlIHNoYXJlZCBsaWJyYXJ5IG1lY2hhbmlzbSBmb3IgbGlua2luZyB3aXRoIHRoZQorICAgIExpYnJhcnkuICBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoMSkgdXNlcyBhdCBydW4gdGltZSBhCisgICAgY29weSBvZiB0aGUgbGlicmFyeSBhbHJlYWR5IHByZXNlbnQgb24gdGhlIHVzZXIncyBjb21wdXRlciBzeXN0ZW0sCisgICAgcmF0aGVyIHRoYW4gY29weWluZyBsaWJyYXJ5IGZ1bmN0aW9ucyBpbnRvIHRoZSBleGVjdXRhYmxlLCBhbmQgKDIpCisgICAgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBpZgorICAgIHRoZSB1c2VyIGluc3RhbGxzIG9uZSwgYXMgbG9uZyBhcyB0aGUgbW9kaWZpZWQgdmVyc2lvbiBpcworICAgIGludGVyZmFjZS1jb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gdGhhdCB0aGUgd29yayB3YXMgbWFkZSB3aXRoLgorCisgICAgYykgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKKyAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKKyAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCisgICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgorCisgICAgZCkgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKKyAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKKyAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCisKKyAgICBlKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKKyAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KKworICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKK0xpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCityZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKK3RoZSBtYXRlcmlhbHMgdG8gYmUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzCitub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKK2NvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KK3doaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKK3RoZSBleGVjdXRhYmxlLgorCisgIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCityZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5CithY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Cit1c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91CitkaXN0cmlidXRlLgorDAorICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQorZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAorbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCit0aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKK3Blcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yaworICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKKyAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgICBTZWN0aW9ucyBhYm92ZS4KKworICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0CisgICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKKyAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCisKKyAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKK3RoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55CithdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgorcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAorb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwordGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5CitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoCit0aGlzIExpY2Vuc2UuCisMCisgIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQorcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAorYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCithbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKK3NvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cworZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKK3dyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwordmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgorU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAorYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5CitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKKyJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorDAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKK2V2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZworcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCitvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KKworICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCitzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQorICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQorCisKZGlmZiAtLWdpdCBhL3Rlc3RzL25ka1NhbkFuZ2VsZXMvbGljZW5zZS50eHQgYi90ZXN0cy9uZGtTYW5BbmdlbGVzL2xpY2Vuc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDg0MWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9uZGtTYW5BbmdlbGVzL2xpY2Vuc2UudHh0CkBAIC0wLDAgKzEsMTkgQEAKK1NhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUNCitDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhDQorQWxsIHJpZ2h0cyByZXNlcnZlZC4NCitXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vDQorDQorVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6DQorICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUNCisgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdA0KKyAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXINCisgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlDQorICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0Lg0KKyAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4NCisgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuDQorDQorVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcw0KK0xJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLg0KZGlmZiAtLWdpdCBhL3Rlc3RzL25ka1NhbkFuZ2VsZXMvbWlzYy9hcHAtbGludXguYyBiL3Rlc3RzL25ka1NhbkFuZ2VsZXMvbWlzYy9hcHAtbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjU3M2YyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrU2FuQW5nZWxlcy9taXNjL2FwcC1saW51eC5jCkBAIC0wLDAgKzEsMjQ3IEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBhcHAtbGludXguYyx2IDEuNCAyMDA1LzAyLzA4IDE4OjQyOjQ4IHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNCAkCisgKgorICogUGFydHMgb2YgdGhpcyBzb3VyY2UgZmlsZSBpcyBiYXNlZCBvbiB0ZXN0L2V4YW1wbGUgY29kZSBmcm9tCisgKiBHTEVTb25HTCBpbXBsZW1lbnRhdGlvbiBieSBEYXZpZCBCbHl0aGUuIEhlcmUgaXMgY29weSBvZiB0aGUKKyAqIGxpY2Vuc2Ugbm90aWNlIGZyb20gdGhhdCBzb3VyY2U6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZCBCbHl0aGUgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogREFWSUQgQkxZVEhFIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4KKworI2luY2x1ZGUgImltcG9ydGdsLmgiCisKKyNpbmNsdWRlICJhcHAuaCIKKworCitpbnQgZ0FwcEFsaXZlID0gMTsKKworc3RhdGljIGNvbnN0IGNoYXIgc0FwcE5hbWVbXSA9CisgICAgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUgKExpbnV4KSI7CitzdGF0aWMgRGlzcGxheSAqc0Rpc3BsYXk7CitzdGF0aWMgV2luZG93IHNXaW5kb3c7CitzdGF0aWMgaW50IHNXaW5kb3dXaWR0aCA9IFdJTkRPV19ERUZBVUxUX1dJRFRIOworc3RhdGljIGludCBzV2luZG93SGVpZ2h0ID0gV0lORE9XX0RFRkFVTFRfSEVJR0hUOworc3RhdGljIEVHTERpc3BsYXkgc0VnbERpc3BsYXkgPSBFR0xfTk9fRElTUExBWTsKK3N0YXRpYyBFR0xDb25maWcgc0VnbENvbmZpZzsKK3N0YXRpYyBFR0xDb250ZXh0IHNFZ2xDb250ZXh0ID0gRUdMX05PX0NPTlRFWFQ7CitzdGF0aWMgRUdMU3VyZmFjZSBzRWdsU3VyZmFjZSA9IEVHTF9OT19TVVJGQUNFOworCisKK3N0YXRpYyB2b2lkIGNoZWNrR0xFcnJvcnMoKQoreworICAgIEdMZW51bSBlcnJvciA9IGdsR2V0RXJyb3IoKTsKKyAgICBpZiAoZXJyb3IgIT0gR0xfTk9fRVJST1IpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiR0wgRXJyb3I6IDB4JTA0eFxuIiwgKGludCllcnJvcik7Cit9CisKKworc3RhdGljIHZvaWQgY2hlY2tFR0xFcnJvcnMoKQoreworICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7CisgICAgLy8gR0xFU29uR0wgc2VlbXMgdG8gYmUgcmV0dXJuaW5nIDAgd2hlbiB0aGVyZSBpcyBubyBlcnJvcnM/CisgICAgaWYgKGVycm9yICYmIGVycm9yICE9IEVHTF9TVUNDRVNTKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVHTCBFcnJvcjogMHglMDR4XG4iLCAoaW50KWVycm9yKTsKK30KKworCisvLyBJbml0aWFsaXplcyBhbmQgb3BlbnMgYm90aCBYMTEgZGlzcGxheSBhbmQgT3BlbkdMIEVTLgorc3RhdGljIGludCBpbml0R3JhcGhpY3MoKQoreworICAgIHN0YXRpYyBjb25zdCBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0KKyAgICB7CisjaWYgKFdJTkRPV19CUFAgPT0gMTYpCisgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgRUdMX0dSRUVOX1NJWkUsICAgICA1LAorICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCisjZWxpZiAoV0lORE9XX0JQUCA9PSAzMikKKyAgICAgICAgRUdMX1JFRF9TSVpFLCAgICAgICA4LAorICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDgsCisgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgOCwKKyNlbHNlCisjZXJyb3IgV0lORE9XX0JQUCBtdXN0IGJlIDE2IG9yIDMyCisjZW5kaWYKKyAgICAgICAgRUdMX0RFUFRIX1NJWkUsICAgICAxNiwKKyAgICAgICAgRUdMX0FMUEhBX1NJWkUsICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICBFR0xfU1RFTkNJTF9TSVpFLCAgIEVHTF9ET05UX0NBUkUsCisgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsICAgRUdMX1dJTkRPV19CSVQsCisgICAgICAgIEVHTF9OT05FCisgICAgfTsKKyAgICBFR0xCb29sZWFuIHN1Y2Nlc3M7CisgICAgRUdMaW50IG51bUNvbmZpZ3M7CisgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworCisgICAgaW50IGltcG9ydEdMUmVzdWx0OworICAgIGltcG9ydEdMUmVzdWx0ID0gaW1wb3J0R0xJbml0KCk7CisgICAgaWYgKCFpbXBvcnRHTFJlc3VsdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzRGlzcGxheSA9IFhPcGVuRGlzcGxheShOVUxMKTsKKworICAgIHNFZ2xEaXNwbGF5ID0gZWdsR2V0RGlzcGxheShzRGlzcGxheSk7CisgICAgc3VjY2VzcyA9IGVnbEluaXRpYWxpemUoc0VnbERpc3BsYXksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgIGlmIChzdWNjZXNzICE9IEVHTF9GQUxTRSkKKyAgICAgICAgc3VjY2VzcyA9IGVnbEdldENvbmZpZ3Moc0VnbERpc3BsYXksIE5VTEwsIDAsICZudW1Db25maWdzKTsKKyAgICBpZiAoc3VjY2VzcyAhPSBFR0xfRkFMU0UpCisgICAgICAgIHN1Y2Nlc3MgPSBlZ2xDaG9vc2VDb25maWcoc0VnbERpc3BsYXksIGNvbmZpZ0F0dHJpYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNFZ2xDb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICBpZiAoc3VjY2VzcyAhPSBFR0xfRkFMU0UpCisgICAgeworICAgICAgICBzRWdsQ29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoc0VnbERpc3BsYXksIHNFZ2xDb25maWcsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoc0VnbENvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpCisgICAgICAgICAgICBzdWNjZXNzID0gRUdMX0ZBTFNFOworICAgIH0KKyAgICBpZiAoc3VjY2VzcyAhPSBFR0xfRkFMU0UpCisgICAgeworICAgICAgICBYU2V0V2luZG93QXR0cmlidXRlcyBzd2E7CisgICAgICAgIFhWaXN1YWxJbmZvICp2aSwgdG1wOworICAgICAgICBYU2l6ZUhpbnRzIHNoOworICAgICAgICBpbnQgbjsKKyAgICAgICAgRUdMaW50IHZpZDsKKworICAgICAgICBlZ2xHZXRDb25maWdBdHRyaWIoc0VnbERpc3BsYXksIHNFZ2xDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgJnZpZCk7CisgICAgICAgIHRtcC52aXN1YWxpZCA9IHZpZDsKKyAgICAgICAgdmkgPSBYR2V0VmlzdWFsSW5mbyhzRGlzcGxheSwgVmlzdWFsSURNYXNrLCAmdG1wLCAmbik7CisgICAgICAgIHN3YS5jb2xvcm1hcCA9IFhDcmVhdGVDb2xvcm1hcChzRGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvb3RXaW5kb3coc0Rpc3BsYXksIHZpLT5zY3JlZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmktPnZpc3VhbCwgQWxsb2NOb25lKTsKKyAgICAgICAgc2guZmxhZ3MgPSBQTWluU2l6ZSB8IFBNYXhTaXplOworICAgICAgICBzaC5taW5fd2lkdGggPSBzaC5tYXhfd2lkdGggPSBzV2luZG93V2lkdGg7CisgICAgICAgIHNoLm1pbl9oZWlnaHQgPSBzaC5tYXhfaGVpZ2h0ID0gc1dpbmRvd0hlaWdodDsKKyAgICAgICAgc3dhLmJvcmRlcl9waXhlbCA9IDA7CisgICAgICAgIHN3YS5ldmVudF9tYXNrID0gRXhwb3N1cmVNYXNrIHwgU3RydWN0dXJlTm90aWZ5TWFzayB8CisgICAgICAgICAgICAgICAgICAgICAgICAgS2V5UHJlc3NNYXNrIHwgQnV0dG9uUHJlc3NNYXNrIHwgQnV0dG9uUmVsZWFzZU1hc2s7CisgICAgICAgIHNXaW5kb3cgPSBYQ3JlYXRlV2luZG93KHNEaXNwbGF5LCBSb290V2luZG93KHNEaXNwbGF5LCB2aS0+c2NyZWVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgc1dpbmRvd1dpZHRoLCBzV2luZG93SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCB2aS0+ZGVwdGgsIElucHV0T3V0cHV0LCB2aS0+dmlzdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDV0JvcmRlclBpeGVsIHwgQ1dDb2xvcm1hcCB8IENXRXZlbnRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3dhKTsKKyAgICAgICAgWE1hcFdpbmRvdyhzRGlzcGxheSwgc1dpbmRvdyk7CisgICAgICAgIFhTZXRTdGFuZGFyZFByb3BlcnRpZXMoc0Rpc3BsYXksIHNXaW5kb3csIHNBcHBOYW1lLCBzQXBwTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCAodm9pZCAqKTAsIDAsICZzaCk7CisgICAgfQorICAgIGlmIChzdWNjZXNzICE9IEVHTF9GQUxTRSkKKyAgICB7CisgICAgICAgIHNFZ2xTdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShzRWdsRGlzcGxheSwgc0VnbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOYXRpdmVXaW5kb3dUeXBlKXNXaW5kb3csIE5VTEwpOworICAgICAgICBpZiAoc0VnbFN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpCisgICAgICAgICAgICBzdWNjZXNzID0gRUdMX0ZBTFNFOworICAgIH0KKyAgICBpZiAoc3VjY2VzcyAhPSBFR0xfRkFMU0UpCisgICAgICAgIHN1Y2Nlc3MgPSBlZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgc0VnbFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRWdsU3VyZmFjZSwgc0VnbENvbnRleHQpOworCisgICAgaWYgKHN1Y2Nlc3MgPT0gRUdMX0ZBTFNFKQorICAgICAgICBjaGVja0VHTEVycm9ycygpOworCisgICAgcmV0dXJuIHN1Y2Nlc3MgIT0gRUdMX0ZBTFNFOworfQorCisKK3N0YXRpYyB2b2lkIGRlaW5pdEdyYXBoaWNzKCkKK3sKKyAgICBlZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgZWdsRGVzdHJveUNvbnRleHQoc0VnbERpc3BsYXksIHNFZ2xDb250ZXh0KTsKKyAgICBlZ2xEZXN0cm95U3VyZmFjZShzRWdsRGlzcGxheSwgc0VnbFN1cmZhY2UpOworICAgIGVnbFRlcm1pbmF0ZShzRWdsRGlzcGxheSk7CisgICAgaW1wb3J0R0xEZWluaXQoKTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIC8vIG5vdCByZWZlcmVuY2VkOgorICAgIGFyZ2MgPSBhcmdjOworICAgIGFyZ3YgPSBhcmd2OworCisgICAgaWYgKCFpbml0R3JhcGhpY3MoKSkKKyAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiR3JhcGhpY3MgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgYXBwSW5pdCgpOworCisgICAgd2hpbGUgKGdBcHBBbGl2ZSkKKyAgICB7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVOb3c7CisKKyAgICAgICAgd2hpbGUgKFhQZW5kaW5nKHNEaXNwbGF5KSkKKyAgICAgICAgeworICAgICAgICAgICAgWEV2ZW50IGV2OworICAgICAgICAgICAgWE5leHRFdmVudChzRGlzcGxheSwgJmV2KTsKKyAgICAgICAgICAgIHN3aXRjaCAoZXYudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgS2V5UHJlc3M6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5Y29kZSwga2V5c3ltOworICAgICAgICAgICAgICAgICAgICBrZXljb2RlID0gKChYS2V5RXZlbnQgKikmZXYpLT5rZXljb2RlOworICAgICAgICAgICAgICAgICAgICBrZXlzeW0gPSBYS2V5Y29kZVRvS2V5c3ltKHNEaXNwbGF5LCBrZXljb2RlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleXN5bSA9PSBYS19SZXR1cm4gfHwga2V5c3ltID09IFhLX0VzY2FwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdBcHBBbGl2ZSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGdBcHBBbGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0aW1lTm93LCBOVUxMKTsKKyAgICAgICAgICAgIGFwcFJlbmRlcih0aW1lTm93LnR2X3NlYyAqIDEwMDAgKyB0aW1lTm93LnR2X3VzZWMgLyAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgIHNXaW5kb3dXaWR0aCwgc1dpbmRvd0hlaWdodCk7CisgICAgICAgICAgICBjaGVja0dMRXJyb3JzKCk7CisgICAgICAgICAgICBlZ2xTd2FwQnVmZmVycyhzRWdsRGlzcGxheSwgc0VnbFN1cmZhY2UpOworICAgICAgICAgICAgY2hlY2tFR0xFcnJvcnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFwcERlaW5pdCgpOworICAgIGRlaW5pdEdyYXBoaWNzKCk7CisKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrU2FuQW5nZWxlcy9taXNjL2FwcC13aW4zMi5jIGIvdGVzdHMvbmRrU2FuQW5nZWxlcy9taXNjL2FwcC13aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NzU3N2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9uZGtTYW5BbmdlbGVzL21pc2MvYXBwLXdpbjMyLmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAkSWQ6IGFwcC13aW4zMi5jLHYgMS42IDIwMDUvMDIvMjQgMjA6Mjk6MDAgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS42ICQKKyAqLworCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8dGNoYXIuaD4KKyNpZmRlZiBVTkRFUl9DRQorI2luY2x1ZGUgPGF5Z3NoZWxsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJpbXBvcnRnbC5oIgorCisjaW5jbHVkZSAiYXBwLmgiCisKKworaW50IGdBcHBBbGl2ZSA9IDE7CisKK3N0YXRpYyBISU5TVEFOQ0Ugc0luc3RhbmNlOworCitzdGF0aWMgY29uc3QgX1RDSEFSIHNBcHBOYW1lW10gPQorICAgIF9UKCJTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlIChXaW4zMikiKTsKK3N0YXRpYyBIV05EIHNXbmQ7CitzdGF0aWMgaW50IHNXaW5kb3dXaWR0aCA9IFdJTkRPV19ERUZBVUxUX1dJRFRIOworc3RhdGljIGludCBzV2luZG93SGVpZ2h0ID0gV0lORE9XX0RFRkFVTFRfSEVJR0hUOworc3RhdGljIEVHTERpc3BsYXkgc0VnbERpc3BsYXkgPSBFR0xfTk9fRElTUExBWTsKK3N0YXRpYyBFR0xDb25maWcgc0VnbENvbmZpZzsKK3N0YXRpYyBFR0xDb250ZXh0IHNFZ2xDb250ZXh0ID0gRUdMX05PX0NPTlRFWFQ7CitzdGF0aWMgRUdMU3VyZmFjZSBzRWdsU3VyZmFjZSA9IEVHTF9OT19TVVJGQUNFOworCisKK3N0YXRpYyB2b2lkIGNoZWNrR0xFcnJvcnMoKQoreworICAgIEdMZW51bSBlcnJvciA9IGdsR2V0RXJyb3IoKTsKKyAgICBpZiAoZXJyb3IgIT0gR0xfTk9fRVJST1IpCisgICAgeworICAgICAgICBfVENIQVIgZXJyb3JTdHJpbmdbMzJdOworICAgICAgICBfc3RwcmludGYoZXJyb3JTdHJpbmcsIF9UKCIweCUwNHgiKSwgZXJyb3IpOworICAgICAgICBNZXNzYWdlQm94KE5VTEwsIGVycm9yU3RyaW5nLCBfVCgiR0wgRXJyb3IiKSwgTUJfT0spOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBjaGVja0VHTEVycm9ycygpCit7CisgICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKKyAgICBpZiAoZXJyb3IgIT0gRUdMX1NVQ0NFU1MpCisgICAgeworICAgICAgICBfVENIQVIgZXJyb3JTdHJpbmdbMzJdOworICAgICAgICBfc3RwcmludGYoZXJyb3JTdHJpbmcsIF9UKCIweCUwNHgiKSwgZXJyb3IpOworICAgICAgICBNZXNzYWdlQm94KE5VTEwsIGVycm9yU3RyaW5nLCBfVCgiRUdMIEluaXRpYWxpemF0aW9uIEVycm9yIiksIE1CX09LKTsKKyAgICB9Cit9CisKKworc3RhdGljIEJPT0wgaW5pdEVHTChIV05EIHduZCkKK3sKKyAgICBzdGF0aWMgY29uc3QgRUdMaW50IGNvbmZpZ0F0dHJpYnNbXSA9CisgICAgeworI2lmIChXSU5ET1dfQlBQID09IDE2KQorICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCisgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNSwKKyAgICAgICAgRUdMX0JMVUVfU0laRSwgICAgICA1LAorI2VsaWYgKFdJTkRPV19CUFAgPT0gMzIpCisgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgOCwKKyAgICAgICAgRUdMX0dSRUVOX1NJWkUsICAgICA4LAorICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDgsCisjZWxzZQorI2Vycm9yIFdJTkRPV19CUFAgbXVzdCBiZSAxNiBvciAzMgorI2VuZGlmCisgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAgICAgMTYsCisgICAgICAgIEVHTF9BTFBIQV9TSVpFLCAgICAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgRUdMX1NURU5DSUxfU0laRSwgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCAgIEVHTF9XSU5ET1dfQklULAorICAgICAgICBFR0xfTk9ORQorICAgIH07CisgICAgRUdMQm9vbGVhbiBzdWNjZXNzOworICAgIEVHTGludCBudW1Db25maWdzOworICAgIEVHTGludCBtYWpvclZlcnNpb247CisgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyNpZmRlZiBQVlJTREsKKyAgICBIREMgZGM7CisjZW5kaWYgLy8gUFZSU0RLCisKKyNpZm5kZWYgRElTQUJMRV9JTVBPUlRHTAorICAgIGludCBpbXBvcnRHTFJlc3VsdDsKKyAgICBpbXBvcnRHTFJlc3VsdCA9IGltcG9ydEdMSW5pdCgpOworICAgIGlmICghaW1wb3J0R0xSZXN1bHQpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZiAvLyAhRElTQUJMRV9JTVBPUlRHTAorCisjaWZkZWYgUFZSU0RLCisgICAgZGMgPSBHZXREQyhzV25kKTsKKyAgICBzRWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoZGMpOworI2Vsc2UKKyAgICBzRWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CisjZW5kaWYgLy8gIVBWUlNESworICAgIHN1Y2Nlc3MgPSBlZ2xJbml0aWFsaXplKHNFZ2xEaXNwbGF5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKKyAgICBpZiAoc3VjY2VzcyAhPSBFR0xfRkFMU0UpCisgICAgICAgIHN1Y2Nlc3MgPSBlZ2xHZXRDb25maWdzKHNFZ2xEaXNwbGF5LCBOVUxMLCAwLCAmbnVtQ29uZmlncyk7CisgICAgaWYgKHN1Y2Nlc3MgIT0gRUdMX0ZBTFNFKQorICAgICAgICBzdWNjZXNzID0gZWdsQ2hvb3NlQ29uZmlnKHNFZ2xEaXNwbGF5LCBjb25maWdBdHRyaWJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzRWdsQ29uZmlnLCAxLCAmbnVtQ29uZmlncyk7CisgICAgaWYgKHN1Y2Nlc3MgIT0gRUdMX0ZBTFNFKQorICAgIHsKKyAgICAgICAgc0VnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKHNFZ2xEaXNwbGF5LCBzRWdsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kLCBOVUxMKTsKKyAgICAgICAgaWYgKHNFZ2xTdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKQorICAgICAgICAgICAgc3VjY2VzcyA9IEVHTF9GQUxTRTsKKyAgICB9CisgICAgaWYgKHN1Y2Nlc3MgIT0gRUdMX0ZBTFNFKQorICAgIHsKKyAgICAgICAgc0VnbENvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KHNFZ2xEaXNwbGF5LCBzRWdsQ29uZmlnLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKHNFZ2xDb250ZXh0ID09IEVHTF9OT19DT05URVhUKQorICAgICAgICAgICAgc3VjY2VzcyA9IEVHTF9GQUxTRTsKKyAgICB9CisgICAgaWYgKHN1Y2Nlc3MgIT0gRUdMX0ZBTFNFKQorICAgICAgICBzdWNjZXNzID0gZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIHNFZ2xTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0VnbFN1cmZhY2UsIHNFZ2xDb250ZXh0KTsKKworICAgIGlmIChzdWNjZXNzID09IEVHTF9GQUxTRSkKKyAgICAgICAgY2hlY2tFR0xFcnJvcnMoKTsKKworICAgIHJldHVybiBzdWNjZXNzOworfQorCisKK3N0YXRpYyB2b2lkIGRlaW5pdEVHTCgpCit7CisgICAgZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGVnbERlc3Ryb3lDb250ZXh0KHNFZ2xEaXNwbGF5LCBzRWdsQ29udGV4dCk7CisgICAgZWdsRGVzdHJveVN1cmZhY2Uoc0VnbERpc3BsYXksIHNFZ2xTdXJmYWNlKTsKKyAgICBlZ2xUZXJtaW5hdGUoc0VnbERpc3BsYXkpOworI2lmbmRlZiBESVNBQkxFX0lNUE9SVEdMCisgICAgaW1wb3J0R0xEZWluaXQoKTsKKyNlbmRpZiAvLyAhRElTQUJMRV9JTVBPUlRHTAorfQorCisKK3N0YXRpYyBMUkVTVUxUIENBTExCQUNLIHduZFByb2MoSFdORCB3bmQsIFVJTlQgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBSRUNUIHJjOworICAgIGludCB1c2VEZWZXaW5kb3dQcm9jID0gMDsKKworICAgIHN3aXRjaCAobWVzc2FnZSkKKyAgICB7CisgICAgY2FzZSBXTV9DTE9TRToKKyAgICAgICAgRGVzdHJveVdpbmRvdyh3bmQpOworICAgICAgICBnQXBwQWxpdmUgPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgV01fREVTVFJPWToKKyAgICAgICAgUG9zdFF1aXRNZXNzYWdlKDApOworICAgICAgICBnQXBwQWxpdmUgPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgV01fS0VZRE9XTjoKKyAgICAgICAgaWYgKHdQYXJhbSA9PSBWS19FU0NBUEUgfHwgd1BhcmFtID09IFZLX1JFVFVSTikKKyAgICAgICAgICAgIGdBcHBBbGl2ZSA9IDA7CisgICAgICAgIHVzZURlZldpbmRvd1Byb2MgPSAxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgV01fS0VZVVA6CisgICAgICAgIHVzZURlZldpbmRvd1Byb2MgPSAxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgV01fU0laRToKKyAgICAgICAgR2V0Q2xpZW50UmVjdChzV25kLCAmcmMpOworICAgICAgICBzV2luZG93V2lkdGggPSByYy5yaWdodDsKKyAgICAgICAgc1dpbmRvd0hlaWdodCA9IHJjLmJvdHRvbTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICB1c2VEZWZXaW5kb3dQcm9jID0gMTsKKyAgICB9CisKKyAgICBpZiAodXNlRGVmV2luZG93UHJvYykKKyAgICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2Mod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IFdJTkFQSSBXaW5NYWluKEhJTlNUQU5DRSBpbnN0YW5jZSwgSElOU1RBTkNFIHByZXZJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICBMUFRTVFIgY21kTGluZSwgaW50IGNtZFNob3cpCit7CisgICAgTVNHIG1zZzsKKyAgICBXTkRDTEFTUyB3YzsKKyAgICBEV09SRCB3aW5kb3dTdHlsZTsKKyAgICBpbnQgd2luZG93WCwgd2luZG93WTsKKworICAgIC8vIG5vdCByZWZlcmVuY2VkOgorICAgIHByZXZJbnN0YW5jZSA9IHByZXZJbnN0YW5jZTsKKyAgICBjbWRMaW5lID0gY21kTGluZTsKKworCisgICAgc0luc3RhbmNlID0gaW5zdGFuY2U7CisKKyAgICAvLyByZWdpc3RlciBjbGFzcworICAgIHdjLnN0eWxlID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVc7CisgICAgd2MubHBmblduZFByb2MgPSAoV05EUFJPQyl3bmRQcm9jOworICAgIHdjLmNiQ2xzRXh0cmEgPSAwOworICAgIHdjLmNiV25kRXh0cmEgPSAwOworICAgIHdjLmhJbnN0YW5jZSA9IHNJbnN0YW5jZTsKKyAgICB3Yy5oSWNvbiA9IE5VTEw7CisgICAgd2MuaEN1cnNvciA9IDA7CisgICAgd2MuaGJyQmFja2dyb3VuZCA9IEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKTsKKyAgICB3Yy5scHN6TWVudU5hbWUgPSBOVUxMOworICAgIHdjLmxwc3pDbGFzc05hbWUgPSBzQXBwTmFtZTsKKyAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MoJndjKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgLy8gaW5pdCBpbnN0YW5jZQorICAgIHdpbmRvd1N0eWxlID0gV1NfQ0xJUFNJQkxJTkdTIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfVklTSUJMRTsKKyNpZmRlZiBVTkRFUl9DRQorICAgIHNXaW5kb3dXaWR0aCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pOworICAgIHNXaW5kb3dIZWlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKKyAgICB3aW5kb3dYID0gd2luZG93WSA9IDA7CisjZWxzZQorICAgIHdpbmRvd1N0eWxlIHw9IFdTX09WRVJMQVBQRURXSU5ET1c7CisgICAgd2luZG93WCA9IENXX1VTRURFRkFVTFQ7CisgICAgd2luZG93WSA9IDA7CisjZW5kaWYKKyAgICBzV25kID0gQ3JlYXRlV2luZG93KHNBcHBOYW1lLCBzQXBwTmFtZSwgd2luZG93U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dYLCB3aW5kb3dZLAorICAgICAgICAgICAgICAgICAgICAgICAgc1dpbmRvd1dpZHRoLCBzV2luZG93SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgaW5zdGFuY2UsIE5VTEwpOworICAgIGlmICghc1duZCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgU2hvd1dpbmRvdyhzV25kLCBjbWRTaG93KTsKKworI2lmZGVmIFVOREVSX0NFCisgICAgU0hGdWxsU2NyZWVuKHNXbmQsCisgICAgICAgICAgICAgICAgIFNIRlNfSElERVRBU0tCQVIgfCBTSEZTX0hJREVTSVBCVVRUT04gfCBTSEZTX0hJREVTVEFSVElDT04pOworICAgIE1vdmVXaW5kb3coc1duZCwgMCwgMCwgc1dpbmRvd1dpZHRoLCBzV2luZG93SGVpZ2h0LCBUUlVFKTsKKyNlbmRpZgorCisgICAgVXBkYXRlV2luZG93KHNXbmQpOworCisgICAgaWYgKCFpbml0RUdMKHNXbmQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBhcHBJbml0KHNXaW5kb3dXaWR0aCwgc1dpbmRvd0hlaWdodCk7CisKKyAgICB3aGlsZSAoZ0FwcEFsaXZlKQorICAgIHsKKyAgICAgICAgd2hpbGUgKFBlZWtNZXNzYWdlKCZtc2csIHNXbmQsIDAsIDAsIFBNX05PUkVNT1ZFKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEdldE1lc3NhZ2UoJm1zZywgc1duZCwgMCwgMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKKyAgICAgICAgICAgICAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ0FwcEFsaXZlID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnQXBwQWxpdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwcFJlbmRlcihHZXRUaWNrQ291bnQoKSwgc1dpbmRvd1dpZHRoLCBzV2luZG93SGVpZ2h0KTsKKyAgICAgICAgICAgIGNoZWNrR0xFcnJvcnMoKTsKKyAgICAgICAgICAgIGVnbFN3YXBCdWZmZXJzKHNFZ2xEaXNwbGF5LCBzRWdsU3VyZmFjZSk7CisgICAgICAgICAgICBjaGVja0VHTEVycm9ycygpOworICAgICAgICB9CisgICAgfQorCisgICAgYXBwRGVpbml0KCk7CisgICAgZGVpbml0RUdMKCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL25ka1NhbkFuZ2VsZXMvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL25ka1NhbkFuZ2VsZXMvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWU2YThlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrU2FuQW5nZWxlcy9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgcGFja2FnZT0iY29tLmV4YW1wbGUuU2FuQW5nZWxlcyIKKyAgICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEiCisgICAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkRlbW9BY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iNCIgLz4KKzwvbWFuaWZlc3Q+IApkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrU2FuQW5nZWxlcy9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL1NhbkFuZ2VsZXMvRGVtb0FjdGl2aXR5LmphdmEgYi90ZXN0cy9uZGtTYW5BbmdlbGVzL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvU2FuQW5nZWxlcy9EZW1vQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzZiOGE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrU2FuQW5nZWxlcy9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL1NhbkFuZ2VsZXMvRGVtb0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIGlzIGEgc21hbGwgcG9ydCBvZiB0aGUgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIiBkZW1vCisgKiBwcm9ncmFtIGZvciBPcGVuR0wgRVMgMS54LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWU6CisgKgorICogICAgaHR0cDovL2pldC5yby92aXN1YWxzL3Nhbi1hbmdlbGVzLW9ic2VydmF0aW9uLworICoKKyAqIFRoaXMgcHJvZ3JhbSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBhIEdMU3VyZmFjZVZpZXcgZnJvbSBKYXZhCisgKiBhbG9uZyB3aXRoIG5hdGl2ZSBPcGVuR0wgY2FsbHMgdG8gcGVyZm9ybSBmcmFtZSByZW5kZXJpbmcuCisgKgorICogVG91Y2hpbmcgdGhlIHNjcmVlbiB3aWxsIHN0YXJ0L3N0b3AgdGhlIGFuaW1hdGlvbi4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGRlbW8gcnVucyBtdWNoIGZhc3RlciBvbiB0aGUgZW11bGF0b3IgdGhhbiBvbgorICogcmVhbCBkZXZpY2VzLCB0aGlzIGlzIG1haW5seSBkdWUgdG8gdGhlIGZvbGxvd2luZyBmYWN0czoKKyAqCisgKiAtIHRoZSBkZW1vIHNlbmRzIGJhemlsbGlvbnMgb2YgcG9seWdvbnMgdG8gT3BlbkdMIHdpdGhvdXQKKyAqICAgZXZlbiB0cnlpbmcgdG8gZG8gY3VsbGluZy4gTW9zdCBvZiB0aGVtIGFyZSBjbGVhcmx5IG91dAorICogICBvZiB2aWV3LgorICoKKyAqIC0gb24gYSByZWFsIGRldmljZSwgdGhlIEdQVSBidXMgaXMgdGhlIHJlYWwgYm90dGxlbmVjaworICogICB0aGF0IHByZXZlbnQgdGhlIGRlbW8gZnJvbSBnZXR0aW5nIGFjY2VwdGFibGUgcGVyZm9ybWFuY2UuCisgKgorICogLSB0aGUgc29mdHdhcmUgT3BlbkdMIGVuZ2luZSB1c2VkIGluIHRoZSBlbXVsYXRvciB1c2VzCisgKiAgIHRoZSBzeXN0ZW0gYnVzIGluc3RlYWQsIGFuZCBpdHMgY29kZSByb2NrcyA6LSkKKyAqCisgKiBGaXhpbmcgdGhlIHByb2dyYW0gdG8gc2VuZCBsZXNzIHBvbHlnb25zIHRvIHRoZSBHUFUgaXMgbGVmdAorICogYXMgYW4gZXhlcmNpc2UgdG8gdGhlIHJlYWRlci4gQXMgYWx3YXlzLCBwYXRjaGVzIHdlbGNvbWVkIDotKQorICovCitwYWNrYWdlIGNvbS5leGFtcGxlLlNhbkFuZ2VsZXM7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIERlbW9BY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIG1HTFZpZXcgPSBuZXcgRGVtb0dMU3VyZmFjZVZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1HTFZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbUdMVmlldy5vblBhdXNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1HTFZpZXcub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEdMU3VyZmFjZVZpZXcgbUdMVmlldzsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgic2FuYW5nZWxlcyIpOworICAgIH0KK30KKworY2xhc3MgRGVtb0dMU3VyZmFjZVZpZXcgZXh0ZW5kcyBHTFN1cmZhY2VWaWV3IHsKKyAgICBwdWJsaWMgRGVtb0dMU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBtUmVuZGVyZXIgPSBuZXcgRGVtb1JlbmRlcmVyKCk7CisgICAgICAgIHNldFJlbmRlcmVyKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KGZpbmFsIE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgeworICAgICAgICAgICAgbmF0aXZlVG9nZ2xlUGF1c2VSZXN1bWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbmF0aXZlUGF1c2UoKTsKKyAgICB9CisKKyAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBuYXRpdmVSZXN1bWUoKTsKKyAgICB9CisKKworICAgIERlbW9SZW5kZXJlciBtUmVuZGVyZXI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVQYXVzZSgpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVJlc3VtZSgpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVRvZ2dsZVBhdXNlUmVzdW1lKCk7Cit9CisKK2NsYXNzIERlbW9SZW5kZXJlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuUmVuZGVyZXIgeworICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgeworICAgICAgICBuYXRpdmVJbml0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgLy9nbC5nbFZpZXdwb3J0KDAsIDAsIHcsIGgpOworICAgICAgICBuYXRpdmVSZXNpemUodywgaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgeworICAgICAgICBuYXRpdmVSZW5kZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVJbml0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlUmVzaXplKGludCB3LCBpbnQgaCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlUmVuZGVyKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRG9uZSgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrU2FuQW5nZWxlcy9zcmMvbWFpbi9qbmkvYXBwLWFuZHJvaWQuYyBiL3Rlc3RzL25ka1NhbkFuZ2VsZXMvc3JjL21haW4vam5pL2FwcC1hbmRyb2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5ZDg5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL25ka1NhbkFuZ2VsZXMvc3JjL21haW4vam5pL2FwcC1hbmRyb2lkLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiaW1wb3J0Z2wuaCIKKyNpbmNsdWRlICJhcHAuaCIKKworaW50ICAgZ0FwcEFsaXZlICAgPSAxOworCitzdGF0aWMgaW50ICBzV2luZG93V2lkdGggID0gMzIwOworc3RhdGljIGludCAgc1dpbmRvd0hlaWdodCA9IDQ4MDsKK3N0YXRpYyBpbnQgIHNEZW1vU3RvcHBlZCAgPSAwOworc3RhdGljIGxvbmcgc1RpbWVPZmZzZXQgICA9IDA7CitzdGF0aWMgaW50ICBzVGltZU9mZnNldEluaXQgPSAwOworc3RhdGljIGxvbmcgc1RpbWVTdG9wcGVkICA9IDA7CisKK3N0YXRpYyBsb25nCitfZ2V0VGltZSh2b2lkKQoreworICAgIHN0cnVjdCB0aW1ldmFsICBub3c7CisKKyAgICBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisgICAgcmV0dXJuIChsb25nKShub3cudHZfc2VjKjEwMDAgKyBub3cudHZfdXNlYy8xMDAwKTsKK30KKworLyogQ2FsbCB0byBpbml0aWFsaXplIHRoZSBncmFwaGljcyBzdGF0ZSAqLwordm9pZAorSmF2YV9jb21fZXhhbXBsZV9TYW5BbmdlbGVzX0RlbW9SZW5kZXJlcl9uYXRpdmVJbml0KCBKTklFbnYqICBlbnYgKQoreworICAgIGltcG9ydEdMSW5pdCgpOworICAgIGFwcEluaXQoKTsKKyAgICBnQXBwQWxpdmUgID0gMTsKK30KKwordm9pZAorSmF2YV9jb21fZXhhbXBsZV9TYW5BbmdlbGVzX0RlbW9SZW5kZXJlcl9uYXRpdmVSZXNpemUoIEpOSUVudiogIGVudiwgam9iamVjdCAgdGhpeiwgamludCB3LCBqaW50IGggKQoreworICAgIHNXaW5kb3dXaWR0aCAgPSB3OworICAgIHNXaW5kb3dIZWlnaHQgPSBoOworICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIlNhbkFuZ2VsZXMiLCAicmVzaXplIHc9JWQgaD0lZCIsIHcsIGgpOworfQorCisvKiBDYWxsIHRvIGZpbmFsaXplIHRoZSBncmFwaGljcyBzdGF0ZSAqLwordm9pZAorSmF2YV9jb21fZXhhbXBsZV9TYW5BbmdlbGVzX0RlbW9SZW5kZXJlcl9uYXRpdmVEb25lKCBKTklFbnYqICBlbnYgKQoreworICAgIGFwcERlaW5pdCgpOworICAgIGltcG9ydEdMRGVpbml0KCk7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIHRvIGluZGljYXRlIHRvIHRoZSByZW5kZXIgbG9vcCB0aGF0IGl0IHNob3VsZAorICogc3RvcCBhcyBzb29uIGFzIHBvc3NpYmxlLgorICovCisKK3ZvaWQgX3BhdXNlKCkKK3sKKyAgLyogd2UgcGF1c2VkIHRoZSBhbmltYXRpb24sIHNvIHN0b3JlIHRoZSBjdXJyZW50CisgICAqIHRpbWUgaW4gc1RpbWVTdG9wcGVkIGZvciBmdXR1cmUgbmF0aXZlUmVuZGVyIGNhbGxzICovCisgICAgc0RlbW9TdG9wcGVkID0gMTsKKyAgICBzVGltZVN0b3BwZWQgPSBfZ2V0VGltZSgpOworfQorCit2b2lkIF9yZXN1bWUoKQoreworICAvKiB3ZSByZXN1bWVkIHRoZSBhbmltYXRpb24sIHNvIGFkanVzdCB0aGUgdGltZSBvZmZzZXQKKyAgICogdG8gdGFrZSBjYXJlIG9mIHRoZSBwYXVzZSBpbnRlcnZhbC4gKi8KKyAgICBzRGVtb1N0b3BwZWQgPSAwOworICAgIHNUaW1lT2Zmc2V0IC09IF9nZXRUaW1lKCkgLSBzVGltZVN0b3BwZWQ7Cit9CisKKwordm9pZAorSmF2YV9jb21fZXhhbXBsZV9TYW5BbmdlbGVzX0RlbW9HTFN1cmZhY2VWaWV3X25hdGl2ZVRvZ2dsZVBhdXNlUmVzdW1lKCBKTklFbnYqICBlbnYgKQoreworICAgIHNEZW1vU3RvcHBlZCA9ICFzRGVtb1N0b3BwZWQ7CisgICAgaWYgKHNEZW1vU3RvcHBlZCkKKyAgICAgICAgX3BhdXNlKCk7CisgICAgZWxzZQorICAgICAgICBfcmVzdW1lKCk7Cit9CisKK3ZvaWQKK0phdmFfY29tX2V4YW1wbGVfU2FuQW5nZWxlc19EZW1vR0xTdXJmYWNlVmlld19uYXRpdmVQYXVzZSggSk5JRW52KiAgZW52ICkKK3sKKyAgICBfcGF1c2UoKTsKK30KKwordm9pZAorSmF2YV9jb21fZXhhbXBsZV9TYW5BbmdlbGVzX0RlbW9HTFN1cmZhY2VWaWV3X25hdGl2ZVJlc3VtZSggSk5JRW52KiAgZW52ICkKK3sKKyAgICBfcmVzdW1lKCk7Cit9CisKKy8qIENhbGwgdG8gcmVuZGVyIHRoZSBuZXh0IEdMIGZyYW1lICovCit2b2lkCitKYXZhX2NvbV9leGFtcGxlX1NhbkFuZ2VsZXNfRGVtb1JlbmRlcmVyX25hdGl2ZVJlbmRlciggSk5JRW52KiAgZW52ICkKK3sKKyAgICBsb25nICAgY3VyVGltZTsKKworICAgIC8qIE5PVEU6IGlmIHNEZW1vU3RvcHBlZCBpcyBUUlVFLCB0aGVuIHdlIHJlLXJlbmRlciB0aGUgc2FtZSBmcmFtZQorICAgICAqICAgICAgIG9uIGVhY2ggaXRlcmF0aW9uLgorICAgICAqLworICAgIGlmIChzRGVtb1N0b3BwZWQpIHsKKyAgICAgICAgY3VyVGltZSA9IHNUaW1lU3RvcHBlZCArIHNUaW1lT2Zmc2V0OworICAgIH0gZWxzZSB7CisgICAgICAgIGN1clRpbWUgPSBfZ2V0VGltZSgpICsgc1RpbWVPZmZzZXQ7CisgICAgICAgIGlmIChzVGltZU9mZnNldEluaXQgPT0gMCkgeworICAgICAgICAgICAgc1RpbWVPZmZzZXRJbml0ID0gMTsKKyAgICAgICAgICAgIHNUaW1lT2Zmc2V0ICAgICA9IC1jdXJUaW1lOworICAgICAgICAgICAgY3VyVGltZSAgICAgICAgID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiU2FuQW5nZWxlcyIsICJjdXJUaW1lPSVsZCIsIGN1clRpbWUpOworCisgICAgYXBwUmVuZGVyKGN1clRpbWUsIHNXaW5kb3dXaWR0aCwgc1dpbmRvd0hlaWdodCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9uZGtTYW5BbmdlbGVzL3NyYy9tYWluL2puaS9hcHAuaCBiL3Rlc3RzL25ka1NhbkFuZ2VsZXMvc3JjL21haW4vam5pL2FwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZWJkMzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9uZGtTYW5BbmdlbGVzL3NyYy9tYWluL2puaS9hcHAuaApAQCAtMCwwICsxLDU2IEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBhcHAuaCx2IDEuMTQgMjAwNS8wMi8wNiAyMToxMzo1NCB0b25pYyBFeHAgJAorICogJFJldmlzaW9uOiAxLjE0ICQKKyAqLworCisjaWZuZGVmIEFQUF9IX0lOQ0xVREVECisjZGVmaW5lIEFQUF9IX0lOQ0xVREVECisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNkZWZpbmUgV0lORE9XX0RFRkFVTFRfV0lEVEggICAgNjQwCisjZGVmaW5lIFdJTkRPV19ERUZBVUxUX0hFSUdIVCAgIDQ4MAorCisjZGVmaW5lIFdJTkRPV19CUFAgICAgICAgICAgICAgIDE2CisKKworLy8gVGhlIHNpbXBsZSBmcmFtZXdvcmsgZXhwZWN0cyB0aGUgYXBwbGljYXRpb24gY29kZSB0byBkZWZpbmUgdGhlc2UgZnVuY3Rpb25zLgorZXh0ZXJuIHZvaWQgYXBwSW5pdCgpOworZXh0ZXJuIHZvaWQgYXBwRGVpbml0KCk7CitleHRlcm4gdm9pZCBhcHBSZW5kZXIobG9uZyB0aWNrLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisvKiBWYWx1ZSBpcyBub24temVybyB3aGVuIGFwcGxpY2F0aW9uIGlzIGFsaXZlLCBhbmQgMCB3aGVuIGl0IGlzIGNsb3NpbmcuCisgKiBEZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBmcmFtZXdvcmsuCisgKi8KK2V4dGVybiBpbnQgZ0FwcEFsaXZlOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8vICFBUFBfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrU2FuQW5nZWxlcy9zcmMvbWFpbi9qbmkvY2Ftcy5oIGIvdGVzdHMvbmRrU2FuQW5nZWxlcy9zcmMvbWFpbi9qbmkvY2Ftcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWFjYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9uZGtTYW5BbmdlbGVzL3NyYy9tYWluL2puaS9jYW1zLmgKQEAgLTAsMCArMSw2NSBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogY2Ftcy5oLHYgMS43IDIwMDUvMDEvMzEgMjI6MTU6MTUgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS43ICQKKyAqLworCisjaWZuZGVmIENBTVNfSF9JTkNMVURFRAorI2RlZmluZSBDQU1TX0hfSU5DTFVERUQKKworCisvKiBMZW5ndGggaW4gbWlsbGlzZWNvbmRzIG9mIG9uZSBjYW1lcmEgdHJhY2sgYmFzZSB1bml0LgorICogVGhlIHZhbHVlIG9yaWdpbmF0ZXMgZnJvbSB0aGUgbXVzaWMgc3luY2hyb25pemF0aW9uLgorICovCisjZGVmaW5lIENBTVRSQUNLX0xFTiAgICA1NDQyCisKKworLy8gQ2FtZXJhIHRyYWNrIGRlZmluaXRpb24gZm9yIG9uZSBjYW1lcmEgdHJ1Y2tpbmcgc2hvdC4KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogRml2ZSBwYXJhbWV0ZXJzIG9mIHNyY1s1XSBhbmQgZGVzdFs1XToKKyAgICAgKiBleWVYLCBleWVZLCBleWVaLCB2aWV3QW5nbGUsIHZpZXdIZWlnaHRPZmZzCisgICAgICovCisgICAgc2hvcnQgc3JjWzVdLCBkZXN0WzVdOworICAgIHVuc2lnbmVkIGNoYXIgZGlzdDsgICAgIC8vIGlmID4wLCBjYW0gcm90YXRlcyBhcm91bmQgZXllIHh5IG9uIGRpc3QgKiAwLjEKKyAgICB1bnNpZ25lZCBjaGFyIGxlbjsgICAgICAvLyBsZW5ndGggbXVsdGlwbGllcgorfSBDQU1UUkFDSzsKKworc3RhdGljIENBTVRSQUNLIHNDYW1UcmFja3NbXSA9Cit7CisgICAgeyB7IDQ1MDAsIDI3MDAsIDEwMCwgNzAsIC0zMCB9LCB7IDUwLCA1MCwgLTkwLCAtMTAwLCAwIH0sIDIwLCAxIH0sCisgICAgeyB7IC0xNDQ4LCA0Mjk0LCAyNSwgMzYzLCAwIH0sIHsgLTEzNiwgMjAyLCAxMjUsIC05OCwgMTAwIH0sIDAsIDEgfSwKKyAgICB7IHsgMTQzNywgNDkzMCwgMjAwLCAtMjc1LCAtMjAgfSwgeyAxNjg0LCAwLCAwLCA5LCAwIH0sIDAsIDEgfSwKKyAgICB7IHsgMTgwMCwgMzYwOSwgMjAwLCAwLCA2NzUgfSwgeyAwLCAwLCAwLCAzMDAsIDAgfSwgMCwgMSB9LAorICAgIHsgeyA5MjMsIDk5NiwgNTAsIDIzMzYsIC04MCB9LCB7IDAsIC0yMCwgLTUwLCAwLCAxNzAgfSwgMCwgMSB9LAorICAgIHsgeyAtMTY2MywgLTQzLCA2MDAsIDIxNzAsIDAgfSwgeyAyMCwgMCwgLTYwMCwgMCwgMTAwIH0sIDAsIDEgfSwKKyAgICB7IHsgMTA0OSwgLTE0MjAsIDE3NSwgMjExMSwgLTE3IH0sIHsgMCwgMCwgMCwgLTMzNCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDAsIDAsIDUwLCAzMDAsIDI1IH0sIHsgMCwgMCwgMCwgMzAwLCAwIH0sIDcwLCAyIH0sCisgICAgeyB7IC00NzMsIC05NTMsIDM1MDAsIC0zNTMsIC0zNTAgfSwgeyAwLCAwLCAtMjgwMCwgMCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDE5MSwgMTkzOCwgMzUsIDExMzksIC0xNyB9LCB7IDEyMDUsIC0yOTA5LCAwLCAwLCAwIH0sIDAsIDIgfSwKKyAgICB7IHsgLTE0NDksIC0yNzAwLCAxNTAsIDAsIDAgfSwgeyAwLCAyMDAwLCAwLCAwLCAwIH0sIDAsIDIgfSwKKyAgICB7IHsgNTI3MywgNDk5MiwgNjUwLCAzNzMsIC01MCB9LCB7IC00NTk4LCAtMzA3MiwgMCwgMCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDMyMjMsIC0zMjgyLCAxMDc1LCAtMzkzLCAtMjUgfSwgeyAxNjQ5LCAtMTY0OSwgMCwgMCwgMCB9LCAwLCAyIH0KK307CisjZGVmaW5lIENBTVRSQUNLX0NPVU5UIChzaXplb2YoY2FtVHJhY2tzKSAvIHNpemVvZihjYW1UcmFja3NbMF0pKQorCisKKyNlbmRpZiAvLyAhQ0FNU19IX0lOQ0xVREVECmRpZmYgLS1naXQgYS90ZXN0cy9uZGtTYW5BbmdlbGVzL3NyYy9tYWluL2puaS9kZW1vLmMgYi90ZXN0cy9uZGtTYW5BbmdlbGVzL3NyYy9tYWluL2puaS9kZW1vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNiNzNkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL25ka1NhbkFuZ2VsZXMvc3JjL21haW4vam5pL2RlbW8uYwpAQCAtMCwwICsxLDc5MiBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogZGVtby5jLHYgMS4xMCAyMDA1LzAyLzA4IDIwOjU0OjM5IHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTAgJAorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgImltcG9ydGdsLmgiCisKKyNpbmNsdWRlICJhcHAuaCIKKyNpbmNsdWRlICJzaGFwZXMuaCIKKyNpbmNsdWRlICJjYW1zLmgiCisKKworLy8gVG90YWwgcnVuIGxlbmd0aCBpcyAyMCAqIGNhbWVyYSB0cmFjayBiYXNlIHVuaXQgbGVuZ3RoIChzZWUgY2Ftcy5oKS4KKyNkZWZpbmUgUlVOX0xFTkdUSCAgKDIwICogQ0FNVFJBQ0tfTEVOKQorI3VuZGVmIFBJCisjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzMmYKKyNkZWZpbmUgUkFORE9NX1VJTlRfTUFYIDY1NTM1CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc1JhbmRvbVNlZWQgPSAwOworCitzdGF0aWMgdm9pZCBzZWVkUmFuZG9tKHVuc2lnbmVkIGxvbmcgc2VlZCkKK3sKKyAgICBzUmFuZG9tU2VlZCA9IHNlZWQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJhbmRvbVVJbnQoKQoreworICAgIHNSYW5kb21TZWVkID0gc1JhbmRvbVNlZWQgKiAweDM0M2ZkICsgMHgyNjllYzM7CisgICAgcmV0dXJuIHNSYW5kb21TZWVkID4+IDE2OworfQorCisKKy8vIENhcHBlZCBjb252ZXJzaW9uIGZyb20gZmxvYXQgdG8gZml4ZWQuCitzdGF0aWMgbG9uZyBmbG9hdFRvRml4ZWQoZmxvYXQgdmFsdWUpCit7CisgICAgaWYgKHZhbHVlIDwgLTMyNzY4KSB2YWx1ZSA9IC0zMjc2ODsKKyAgICBpZiAodmFsdWUgPiAzMjc2NykgdmFsdWUgPSAzMjc2NzsKKyAgICByZXR1cm4gKGxvbmcpKHZhbHVlICogNjU1MzYpOworfQorCisjZGVmaW5lIEZJWEVEKHZhbHVlKSBmbG9hdFRvRml4ZWQodmFsdWUpCisKKworLy8gRGVmaW5pdGlvbiBvZiBvbmUgR0wgb2JqZWN0IGluIHRoaXMgZGVtby4KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBWZXJ0ZXggYXJyYXkgYW5kIGNvbG9yIGFycmF5IGFyZSBlbmFibGVkIGZvciBhbGwgb2JqZWN0cywgc28gdGhlaXIKKyAgICAgKiBwb2ludGVycyBtdXN0IGFsd2F5cyBiZSB2YWxpZCBhbmQgbm9uLU5VTEwuIE5vcm1hbCBhcnJheSBpcyBub3QKKyAgICAgKiB1c2VkIGJ5IHRoZSBncm91bmQgcGxhbmUsIHNvIHdoZW4gaXRzIHBvaW50ZXIgaXMgTlVMTCB0aGVuIG5vcm1hbAorICAgICAqIGFycmF5IHVzYWdlIGlzIGRpc2FibGVkLgorICAgICAqCisgICAgICogVmVydGV4IGFycmF5IGlzIHN1cHBvc2VkIHRvIHVzZSBHTF9GSVhFRCBkYXRhdHlwZSBhbmQgc3RyaWRlIDAKKyAgICAgKiAoaS5lLiB0aWdodGx5IHBhY2tlZCBhcnJheSkuIENvbG9yIGFycmF5IGlzIHN1cHBvc2VkIHRvIGhhdmUgNAorICAgICAqIGNvbXBvbmVudHMgcGVyIGNvbG9yIHdpdGggR0xfVU5TSUdORURfQllURSBkYXRhdHlwZSBhbmQgc3RyaWRlIDAuCisgICAgICogTm9ybWFsIGFycmF5IGlzIHN1cHBvc2VkIHRvIHVzZSBHTF9GSVhFRCBkYXRhdHlwZSBhbmQgc3RyaWRlIDAuCisgICAgICovCisgICAgR0xmaXhlZCAqdmVydGV4QXJyYXk7CisgICAgR0x1Ynl0ZSAqY29sb3JBcnJheTsKKyAgICBHTGZpeGVkICpub3JtYWxBcnJheTsKKyAgICBHTGludCB2ZXJ0ZXhDb21wb25lbnRzOworICAgIEdMc2l6ZWkgY291bnQ7Cit9IEdMT0JKRUNUOworCisKK3N0YXRpYyBsb25nIHNTdGFydFRpY2sgPSAwOworc3RhdGljIGxvbmcgc1RpY2sgPSAwOworCitzdGF0aWMgaW50IHNDdXJyZW50Q2FtVHJhY2sgPSAwOworc3RhdGljIGxvbmcgc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljayA9IDA7CitzdGF0aWMgbG9uZyBzTmV4dENhbVRyYWNrU3RhcnRUaWNrID0gMHg3ZmZmZmZmZjsKKworc3RhdGljIEdMT0JKRUNUICpzU3VwZXJTaGFwZU9iamVjdHNbU1VQRVJTSEFQRV9DT1VOVF0gPSB7IE5VTEwgfTsKK3N0YXRpYyBHTE9CSkVDVCAqc0dyb3VuZFBsYW5lID0gTlVMTDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgeCwgeSwgejsKK30gVkVDVE9SMzsKKworCitzdGF0aWMgdm9pZCBmcmVlR0xPYmplY3QoR0xPQkpFQ1QgKm9iamVjdCkKK3sKKyAgICBpZiAob2JqZWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBmcmVlKG9iamVjdC0+bm9ybWFsQXJyYXkpOworICAgIGZyZWUob2JqZWN0LT5jb2xvckFycmF5KTsKKyAgICBmcmVlKG9iamVjdC0+dmVydGV4QXJyYXkpOworICAgIGZyZWUob2JqZWN0KTsKK30KKworCitzdGF0aWMgR0xPQkpFQ1QgKiBuZXdHTE9iamVjdChsb25nIHZlcnRpY2VzLCBpbnQgdmVydGV4Q29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VOb3JtYWxBcnJheSkKK3sKKyAgICBHTE9CSkVDVCAqcmVzdWx0OworICAgIHJlc3VsdCA9IChHTE9CSkVDVCAqKW1hbGxvYyhzaXplb2YoR0xPQkpFQ1QpKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdC0+Y291bnQgPSB2ZXJ0aWNlczsKKyAgICByZXN1bHQtPnZlcnRleENvbXBvbmVudHMgPSB2ZXJ0ZXhDb21wb25lbnRzOworICAgIHJlc3VsdC0+dmVydGV4QXJyYXkgPSAoR0xmaXhlZCAqKW1hbGxvYyh2ZXJ0aWNlcyAqIHZlcnRleENvbXBvbmVudHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR0xmaXhlZCkpOworICAgIHJlc3VsdC0+Y29sb3JBcnJheSA9IChHTHVieXRlICopbWFsbG9jKHZlcnRpY2VzICogNCAqIHNpemVvZihHTHVieXRlKSk7CisgICAgaWYgKHVzZU5vcm1hbEFycmF5KQorICAgIHsKKyAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheSA9IChHTGZpeGVkICopbWFsbG9jKHZlcnRpY2VzICogMyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR0xmaXhlZCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXkgPSBOVUxMOworICAgIGlmIChyZXN1bHQtPnZlcnRleEFycmF5ID09IE5VTEwgfHwKKyAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5ID09IE5VTEwgfHwKKyAgICAgICAgKHVzZU5vcm1hbEFycmF5ICYmIHJlc3VsdC0+bm9ybWFsQXJyYXkgPT0gTlVMTCkpCisgICAgeworICAgICAgICBmcmVlR0xPYmplY3QocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHZvaWQgZHJhd0dMT2JqZWN0KEdMT0JKRUNUICpvYmplY3QpCit7CisgICAgYXNzZXJ0KG9iamVjdCAhPSBOVUxMKTsKKworICAgIGdsVmVydGV4UG9pbnRlcihvYmplY3QtPnZlcnRleENvbXBvbmVudHMsIEdMX0ZJWEVELAorICAgICAgICAgICAgICAgICAgICAwLCBvYmplY3QtPnZlcnRleEFycmF5KTsKKyAgICBnbENvbG9yUG9pbnRlcig0LCBHTF9VTlNJR05FRF9CWVRFLCAwLCBvYmplY3QtPmNvbG9yQXJyYXkpOworCisgICAgLy8gQWxyZWFkeSBkb25lIGluIGluaXRpYWxpemF0aW9uOgorICAgIC8vZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOworICAgIC8vZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisKKyAgICBpZiAob2JqZWN0LT5ub3JtYWxBcnJheSkKKyAgICB7CisgICAgICAgIGdsTm9ybWFsUG9pbnRlcihHTF9GSVhFRCwgMCwgb2JqZWN0LT5ub3JtYWxBcnJheSk7CisgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOworICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIG9iamVjdC0+Y291bnQpOworfQorCisKK3N0YXRpYyB2b2lkIHZlY3RvcjNTdWIoVkVDVE9SMyAqZGVzdCwgVkVDVE9SMyAqdjEsIFZFQ1RPUjMgKnYyKQoreworICAgIGRlc3QtPnggPSB2MS0+eCAtIHYyLT54OworICAgIGRlc3QtPnkgPSB2MS0+eSAtIHYyLT55OworICAgIGRlc3QtPnogPSB2MS0+eiAtIHYyLT56OworfQorCisKK3N0YXRpYyB2b2lkIHN1cGVyU2hhcGVNYXAoVkVDVE9SMyAqcG9pbnQsIGZsb2F0IHIxLCBmbG9hdCByMiwgZmxvYXQgdCwgZmxvYXQgcCkKK3sKKyAgICAvLyBzcGhlcmUtbWFwcGluZyBvZiBzdXBlcnNoYXBlIHBhcmFtZXRlcnMKKyAgICBwb2ludC0+eCA9IChmbG9hdCkoY29zKHQpICogY29zKHApIC8gcjEgLyByMik7CisgICAgcG9pbnQtPnkgPSAoZmxvYXQpKHNpbih0KSAqIGNvcyhwKSAvIHIxIC8gcjIpOworICAgIHBvaW50LT56ID0gKGZsb2F0KShzaW4ocCkgLyByMik7Cit9CisKKworc3RhdGljIGZsb2F0IHNzRnVuYyhjb25zdCBmbG9hdCB0LCBjb25zdCBmbG9hdCAqcCkKK3sKKyAgICByZXR1cm4gKGZsb2F0KShwb3cocG93KGZhYnMoY29zKHBbMF0gKiB0IC8gNCkpIC8gcFsxXSwgcFs0XSkgKworICAgICAgICAgICAgICAgICAgICAgICBwb3coZmFicyhzaW4ocFswXSAqIHQgLyA0KSkgLyBwWzJdLCBwWzVdKSwgMSAvIHBbM10pKTsKK30KKworCisvLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgc3VwZXJzaGFwZSBvYmplY3QuCisvLyBCYXNlZCBvbiBQYXVsIEJvdXJrZSdzIFBPVi1SYXkgaW1wbGVtZW50YXRpb24uCisvLyBodHRwOi8vYXN0cm9ub215LnN3aW4uZWR1LmF1L35wYm91cmtlL3BvdnJheS9zdXBlcnNoYXBlLworc3RhdGljIEdMT0JKRUNUICogY3JlYXRlU3VwZXJTaGFwZShjb25zdCBmbG9hdCAqcGFyYW1zKQoreworICAgIGNvbnN0IGludCByZXNvbDEgPSAoaW50KXBhcmFtc1tTVVBFUlNIQVBFX1BBUkFNUyAtIDNdOworICAgIGNvbnN0IGludCByZXNvbDIgPSAoaW50KXBhcmFtc1tTVVBFUlNIQVBFX1BBUkFNUyAtIDJdOworICAgIC8vIGxhdGl0dWRlIDAgdG8gcGkvMiBmb3Igbm8gbWlycm9yZWQgYm90dG9tCisgICAgLy8gKGxhdGl0dWRlQmVnaW49PTAgZm9yIC1waS8yIHRvIHBpLzIgb3JpZ2luYWxseSkKKyAgICBjb25zdCBpbnQgbGF0aXR1ZGVCZWdpbiA9IHJlc29sMiAvIDQ7CisgICAgY29uc3QgaW50IGxhdGl0dWRlRW5kID0gcmVzb2wyIC8gMjsgICAgLy8gbm9uLWluY2x1c2l2ZQorICAgIGNvbnN0IGludCBsb25naXR1ZGVDb3VudCA9IHJlc29sMTsKKyAgICBjb25zdCBpbnQgbGF0aXR1ZGVDb3VudCA9IGxhdGl0dWRlRW5kIC0gbGF0aXR1ZGVCZWdpbjsKKyAgICBjb25zdCBsb25nIHRyaWFuZ2xlQ291bnQgPSBsb25naXR1ZGVDb3VudCAqIGxhdGl0dWRlQ291bnQgKiAyOworICAgIGNvbnN0IGxvbmcgdmVydGljZXMgPSB0cmlhbmdsZUNvdW50ICogMzsKKyAgICBHTE9CSkVDVCAqcmVzdWx0OworICAgIGZsb2F0IGJhc2VDb2xvclszXTsKKyAgICBpbnQgYSwgbG9uZ2l0dWRlLCBsYXRpdHVkZTsKKyAgICBsb25nIGN1cnJlbnRWZXJ0ZXgsIGN1cnJlbnRRdWFkOworCisgICAgcmVzdWx0ID0gbmV3R0xPYmplY3QodmVydGljZXMsIDMsIDEpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGEgPSAwOyBhIDwgMzsgKythKQorICAgICAgICBiYXNlQ29sb3JbYV0gPSAoKHJhbmRvbVVJbnQoKSAlIDE1NSkgKyAxMDApIC8gMjU1LmY7CisKKyAgICBjdXJyZW50UXVhZCA9IDA7CisgICAgY3VycmVudFZlcnRleCA9IDA7CisKKyAgICAvLyBsb25naXR1ZGUgLXBpIHRvIHBpCisgICAgZm9yIChsb25naXR1ZGUgPSAwOyBsb25naXR1ZGUgPCBsb25naXR1ZGVDb3VudDsgKytsb25naXR1ZGUpCisgICAgeworCisgICAgICAgIC8vIGxhdGl0dWRlIDAgdG8gcGkvMgorICAgICAgICBmb3IgKGxhdGl0dWRlID0gbGF0aXR1ZGVCZWdpbjsgbGF0aXR1ZGUgPCBsYXRpdHVkZUVuZDsgKytsYXRpdHVkZSkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgdDEgPSAtUEkgKyBsb25naXR1ZGUgKiAyICogUEkgLyByZXNvbDE7CisgICAgICAgICAgICBmbG9hdCB0MiA9IC1QSSArIChsb25naXR1ZGUgKyAxKSAqIDIgKiBQSSAvIHJlc29sMTsKKyAgICAgICAgICAgIGZsb2F0IHAxID0gLVBJIC8gMiArIGxhdGl0dWRlICogMiAqIFBJIC8gcmVzb2wyOworICAgICAgICAgICAgZmxvYXQgcDIgPSAtUEkgLyAyICsgKGxhdGl0dWRlICsgMSkgKiAyICogUEkgLyByZXNvbDI7CisgICAgICAgICAgICBmbG9hdCByMCwgcjEsIHIyLCByMzsKKworICAgICAgICAgICAgcjAgPSBzc0Z1bmModDEsIHBhcmFtcyk7CisgICAgICAgICAgICByMSA9IHNzRnVuYyhwMSwgJnBhcmFtc1s2XSk7CisgICAgICAgICAgICByMiA9IHNzRnVuYyh0MiwgcGFyYW1zKTsKKyAgICAgICAgICAgIHIzID0gc3NGdW5jKHAyLCAmcGFyYW1zWzZdKTsKKworICAgICAgICAgICAgaWYgKHIwICE9IDAgJiYgcjEgIT0gMCAmJiByMiAhPSAwICYmIHIzICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVkVDVE9SMyBwYSwgcGIsIHBjLCBwZDsKKyAgICAgICAgICAgICAgICBWRUNUT1IzIHYxLCB2MiwgbjsKKyAgICAgICAgICAgICAgICBmbG9hdCBjYTsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAvL2Zsb2F0IGxlblNxLCBpbnZMZW5TcTsKKworICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBhLCByMCwgcjEsIHQxLCBwMSk7CisgICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGIsIHIyLCByMSwgdDIsIHAxKTsKKyAgICAgICAgICAgICAgICBzdXBlclNoYXBlTWFwKCZwYywgcjIsIHIzLCB0MiwgcDIpOworICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBkLCByMCwgcjMsIHQxLCBwMik7CisKKyAgICAgICAgICAgICAgICAvLyBrbHVkZ2UgdG8gc2V0IGxvd2VyIGVkZ2Ugb2YgdGhlIG9iamVjdCB0byBmaXhlZCBsZXZlbAorICAgICAgICAgICAgICAgIGlmIChsYXRpdHVkZSA9PSBsYXRpdHVkZUJlZ2luICsgMSkKKyAgICAgICAgICAgICAgICAgICAgcGEueiA9IHBiLnogPSAwOworCisgICAgICAgICAgICAgICAgdmVjdG9yM1N1YigmdjEsICZwYiwgJnBhKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IzU3ViKCZ2MiwgJnBkLCAmcGEpOworCisgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG5vcm1hbCB3aXRoIGNyb3NzIHByb2R1Y3QuCisgICAgICAgICAgICAgICAgLyogICBpICAgIGogICAgayAgICAgIGkgICAgagorICAgICAgICAgICAgICAgICAqIHYxLnggdjEueSB2MS56IHwgdjEueCB2MS55CisgICAgICAgICAgICAgICAgICogdjIueCB2Mi55IHYyLnogfCB2Mi54IHYyLnkKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIG4ueCA9IHYxLnkgKiB2Mi56IC0gdjEueiAqIHYyLnk7CisgICAgICAgICAgICAgICAgbi55ID0gdjEueiAqIHYyLnggLSB2MS54ICogdjIuejsKKyAgICAgICAgICAgICAgICBuLnogPSB2MS54ICogdjIueSAtIHYxLnkgKiB2Mi54OworCisgICAgICAgICAgICAgICAgLyogUHJlLW5vcm1hbGl6YXRpb24gb2YgdGhlIG5vcm1hbHMgaXMgZGlzYWJsZWQgaGVyZSBiZWNhdXNlCisgICAgICAgICAgICAgICAgICogdGhleSB3aWxsIGJlIG5vcm1hbGl6ZWQgYW55d2F5IGxhdGVyIGR1ZSB0byBhdXRvbWF0aWMKKyAgICAgICAgICAgICAgICAgKiBub3JtYWxpemF0aW9uIChHTF9OT1JNQUxJWkUpLiBJdCBpcyBlbmFibGVkIGJlY2F1c2UgdGhlCisgICAgICAgICAgICAgICAgICogb2JqZWN0cyBhcmUgc2NhbGVkIHdpdGggZ2xTY2FsZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIGxlblNxID0gbi54ICogbi54ICsgbi55ICogbi55ICsgbi56ICogbi56OworICAgICAgICAgICAgICAgIGludkxlblNxID0gKGZsb2F0KSgxIC8gc3FydChsZW5TcSkpOworICAgICAgICAgICAgICAgIG4ueCAqPSBpbnZMZW5TcTsKKyAgICAgICAgICAgICAgICBuLnkgKj0gaW52TGVuU3E7CisgICAgICAgICAgICAgICAgbi56ICo9IGludkxlblNxOworICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICBjYSA9IHBhLnogKyAwLjVmOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gY3VycmVudFZlcnRleCAqIDM7CisgICAgICAgICAgICAgICAgICAgICBpIDwgKGN1cnJlbnRWZXJ0ZXggKyA2KSAqIDM7CisgICAgICAgICAgICAgICAgICAgICBpICs9IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5W2ldID0gRklYRUQobi54KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheVtpICsgMV0gPSBGSVhFRChuLnkpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5W2kgKyAyXSA9IEZJWEVEKG4ueik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IGN1cnJlbnRWZXJ0ZXggKiA0OworICAgICAgICAgICAgICAgICAgICAgaSA8IChjdXJyZW50VmVydGV4ICsgNikgKiA0OworICAgICAgICAgICAgICAgICAgICAgaSArPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGEsIGNvbG9yWzNdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgMzsgKythKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclthXSA9IChpbnQpKGNhICogYmFzZUNvbG9yW2FdICogMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvclthXSA+IDI1NSkgY29sb3JbYV0gPSAyNTU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2ldID0gKEdMdWJ5dGUpY29sb3JbMF07CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgMV0gPSAoR0x1Ynl0ZSljb2xvclsxXTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAyXSA9IChHTHVieXRlKWNvbG9yWzJdOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDNdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYS54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYS55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYS56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYi54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYi55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYi56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwZC54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwZC55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwZC56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYi54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYi55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYi56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYy54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYy55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYy56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwZC54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwZC55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwZC56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICB9IC8vIHIwICYmIHIxICYmIHIyICYmIHIzCisgICAgICAgICAgICArK2N1cnJlbnRRdWFkOworICAgICAgICB9IC8vIGxhdGl0dWRlCisgICAgfSAvLyBsb25naXR1ZGUKKworICAgIC8vIFNldCBudW1iZXIgb2YgdmVydGljZXMgaW4gb2JqZWN0IHRvIHRoZSBhY3R1YWwgYW1vdW50IGNyZWF0ZWQuCisgICAgcmVzdWx0LT5jb3VudCA9IGN1cnJlbnRWZXJ0ZXg7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBHTE9CSkVDVCAqIGNyZWF0ZUdyb3VuZFBsYW5lKCkKK3sKKyAgICBjb25zdCBpbnQgc2NhbGUgPSA0OworICAgIGNvbnN0IGludCB5QmVnaW4gPSAtMTUsIHlFbmQgPSAxNTsgICAgLy8gZW5kcyBhcmUgbm9uLWluY2x1c2l2ZQorICAgIGNvbnN0IGludCB4QmVnaW4gPSAtMTUsIHhFbmQgPSAxNTsKKyAgICBjb25zdCBsb25nIHRyaWFuZ2xlQ291bnQgPSAoeUVuZCAtIHlCZWdpbikgKiAoeEVuZCAtIHhCZWdpbikgKiAyOworICAgIGNvbnN0IGxvbmcgdmVydGljZXMgPSB0cmlhbmdsZUNvdW50ICogMzsKKyAgICBHTE9CSkVDVCAqcmVzdWx0OworICAgIGludCB4LCB5OworICAgIGxvbmcgY3VycmVudFZlcnRleCwgY3VycmVudFF1YWQ7CisKKyAgICByZXN1bHQgPSBuZXdHTE9iamVjdCh2ZXJ0aWNlcywgMiwgMCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGN1cnJlbnRRdWFkID0gMDsKKyAgICBjdXJyZW50VmVydGV4ID0gMDsKKworICAgIGZvciAoeSA9IHlCZWdpbjsgeSA8IHlFbmQ7ICsreSkKKyAgICB7CisgICAgICAgIGZvciAoeCA9IHhCZWdpbjsgeCA8IHhFbmQ7ICsreCkKKyAgICAgICAgeworICAgICAgICAgICAgR0x1Ynl0ZSBjb2xvcjsKKyAgICAgICAgICAgIGludCBpLCBhOworICAgICAgICAgICAgY29sb3IgPSAoR0x1Ynl0ZSkoKHJhbmRvbVVJbnQoKSAmIDB4NWYpICsgODEpOyAgLy8gMTAxIDExMTEKKyAgICAgICAgICAgIGZvciAoaSA9IGN1cnJlbnRWZXJ0ZXggKiA0OyBpIDwgKGN1cnJlbnRWZXJ0ZXggKyA2KSAqIDQ7IGkgKz0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaV0gPSBjb2xvcjsKKyAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDFdID0gY29sb3I7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAyXSA9IGNvbG9yOworICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgM10gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBeGlzIGJpdHMgZm9yIHF1YWQgdHJpYW5nbGVzOgorICAgICAgICAgICAgLy8geDogMDExMTAwICgweDFjKSwgeTogMTEwMDAxICgweDMxKSAgKGNsb2Nrd2lzZSkKKyAgICAgICAgICAgIC8vIHg6IDAwMTExMCAoMHgwZSksIHk6IDEwMDAxMSAoMHgyMykgIChjb3VudGVyLWNsb2Nrd2lzZSkKKyAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCA2OyArK2EpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHhtID0geCArICgoMHgxYyA+PiBhKSAmIDEpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCB5bSA9IHkgKyAoKDB4MzEgPj4gYSkgJiAxKTsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBtID0gKGZsb2F0KShjb3MoeG0gKiAyKSAqIHNpbih5bSAqIDQpICogMC43NWYpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDJdID0KKyAgICAgICAgICAgICAgICAgICAgRklYRUQoeG0gKiBzY2FsZSArIG0pOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDIgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIEZJWEVEKHltICogc2NhbGUgKyBtKTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2N1cnJlbnRRdWFkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHZvaWQgZHJhd0dyb3VuZFBsYW5lKCkKK3sKKyAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgIGdsQmxlbmRGdW5jKEdMX1pFUk8sIEdMX1NSQ19DT0xPUik7CisgICAgZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKKworICAgIGRyYXdHTE9iamVjdChzR3JvdW5kUGxhbmUpOworCisgICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOworICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7Cit9CisKKworc3RhdGljIHZvaWQgZHJhd0ZhZGVRdWFkKCkKK3sKKyAgICBzdGF0aWMgY29uc3QgR0xmaXhlZCBxdWFkVmVydGljZXNbXSA9IHsKKyAgICAgICAgLTB4MTAwMDAsIC0weDEwMDAwLAorICAgICAgICAgMHgxMDAwMCwgLTB4MTAwMDAsCisgICAgICAgIC0weDEwMDAwLCAgMHgxMDAwMCwKKyAgICAgICAgIDB4MTAwMDAsIC0weDEwMDAwLAorICAgICAgICAgMHgxMDAwMCwgIDB4MTAwMDAsCisgICAgICAgIC0weDEwMDAwLCAgMHgxMDAwMAorICAgIH07CisKKyAgICBjb25zdCBpbnQgYmVnaW5GYWRlID0gc1RpY2sgLSBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrOworICAgIGNvbnN0IGludCBlbmRGYWRlID0gc05leHRDYW1UcmFja1N0YXJ0VGljayAtIHNUaWNrOworICAgIGNvbnN0IGludCBtaW5GYWRlID0gYmVnaW5GYWRlIDwgZW5kRmFkZSA/IGJlZ2luRmFkZSA6IGVuZEZhZGU7CisKKyAgICBpZiAobWluRmFkZSA8IDEwMjQpCisgICAgeworICAgICAgICBjb25zdCBHTGZpeGVkIGZhZGVDb2xvciA9IG1pbkZhZGUgPDwgNjsKKyAgICAgICAgZ2xDb2xvcjR4KGZhZGVDb2xvciwgZmFkZUNvbG9yLCBmYWRlQ29sb3IsIDApOworCisgICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgICAgICBnbEJsZW5kRnVuYyhHTF9aRVJPLCBHTF9TUkNfQ09MT1IpOworICAgICAgICBnbERpc2FibGUoR0xfTElHSFRJTkcpOworCisgICAgICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworICAgICAgICBnbExvYWRJZGVudGl0eSgpOworCisgICAgICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKKworICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisgICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CisgICAgICAgIGdsVmVydGV4UG9pbnRlcigyLCBHTF9GSVhFRCwgMCwgcXVhZFZlcnRpY2VzKTsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwgNik7CisKKyAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisKKyAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisKKyAgICAgICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICB9Cit9CisKKworLy8gQ2FsbGVkIGZyb20gdGhlIGFwcCBmcmFtZXdvcmsuCit2b2lkIGFwcEluaXQoKQoreworICAgIGludCBhOworCisgICAgZ2xFbmFibGUoR0xfTk9STUFMSVpFKTsKKyAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7CisKKyAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisgICAgZ2xFbmFibGUoR0xfTElHSFQwKTsKKyAgICBnbEVuYWJsZShHTF9MSUdIVDEpOworICAgIGdsRW5hYmxlKEdMX0xJR0hUMik7CisKKyAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CisgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisKKyAgICBzZWVkUmFuZG9tKDE1KTsKKworICAgIGZvciAoYSA9IDA7IGEgPCBTVVBFUlNIQVBFX0NPVU5UOyArK2EpCisgICAgeworICAgICAgICBzU3VwZXJTaGFwZU9iamVjdHNbYV0gPSBjcmVhdGVTdXBlclNoYXBlKHNTdXBlclNoYXBlUGFyYW1zW2FdKTsKKyAgICAgICAgYXNzZXJ0KHNTdXBlclNoYXBlT2JqZWN0c1thXSAhPSBOVUxMKTsKKyAgICB9CisgICAgc0dyb3VuZFBsYW5lID0gY3JlYXRlR3JvdW5kUGxhbmUoKTsKKyAgICBhc3NlcnQoc0dyb3VuZFBsYW5lICE9IE5VTEwpOworfQorCisKKy8vIENhbGxlZCBmcm9tIHRoZSBhcHAgZnJhbWV3b3JrLgordm9pZCBhcHBEZWluaXQoKQoreworICAgIGludCBhOworICAgIGZvciAoYSA9IDA7IGEgPCBTVVBFUlNIQVBFX0NPVU5UOyArK2EpCisgICAgICAgIGZyZWVHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbYV0pOworICAgIGZyZWVHTE9iamVjdChzR3JvdW5kUGxhbmUpOworfQorCisKK3N0YXRpYyB2b2lkIGdsdVBlcnNwZWN0aXZlKEdMZmxvYXQgZm92eSwgR0xmbG9hdCBhc3BlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpCit7CisgICAgR0xmbG9hdCB4bWluLCB4bWF4LCB5bWluLCB5bWF4OworCisgICAgeW1heCA9IHpOZWFyICogKEdMZmxvYXQpdGFuKGZvdnkgKiBQSSAvIDM2MCk7CisgICAgeW1pbiA9IC15bWF4OworICAgIHhtaW4gPSB5bWluICogYXNwZWN0OworICAgIHhtYXggPSB5bWF4ICogYXNwZWN0OworCisgICAgZ2xGcnVzdHVteCgoR0xmaXhlZCkoeG1pbiAqIDY1NTM2KSwgKEdMZml4ZWQpKHhtYXggKiA2NTUzNiksCisgICAgICAgICAgICAgICAoR0xmaXhlZCkoeW1pbiAqIDY1NTM2KSwgKEdMZml4ZWQpKHltYXggKiA2NTUzNiksCisgICAgICAgICAgICAgICAoR0xmaXhlZCkoek5lYXIgKiA2NTUzNiksIChHTGZpeGVkKSh6RmFyICogNjU1MzYpKTsKK30KKworCitzdGF0aWMgdm9pZCBwcmVwYXJlRnJhbWUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBnbENsZWFyQ29sb3J4KChHTGZpeGVkKSgwLjFmICogNjU1MzYpLAorICAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKDAuMmYgKiA2NTUzNiksCisgICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoMC4zZiAqIDY1NTM2KSwgMHgxMDAwMCk7CisgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgICBnbHVQZXJzcGVjdGl2ZSg0NSwgKGZsb2F0KXdpZHRoIC8gaGVpZ2h0LCAwLjVmLCAxNTApOworCisgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisKKyAgICBnbExvYWRJZGVudGl0eSgpOworfQorCisKK3N0YXRpYyB2b2lkIGNvbmZpZ3VyZUxpZ2h0QW5kTWF0ZXJpYWwoKQoreworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MFBvc2l0aW9uW10gPSB7IC0weDQwMDAwLCAweDEwMDAwLCAweDEwMDAwLCAwIH07CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQwRGlmZnVzZVtdID0geyAweDEwMDAwLCAweDY2NjYsIDAsIDB4MTAwMDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDFQb3NpdGlvbltdID0geyAweDEwMDAwLCAtMHgyMDAwMCwgLTB4MTAwMDAsIDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDFEaWZmdXNlW10gPSB7IDB4MTFlYiwgMHgyM2Q3LCAweDU5OTksIDB4MTAwMDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDJQb3NpdGlvbltdID0geyAtMHgxMDAwMCwgMCwgLTB4NDAwMDAsIDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDJEaWZmdXNlW10gPSB7IDB4MTFlYiwgMHgyYjg1LCAweDIzZDcsIDB4MTAwMDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBtYXRlcmlhbFNwZWN1bGFyW10gPSB7IDB4MTAwMDAsIDB4MTAwMDAsIDB4MTAwMDAsIDB4MTAwMDAgfTsKKworICAgIGdsTGlnaHR4dihHTF9MSUdIVDAsIEdMX1BPU0lUSU9OLCBsaWdodDBQb3NpdGlvbik7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMCwgR0xfRElGRlVTRSwgbGlnaHQwRGlmZnVzZSk7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMSwgR0xfUE9TSVRJT04sIGxpZ2h0MVBvc2l0aW9uKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQxLCBHTF9ESUZGVVNFLCBsaWdodDFEaWZmdXNlKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQyLCBHTF9QT1NJVElPTiwgbGlnaHQyUG9zaXRpb24pOworICAgIGdsTGlnaHR4dihHTF9MSUdIVDIsIEdMX0RJRkZVU0UsIGxpZ2h0MkRpZmZ1c2UpOworICAgIGdsTWF0ZXJpYWx4dihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU1BFQ1VMQVIsIG1hdGVyaWFsU3BlY3VsYXIpOworCisgICAgZ2xNYXRlcmlhbHgoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NISU5JTkVTUywgNjAgPDwgMTYpOworICAgIGdsRW5hYmxlKEdMX0NPTE9SX01BVEVSSUFMKTsKK30KKworCitzdGF0aWMgdm9pZCBkcmF3TW9kZWxzKGZsb2F0IHpTY2FsZSkKK3sKKyAgICBjb25zdCBpbnQgdHJhbnNsYXRpb25TY2FsZSA9IDk7CisgICAgaW50IHgsIHk7CisKKyAgICBzZWVkUmFuZG9tKDkpOworCisgICAgZ2xTY2FsZXgoMSA8PCAxNiwgMSA8PCAxNiwgKEdMZml4ZWQpKHpTY2FsZSAqIDY1NTM2KSk7CisKKyAgICBmb3IgKHkgPSAtNTsgeSA8PSA1OyArK3kpCisgICAgeworICAgICAgICBmb3IgKHggPSAtNTsgeCA8PSA1OyArK3gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGJ1aWxkaW5nU2NhbGU7CisgICAgICAgICAgICBHTGZpeGVkIGZpeGVkU2NhbGU7CisKKyAgICAgICAgICAgIGludCBjdXJTaGFwZSA9IHJhbmRvbVVJbnQoKSAlIFNVUEVSU0hBUEVfQ09VTlQ7CisgICAgICAgICAgICBidWlsZGluZ1NjYWxlID0gc1N1cGVyU2hhcGVQYXJhbXNbY3VyU2hhcGVdW1NVUEVSU0hBUEVfUEFSQU1TIC0gMV07CisgICAgICAgICAgICBmaXhlZFNjYWxlID0gKEdMZml4ZWQpKGJ1aWxkaW5nU2NhbGUgKiA2NTUzNik7CisKKyAgICAgICAgICAgIGdsUHVzaE1hdHJpeCgpOworICAgICAgICAgICAgZ2xUcmFuc2xhdGV4KCh4ICogdHJhbnNsYXRpb25TY2FsZSkgKiA2NTUzNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoeSAqIHRyYW5zbGF0aW9uU2NhbGUpICogNjU1MzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBnbFJvdGF0ZXgoKEdMZml4ZWQpKChyYW5kb21VSW50KCkgJSAzNjApIDw8IDE2KSwgMCwgMCwgMSA8PCAxNik7CisgICAgICAgICAgICBnbFNjYWxleChmaXhlZFNjYWxlLCBmaXhlZFNjYWxlLCBmaXhlZFNjYWxlKTsKKworICAgICAgICAgICAgZHJhd0dMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1tjdXJTaGFwZV0pOworICAgICAgICAgICAgZ2xQb3BNYXRyaXgoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoeCA9IC0yOyB4IDw9IDI7ICsreCkKKyAgICB7CisgICAgICAgIGNvbnN0IGludCBzaGlwU2NhbGUxMDAgPSB0cmFuc2xhdGlvblNjYWxlICogNTAwOworICAgICAgICBjb25zdCBpbnQgb2ZmczEwMCA9IHggKiBzaGlwU2NhbGUxMDAgKyAoc1RpY2sgJSBzaGlwU2NhbGUxMDApOworICAgICAgICBmbG9hdCBvZmZzID0gb2ZmczEwMCAqIDAuMDFmOworICAgICAgICBHTGZpeGVkIGZpeGVkT2ZmcyA9IChHTGZpeGVkKShvZmZzICogNjU1MzYpOworICAgICAgICBnbFB1c2hNYXRyaXgoKTsKKyAgICAgICAgZ2xUcmFuc2xhdGV4KGZpeGVkT2ZmcywgLTQgKiA2NTUzNiwgMiA8PCAxNik7CisgICAgICAgIGRyYXdHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbU1VQRVJTSEFQRV9DT1VOVCAtIDFdKTsKKyAgICAgICAgZ2xQb3BNYXRyaXgoKTsKKyAgICAgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgICAgIGdsVHJhbnNsYXRleCgtNCAqIDY1NTM2LCBmaXhlZE9mZnMsIDQgPDwgMTYpOworICAgICAgICBnbFJvdGF0ZXgoOTAgPDwgMTYsIDAsIDAsIDEgPDwgMTYpOworICAgICAgICBkcmF3R0xPYmplY3Qoc1N1cGVyU2hhcGVPYmplY3RzW1NVUEVSU0hBUEVfQ09VTlQgLSAxXSk7CisgICAgICAgIGdsUG9wTWF0cml4KCk7CisgICAgfQorfQorCisKKy8qIEZvbGxvd2luZyBnbHVMb29rQXQgaW1wbGVtZW50YXRpb24gaXMgYWRhcHRlZCBmcm9tIHRoZQorICogTWVzYSAzRCBHcmFwaGljcyBsaWJyYXJ5LiBodHRwOi8vd3d3Lm1lc2EzZC5vcmcKKyAqLworc3RhdGljIHZvaWQgZ2x1TG9va0F0KEdMZmxvYXQgZXlleCwgR0xmbG9hdCBleWV5LCBHTGZsb2F0IGV5ZXosCisJICAgICAgICAgICAgICBHTGZsb2F0IGNlbnRlcngsIEdMZmxvYXQgY2VudGVyeSwgR0xmbG9hdCBjZW50ZXJ6LAorCSAgICAgICAgICAgICAgR0xmbG9hdCB1cHgsIEdMZmxvYXQgdXB5LCBHTGZsb2F0IHVweikKK3sKKyAgICBHTGZsb2F0IG1bMTZdOworICAgIEdMZmxvYXQgeFszXSwgeVszXSwgelszXTsKKyAgICBHTGZsb2F0IG1hZzsKKworICAgIC8qIE1ha2Ugcm90YXRpb24gbWF0cml4ICovCisKKyAgICAvKiBaIHZlY3RvciAqLworICAgIHpbMF0gPSBleWV4IC0gY2VudGVyeDsKKyAgICB6WzFdID0gZXlleSAtIGNlbnRlcnk7CisgICAgelsyXSA9IGV5ZXogLSBjZW50ZXJ6OworICAgIG1hZyA9IChmbG9hdClzcXJ0KHpbMF0gKiB6WzBdICsgelsxXSAqIHpbMV0gKyB6WzJdICogelsyXSk7CisgICAgaWYgKG1hZykgewkJCS8qIG1waWNobGVyLCAxOTk1MDUxNSAqLworICAgICAgICB6WzBdIC89IG1hZzsKKyAgICAgICAgelsxXSAvPSBtYWc7CisgICAgICAgIHpbMl0gLz0gbWFnOworICAgIH0KKworICAgIC8qIFkgdmVjdG9yICovCisgICAgeVswXSA9IHVweDsKKyAgICB5WzFdID0gdXB5OworICAgIHlbMl0gPSB1cHo7CisKKyAgICAvKiBYIHZlY3RvciA9IFkgY3Jvc3MgWiAqLworICAgIHhbMF0gPSB5WzFdICogelsyXSAtIHlbMl0gKiB6WzFdOworICAgIHhbMV0gPSAteVswXSAqIHpbMl0gKyB5WzJdICogelswXTsKKyAgICB4WzJdID0geVswXSAqIHpbMV0gLSB5WzFdICogelswXTsKKworICAgIC8qIFJlY29tcHV0ZSBZID0gWiBjcm9zcyBYICovCisgICAgeVswXSA9IHpbMV0gKiB4WzJdIC0gelsyXSAqIHhbMV07CisgICAgeVsxXSA9IC16WzBdICogeFsyXSArIHpbMl0gKiB4WzBdOworICAgIHlbMl0gPSB6WzBdICogeFsxXSAtIHpbMV0gKiB4WzBdOworCisgICAgLyogbXBpY2hsZXIsIDE5OTUwNTE1ICovCisgICAgLyogY3Jvc3MgcHJvZHVjdCBnaXZlcyBhcmVhIG9mIHBhcmFsbGVsb2dyYW0sIHdoaWNoIGlzIDwgMS4wIGZvcgorICAgICAqIG5vbi1wZXJwZW5kaWN1bGFyIHVuaXQtbGVuZ3RoIHZlY3RvcnM7IHNvIG5vcm1hbGl6ZSB4LCB5IGhlcmUKKyAgICAgKi8KKworICAgIG1hZyA9IChmbG9hdClzcXJ0KHhbMF0gKiB4WzBdICsgeFsxXSAqIHhbMV0gKyB4WzJdICogeFsyXSk7CisgICAgaWYgKG1hZykgeworICAgICAgICB4WzBdIC89IG1hZzsKKyAgICAgICAgeFsxXSAvPSBtYWc7CisgICAgICAgIHhbMl0gLz0gbWFnOworICAgIH0KKworICAgIG1hZyA9IChmbG9hdClzcXJ0KHlbMF0gKiB5WzBdICsgeVsxXSAqIHlbMV0gKyB5WzJdICogeVsyXSk7CisgICAgaWYgKG1hZykgeworICAgICAgICB5WzBdIC89IG1hZzsKKyAgICAgICAgeVsxXSAvPSBtYWc7CisgICAgICAgIHlbMl0gLz0gbWFnOworICAgIH0KKworI2RlZmluZSBNKHJvdyxjb2wpICBtW2NvbCo0K3Jvd10KKyAgICBNKDAsIDApID0geFswXTsKKyAgICBNKDAsIDEpID0geFsxXTsKKyAgICBNKDAsIDIpID0geFsyXTsKKyAgICBNKDAsIDMpID0gMC4wOworICAgIE0oMSwgMCkgPSB5WzBdOworICAgIE0oMSwgMSkgPSB5WzFdOworICAgIE0oMSwgMikgPSB5WzJdOworICAgIE0oMSwgMykgPSAwLjA7CisgICAgTSgyLCAwKSA9IHpbMF07CisgICAgTSgyLCAxKSA9IHpbMV07CisgICAgTSgyLCAyKSA9IHpbMl07CisgICAgTSgyLCAzKSA9IDAuMDsKKyAgICBNKDMsIDApID0gMC4wOworICAgIE0oMywgMSkgPSAwLjA7CisgICAgTSgzLCAyKSA9IDAuMDsKKyAgICBNKDMsIDMpID0gMS4wOworI3VuZGVmIE0KKyAgICB7CisgICAgICAgIGludCBhOworICAgICAgICBHTGZpeGVkIGZpeGVkTVsxNl07CisgICAgICAgIGZvciAoYSA9IDA7IGEgPCAxNjsgKythKQorICAgICAgICAgICAgZml4ZWRNW2FdID0gKEdMZml4ZWQpKG1bYV0gKiA2NTUzNik7CisgICAgICAgIGdsTXVsdE1hdHJpeHgoZml4ZWRNKTsKKyAgICB9CisKKyAgICAvKiBUcmFuc2xhdGUgRXllIHRvIE9yaWdpbiAqLworICAgIGdsVHJhbnNsYXRleCgoR0xmaXhlZCkoLWV5ZXggKiA2NTUzNiksCisgICAgICAgICAgICAgICAgIChHTGZpeGVkKSgtZXlleSAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKC1leWV6ICogNjU1MzYpKTsKK30KKworCitzdGF0aWMgdm9pZCBjYW1UcmFjaygpCit7CisgICAgZmxvYXQgbGVycFs1XTsKKyAgICBmbG9hdCBlWCwgZVksIGVaLCBjWCwgY1ksIGNaOworICAgIGZsb2F0IHRyYWNrUG9zOworICAgIENBTVRSQUNLICpjYW07CisgICAgbG9uZyBjdXJyZW50Q2FtVGljazsKKyAgICBpbnQgYTsKKworICAgIGlmIChzTmV4dENhbVRyYWNrU3RhcnRUaWNrIDw9IHNUaWNrKQorICAgIHsKKyAgICAgICAgKytzQ3VycmVudENhbVRyYWNrOworICAgICAgICBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrID0gc05leHRDYW1UcmFja1N0YXJ0VGljazsKKyAgICB9CisgICAgc05leHRDYW1UcmFja1N0YXJ0VGljayA9IHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2sgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2FtVHJhY2tzW3NDdXJyZW50Q2FtVHJhY2tdLmxlbiAqIENBTVRSQUNLX0xFTjsKKworICAgIGNhbSA9ICZzQ2FtVHJhY2tzW3NDdXJyZW50Q2FtVHJhY2tdOworICAgIGN1cnJlbnRDYW1UaWNrID0gc1RpY2sgLSBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrOworICAgIHRyYWNrUG9zID0gKGZsb2F0KWN1cnJlbnRDYW1UaWNrIC8gKENBTVRSQUNLX0xFTiAqIGNhbS0+bGVuKTsKKworICAgIGZvciAoYSA9IDA7IGEgPCA1OyArK2EpCisgICAgICAgIGxlcnBbYV0gPSAoY2FtLT5zcmNbYV0gKyBjYW0tPmRlc3RbYV0gKiB0cmFja1BvcykgKiAwLjAxZjsKKworICAgIGlmIChjYW0tPmRpc3QpCisgICAgeworICAgICAgICBmbG9hdCBkaXN0ID0gY2FtLT5kaXN0ICogMC4xZjsKKyAgICAgICAgY1ggPSBsZXJwWzBdOworICAgICAgICBjWSA9IGxlcnBbMV07CisgICAgICAgIGNaID0gbGVycFsyXTsKKyAgICAgICAgZVggPSBjWCAtIChmbG9hdCljb3MobGVycFszXSkgKiBkaXN0OworICAgICAgICBlWSA9IGNZIC0gKGZsb2F0KXNpbihsZXJwWzNdKSAqIGRpc3Q7CisgICAgICAgIGVaID0gY1ogLSBsZXJwWzRdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlWCA9IGxlcnBbMF07CisgICAgICAgIGVZID0gbGVycFsxXTsKKyAgICAgICAgZVogPSBsZXJwWzJdOworICAgICAgICBjWCA9IGVYICsgKGZsb2F0KWNvcyhsZXJwWzNdKTsKKyAgICAgICAgY1kgPSBlWSArIChmbG9hdClzaW4obGVycFszXSk7CisgICAgICAgIGNaID0gZVogKyBsZXJwWzRdOworICAgIH0KKyAgICBnbHVMb29rQXQoZVgsIGVZLCBlWiwgY1gsIGNZLCBjWiwgMCwgMCwgMSk7Cit9CisKKworLy8gQ2FsbGVkIGZyb20gdGhlIGFwcCBmcmFtZXdvcmsuCisvKiBUaGUgdGljayBpcyBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLCB3aWR0aCBhbmQgaGVpZ2h0CisgKiBhcmUgdGhlIGltYWdlIGRpbWVuc2lvbnMgdG8gYmUgcmVuZGVyZWQuCisgKi8KK3ZvaWQgYXBwUmVuZGVyKGxvbmcgdGljaywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGlmIChzU3RhcnRUaWNrID09IDApCisgICAgICAgIHNTdGFydFRpY2sgPSB0aWNrOworICAgIGlmICghZ0FwcEFsaXZlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBBY3R1YWwgdGljayB2YWx1ZSBpcyAiYmx1cnJlZCIgYSBsaXR0bGUgYml0LgorICAgIHNUaWNrID0gKHNUaWNrICsgdGljayAtIHNTdGFydFRpY2spID4+IDE7CisKKyAgICAvLyBUZXJtaW5hdGUgYXBwbGljYXRpb24gYWZ0ZXIgcnVubmluZyB0aHJvdWdoIHRoZSBkZW1vbnN0cmF0aW9uIG9uY2UuCisgICAgaWYgKHNUaWNrID49IFJVTl9MRU5HVEgpCisgICAgeworICAgICAgICBnQXBwQWxpdmUgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUHJlcGFyZSBPcGVuR0wgRVMgZm9yIHJlbmRlcmluZyBvZiB0aGUgZnJhbWUuCisgICAgcHJlcGFyZUZyYW1lKHdpZHRoLCBoZWlnaHQpOworCisgICAgLy8gVXBkYXRlIHRoZSBjYW1lcmEgcG9zaXRpb24gYW5kIHNldCB0aGUgbG9va2F0LgorICAgIGNhbVRyYWNrKCk7CisKKyAgICAvLyBDb25maWd1cmUgZW52aXJvbm1lbnQuCisgICAgY29uZmlndXJlTGlnaHRBbmRNYXRlcmlhbCgpOworCisgICAgLy8gRHJhdyB0aGUgcmVmbGVjdGlvbiBieSBkcmF3aW5nIG1vZGVscyB3aXRoIG5lZ2F0ZWQgWi1heGlzLgorICAgIGdsUHVzaE1hdHJpeCgpOworICAgIGRyYXdNb2RlbHMoLTEpOworICAgIGdsUG9wTWF0cml4KCk7CisKKyAgICAvLyBCbGVuZCB0aGUgZ3JvdW5kIHBsYW5lIHRvIHRoZSB3aW5kb3cuCisgICAgZHJhd0dyb3VuZFBsYW5lKCk7CisKKyAgICAvLyBEcmF3IGFsbCB0aGUgbW9kZWxzIG5vcm1hbGx5LgorICAgIGRyYXdNb2RlbHMoMSk7CisKKyAgICAvLyBEcmF3IGZhZGUgcXVhZCBvdmVyIHdob2xlIHdpbmRvdyAod2hlbiBjaGFuZ2luZyBjYW1lcmFzKS4KKyAgICBkcmF3RmFkZVF1YWQoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL25ka1NhbkFuZ2VsZXMvc3JjL21haW4vam5pL2ltcG9ydGdsLmMgYi90ZXN0cy9uZGtTYW5BbmdlbGVzL3NyYy9tYWluL2puaS9pbXBvcnRnbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MDE2MzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9uZGtTYW5BbmdlbGVzL3NyYy9tYWluL2puaS9pbXBvcnRnbC5jCkBAIC0wLDAgKzEsMTY4IEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBpbXBvcnRnbC5jLHYgMS40IDIwMDUvMDIvMDggMTg6NDI6NTUgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS40ICQKKyAqLworCisjdW5kZWYgV0lOMzIKKyN1bmRlZiBMSU5VWAorI2lmZGVmIF9NU0NfVkVSCisvLyBEZXNrdG9wIG9yIG1vYmlsZSBXaW4zMiBlbnZpcm9ubWVudDoKKyNkZWZpbmUgV0lOMzIKKyNlbHNlCisvLyBMaW51eCBlbnZpcm9ubWVudDoKKyNkZWZpbmUgTElOVVgKKyNlbmRpZgorCisjaWZuZGVmIERJU0FCTEVfSU1QT1JUR0wKKworI2lmIGRlZmluZWQoV0lOMzIpCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8dGNoYXIuaD4KK3N0YXRpYyBITU9EVUxFIHNHTEVTRExMID0gTlVMTDsKKyNlbmRpZiAvLyBXSU4zMgorCisjaWZkZWYgTElOVVgKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorc3RhdGljIHZvaWQgKnNHTEVTU08gPSBOVUxMOworI2VuZGlmIC8vIExJTlVYCisKKyNlbmRpZiAvKiBESVNBQkxFX0lNUE9SVEdMICovCisKKyNkZWZpbmUgSU1QT1JUR0xfTk9fRk5QVFJfREVGUworI2RlZmluZSBJTVBPUlRHTF9BUEkKKyNkZWZpbmUgSU1QT1JUR0xfRk5QVFJJTklUID0gTlVMTAorI2luY2x1ZGUgImltcG9ydGdsLmgiCisKKworLyogSW1wb3J0cyBmdW5jdGlvbiBwb2ludGVycyB0byBzZWxlY3RlZCBmdW5jdGlvbiBjYWxscyBpbiBPcGVuR0wgRVMgQ29tbW9uCisgKiBvciBDb21tb24gTGl0ZSBwcm9maWxlIERMTCBvciBzaGFyZWQgb2JqZWN0LiBUaGUgZnVuY3Rpb24gcG9pbnRlcnMgYXJlCisgKiBzdG9yZWQgYXMgZ2xvYmFsIHN5bWJvbHMgd2l0aCBlcXVpdmFsZW50IGZ1bmN0aW9uIG5hbWUgYnV0IHByZWZpeGVkIHdpdGgKKyAqICJmdW5jUHRyXyIuIFN0YW5kYXJkIGdsL2VnbCBjYWxscyBhcmUgcmVkaXJlY3RlZCB0byB0aGUgZnVuY3Rpb24gcG9pbnRlcnMKKyAqIHdpdGggcHJlcHJvY2Vzc29yIG1hY3JvcyAoc2VlIGltcG9ydGdsLmgpLgorICovCitpbnQgaW1wb3J0R0xJbml0KCkKK3sKKyAgICBpbnQgcmVzdWx0ID0gMTsKKworI2lmbmRlZiBESVNBQkxFX0lNUE9SVEdMCisKKyN1bmRlZiBJTVBPUlRfRlVOQworCisjaWZkZWYgV0lOMzIKKyAgICBzR0xFU0RMTCA9IExvYWRMaWJyYXJ5KF9UKCJsaWJHTEVTX0NNLmRsbCIpKTsKKyAgICBpZiAoc0dMRVNETEwgPT0gTlVMTCkKKyAgICAgICAgc0dMRVNETEwgPSBMb2FkTGlicmFyeShfVCgibGliR0xFU19DTC5kbGwiKSk7CisgICAgaWYgKHNHTEVTRExMID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOyAgIC8vIENhbm5vdCBmaW5kIE9wZW5HTCBFUyBDb21tb24gb3IgQ29tbW9uIExpdGUgRExMLgorCisgICAgLyogVGhlIGZvbGxvd2luZyBmZXRjaGVzIGFkZHJlc3MgdG8gZWFjaCBlZ2wgJiBnbCBmdW5jdGlvbiBjYWxsCisgICAgICogYW5kIHN0b3JlcyBpdCB0byB0aGUgcmVsYXRlZCBmdW5jdGlvbiBwb2ludGVyLiBDYXN0aW5nIHRocm91Z2gKKyAgICAgKiB2b2lkICogcmVzdWx0cyBpbiB3YXJuaW5ncyB3aXRoIFZDIHdhcm5pbmcgbGV2ZWwgNCwgd2hpY2gKKyAgICAgKiBjb3VsZCBiZSBmaXhlZCBieSBjYXN0aW5nIHRvIHRoZSB0cnVlIHR5cGUgZm9yIGVhY2ggZmV0Y2guCisgICAgICovCisjZGVmaW5lIElNUE9SVF9GVU5DKGZ1bmNOYW1lKSBkbyB7IFwKKyAgICAgICAgdm9pZCAqcHJvY0FkZHJlc3MgPSAodm9pZCAqKUdldFByb2NBZGRyZXNzKHNHTEVTRExMLCBfVCgjZnVuY05hbWUpKTsgXAorICAgICAgICBpZiAocHJvY0FkZHJlc3MgPT0gTlVMTCkgcmVzdWx0ID0gMDsgXAorICAgICAgICAqKCh2b2lkICoqKSZGTlBUUihmdW5jTmFtZSkpID0gcHJvY0FkZHJlc3M7IH0gd2hpbGUgKDApCisjZW5kaWYgLy8gV0lOMzIKKworI2lmZGVmIExJTlVYCisjaWZkZWYgQU5EUk9JRF9OREsKKyAgICBzR0xFU1NPID0gZGxvcGVuKCJsaWJHTEVTdjFfQ00uc28iLCBSVExEX05PVyk7CisjZWxzZSAvKiAhQU5EUk9JRF9OREsgKi8KKyAgICBzR0xFU1NPID0gZGxvcGVuKCJsaWJHTEVTX0NNLnNvIiwgUlRMRF9OT1cpOworICAgIGlmIChzR0xFU1NPID09IE5VTEwpCisgICAgICAgIHNHTEVTU08gPSBkbG9wZW4oImxpYkdMRVNfQ0wuc28iLCBSVExEX05PVyk7CisjZW5kaWYgLyogIUFORFJPSURfTkRLICovCisgICAgaWYgKHNHTEVTU08gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7ICAgLy8gQ2Fubm90IGZpbmQgT3BlbkdMIEVTIENvbW1vbiBvciBDb21tb24gTGl0ZSBTTy4KKworI2RlZmluZSBJTVBPUlRfRlVOQyhmdW5jTmFtZSkgZG8geyBcCisgICAgICAgIHZvaWQgKnByb2NBZGRyZXNzID0gKHZvaWQgKilkbHN5bShzR0xFU1NPLCAjZnVuY05hbWUpOyBcCisgICAgICAgIGlmIChwcm9jQWRkcmVzcyA9PSBOVUxMKSByZXN1bHQgPSAwOyBcCisgICAgICAgICooKHZvaWQgKiopJkZOUFRSKGZ1bmNOYW1lKSkgPSBwcm9jQWRkcmVzczsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvLyBMSU5VWAorCisjaWZuZGVmIEFORFJPSURfTkRLCisgICAgSU1QT1JUX0ZVTkMoZWdsQ2hvb3NlQ29uZmlnKTsKKyAgICBJTVBPUlRfRlVOQyhlZ2xDcmVhdGVDb250ZXh0KTsKKyAgICBJTVBPUlRfRlVOQyhlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKTsKKyAgICBJTVBPUlRfRlVOQyhlZ2xEZXN0cm95Q29udGV4dCk7CisgICAgSU1QT1JUX0ZVTkMoZWdsRGVzdHJveVN1cmZhY2UpOworICAgIElNUE9SVF9GVU5DKGVnbEdldENvbmZpZ0F0dHJpYik7CisgICAgSU1QT1JUX0ZVTkMoZWdsR2V0Q29uZmlncyk7CisgICAgSU1QT1JUX0ZVTkMoZWdsR2V0RGlzcGxheSk7CisgICAgSU1QT1JUX0ZVTkMoZWdsR2V0RXJyb3IpOworICAgIElNUE9SVF9GVU5DKGVnbEluaXRpYWxpemUpOworICAgIElNUE9SVF9GVU5DKGVnbE1ha2VDdXJyZW50KTsKKyAgICBJTVBPUlRfRlVOQyhlZ2xTd2FwQnVmZmVycyk7CisgICAgSU1QT1JUX0ZVTkMoZWdsVGVybWluYXRlKTsKKyNlbmRpZiAvKiAhQU5EUk9JRF9OREsgKi8KKworICAgIElNUE9SVF9GVU5DKGdsQmxlbmRGdW5jKTsKKyAgICBJTVBPUlRfRlVOQyhnbENsZWFyKTsKKyAgICBJTVBPUlRfRlVOQyhnbENsZWFyQ29sb3J4KTsKKyAgICBJTVBPUlRfRlVOQyhnbENvbG9yNHgpOworICAgIElNUE9SVF9GVU5DKGdsQ29sb3JQb2ludGVyKTsKKyAgICBJTVBPUlRfRlVOQyhnbERpc2FibGUpOworICAgIElNUE9SVF9GVU5DKGdsRGlzYWJsZUNsaWVudFN0YXRlKTsKKyAgICBJTVBPUlRfRlVOQyhnbERyYXdBcnJheXMpOworICAgIElNUE9SVF9GVU5DKGdsRW5hYmxlKTsKKyAgICBJTVBPUlRfRlVOQyhnbEVuYWJsZUNsaWVudFN0YXRlKTsKKyAgICBJTVBPUlRfRlVOQyhnbEZydXN0dW14KTsKKyAgICBJTVBPUlRfRlVOQyhnbEdldEVycm9yKTsKKyAgICBJTVBPUlRfRlVOQyhnbExpZ2h0eHYpOworICAgIElNUE9SVF9GVU5DKGdsTG9hZElkZW50aXR5KTsKKyAgICBJTVBPUlRfRlVOQyhnbE1hdGVyaWFseCk7CisgICAgSU1QT1JUX0ZVTkMoZ2xNYXRlcmlhbHh2KTsKKyAgICBJTVBPUlRfRlVOQyhnbE1hdHJpeE1vZGUpOworICAgIElNUE9SVF9GVU5DKGdsTXVsdE1hdHJpeHgpOworICAgIElNUE9SVF9GVU5DKGdsTm9ybWFsUG9pbnRlcik7CisgICAgSU1QT1JUX0ZVTkMoZ2xQb3BNYXRyaXgpOworICAgIElNUE9SVF9GVU5DKGdsUHVzaE1hdHJpeCk7CisgICAgSU1QT1JUX0ZVTkMoZ2xSb3RhdGV4KTsKKyAgICBJTVBPUlRfRlVOQyhnbFNjYWxleCk7CisgICAgSU1QT1JUX0ZVTkMoZ2xTaGFkZU1vZGVsKTsKKyAgICBJTVBPUlRfRlVOQyhnbFRyYW5zbGF0ZXgpOworICAgIElNUE9SVF9GVU5DKGdsVmVydGV4UG9pbnRlcik7CisgICAgSU1QT1JUX0ZVTkMoZ2xWaWV3cG9ydCk7CisKKyNlbmRpZiAvKiBESVNBQkxFX0lNUE9SVEdMICovCisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3ZvaWQgaW1wb3J0R0xEZWluaXQoKQoreworI2lmbmRlZiBESVNBQkxFX0lNUE9SVEdMCisjaWZkZWYgV0lOMzIKKyAgICBGcmVlTGlicmFyeShzR0xFU0RMTCk7CisjZW5kaWYKKworI2lmZGVmIExJTlVYCisgICAgZGxjbG9zZShzR0xFU1NPKTsKKyNlbmRpZgorI2VuZGlmIC8qIERJU0FCTEVfSU1QT1JUR0wgKi8KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL25ka1NhbkFuZ2VsZXMvc3JjL21haW4vam5pL2ltcG9ydGdsLmggYi90ZXN0cy9uZGtTYW5BbmdlbGVzL3NyYy9tYWluL2puaS9pbXBvcnRnbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOWEzYTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9uZGtTYW5BbmdlbGVzL3NyYy9tYWluL2puaS9pbXBvcnRnbC5oCkBAIC0wLDAgKzEsMTcxIEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBpbXBvcnRnbC5oLHYgMS40IDIwMDUvMDIvMjQgMjA6Mjk6MzMgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS40ICQKKyAqLworCisjaWZuZGVmIElNUE9SVEdMX0hfSU5DTFVERUQKKyNkZWZpbmUgSU1QT1JUR0xfSF9JTkNMVURFRAorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2lmbmRlZiBBTkRST0lEX05ESworI2luY2x1ZGUgPEdMRVMvZWdsLmg+CisjZW5kaWYgLyogIUFORFJPSURfTkRLICovCisKKy8qIER5bmFtaWNhbGx5IGZldGNoZXMgcG9pbnRlcnMgdG8gdGhlIGVnbCAmIGdsIGZ1bmN0aW9ucy4KKyAqIFNob3VsZCBiZSBjYWxsZWQgb25jZSBvbiBhcHBsaWNhdGlvbiBpbml0aWFsaXphdGlvbi4KKyAqIFJldHVybnMgbm9uLXplcm8gb24gc3VjY2VzcyBhbmQgMCBvbiBmYWlsdXJlLgorICovCitleHRlcm4gaW50IGltcG9ydEdMSW5pdCgpOworCisvKiBGcmVlcyB0aGUgaGFuZGxlIHRvIGVnbCAmIGdsIGZ1bmN0aW9ucyBsaWJyYXJ5LgorICovCitleHRlcm4gdm9pZCBpbXBvcnRHTERlaW5pdCgpOworCisvKiBVc2UgRElTQUJMRV9JTVBPUlRHTCBpZiB5b3Ugd2FudCB0byBsaW5rIHRoZSBPcGVuR0wgRVMgYXQKKyAqIGNvbXBpbGUvbGluayB0aW1lIGFuZCBub3QgaW1wb3J0IGl0IGR5bmFtaWNhbGx5IHJ1bnRpbWUuCisgKi8KKyNpZm5kZWYgRElTQUJMRV9JTVBPUlRHTAorCisKKyNpZm5kZWYgSU1QT1JUR0xfQVBJCisjZGVmaW5lIElNUE9SVEdMX0FQSSBleHRlcm4KKyNlbmRpZgorI2lmbmRlZiBJTVBPUlRHTF9GTlBUUklOSVQKKyNkZWZpbmUgSU1QT1JUR0xfRk5QVFJJTklUCisjZW5kaWYKKworI2RlZmluZSBGTkRFRihyZXRUeXBlLCBmdW5jTmFtZSwgYXJncykgSU1QT1JUR0xfQVBJIHJldFR5cGUgKCpmdW5jUHRyXyMjZnVuY05hbWUpIGFyZ3MgSU1QT1JUR0xfRk5QVFJJTklUCisKKyNpZm5kZWYgQU5EUk9JRF9OREsKK0ZOREVGKEVHTEJvb2xlYW4sIGVnbENob29zZUNvbmZpZywgKEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0LCBFR0xDb25maWcgKmNvbmZpZ3MsIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKSk7CitGTkRFRihFR0xDb250ZXh0LCBlZ2xDcmVhdGVDb250ZXh0LCAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIEVHTENvbnRleHQgc2hhcmVfbGlzdCwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkpOworRk5ERUYoRUdMU3VyZmFjZSwgZWdsQ3JlYXRlV2luZG93U3VyZmFjZSwgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkpOworRk5ERUYoRUdMQm9vbGVhbiwgZWdsRGVzdHJveUNvbnRleHQsIChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgpKTsKK0ZOREVGKEVHTEJvb2xlYW4sIGVnbERlc3Ryb3lTdXJmYWNlLCAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSkpOworRk5ERUYoRUdMQm9vbGVhbiwgZWdsR2V0Q29uZmlnQXR0cmliLCAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpKTsKK0ZOREVGKEVHTEJvb2xlYW4sIGVnbEdldENvbmZpZ3MsIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnICpjb25maWdzLCBFR0xpbnQgY29uZmlnX3NpemUsIEVHTGludCAqbnVtX2NvbmZpZykpOworRk5ERUYoRUdMRGlzcGxheSwgZWdsR2V0RGlzcGxheSwgKE5hdGl2ZURpc3BsYXlUeXBlIGRpc3BsYXkpKTsKK0ZOREVGKEVHTGludCwgZWdsR2V0RXJyb3IsICh2b2lkKSk7CitGTkRFRihFR0xCb29sZWFuLCBlZ2xJbml0aWFsaXplLCAoRUdMRGlzcGxheSBkcHksIEVHTGludCAqbWFqb3IsIEVHTGludCAqbWlub3IpKTsKK0ZOREVGKEVHTEJvb2xlYW4sIGVnbE1ha2VDdXJyZW50LCAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2UgZHJhdywgRUdMU3VyZmFjZSByZWFkLCBFR0xDb250ZXh0IGN0eCkpOworRk5ERUYoRUdMQm9vbGVhbiwgZWdsU3dhcEJ1ZmZlcnMsIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3KSk7CitGTkRFRihFR0xCb29sZWFuLCBlZ2xUZXJtaW5hdGUsIChFR0xEaXNwbGF5IGRweSkpOworI2VuZGlmIC8qICFBTkRST0lEX05ESyAqLworCitGTkRFRih2b2lkLCBnbEJsZW5kRnVuYywgKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvcikpOworRk5ERUYodm9pZCwgZ2xDbGVhciwgKEdMYml0ZmllbGQgbWFzaykpOworRk5ERUYodm9pZCwgZ2xDbGVhckNvbG9yeCwgKEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKSk7CitGTkRFRih2b2lkLCBnbENvbG9yNHgsIChHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKSk7CitGTkRFRih2b2lkLCBnbENvbG9yUG9pbnRlciwgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSk7CitGTkRFRih2b2lkLCBnbERpc2FibGUsIChHTGVudW0gY2FwKSk7CitGTkRFRih2b2lkLCBnbERpc2FibGVDbGllbnRTdGF0ZSwgKEdMZW51bSBhcnJheSkpOworRk5ERUYodm9pZCwgZ2xEcmF3QXJyYXlzLCAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KSk7CitGTkRFRih2b2lkLCBnbEVuYWJsZSwgKEdMZW51bSBjYXApKTsKK0ZOREVGKHZvaWQsIGdsRW5hYmxlQ2xpZW50U3RhdGUsIChHTGVudW0gYXJyYXkpKTsKK0ZOREVGKHZvaWQsIGdsRnJ1c3R1bXgsIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSk7CitGTkRFRihHTGVudW0sIGdsR2V0RXJyb3IsICh2b2lkKSk7CitGTkRFRih2b2lkLCBnbExpZ2h0eHYsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSk7CitGTkRFRih2b2lkLCBnbExvYWRJZGVudGl0eSwgKHZvaWQpKTsKK0ZOREVGKHZvaWQsIGdsTWF0ZXJpYWx4LCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkpOworRk5ERUYodm9pZCwgZ2xNYXRlcmlhbHh2LCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSk7CitGTkRFRih2b2lkLCBnbE1hdHJpeE1vZGUsIChHTGVudW0gbW9kZSkpOworRk5ERUYodm9pZCwgZ2xNdWx0TWF0cml4eCwgKGNvbnN0IEdMZml4ZWQgKm0pKTsKK0ZOREVGKHZvaWQsIGdsTm9ybWFsUG9pbnRlciwgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSk7CitGTkRFRih2b2lkLCBnbFBvcE1hdHJpeCwgKHZvaWQpKTsKK0ZOREVGKHZvaWQsIGdsUHVzaE1hdHJpeCwgKHZvaWQpKTsKK0ZOREVGKHZvaWQsIGdsUm90YXRleCwgKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopKTsKK0ZOREVGKHZvaWQsIGdsU2NhbGV4LCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikpOworRk5ERUYodm9pZCwgZ2xTaGFkZU1vZGVsLCAoR0xlbnVtIG1vZGUpKTsKK0ZOREVGKHZvaWQsIGdsVHJhbnNsYXRleCwgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopKTsKK0ZOREVGKHZvaWQsIGdsVmVydGV4UG9pbnRlciwgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSk7CitGTkRFRih2b2lkLCBnbFZpZXdwb3J0LCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpKTsKKworCisjdW5kZWYgRk4KKyNkZWZpbmUgRk5QVFIobmFtZSkgZnVuY1B0cl8jI25hbWUKKworI2lmbmRlZiBJTVBPUlRHTF9OT19GTlBUUl9ERUZTCisKKy8vIFJlZGlyZWN0IGVnbCogYW5kIGdsKiBmdW5jdGlvbiBjYWxscyB0byBmdW5jUHRyX2VnbCogYW5kIGZ1bmNQdHJfZ2wqLgorCisjaWZuZGVmIEFORFJPSURfTkRLCisjZGVmaW5lIGVnbENob29zZUNvbmZpZyAgICAgICAgIEZOUFRSKGVnbENob29zZUNvbmZpZykKKyNkZWZpbmUgZWdsQ3JlYXRlQ29udGV4dCAgICAgICAgRk5QVFIoZWdsQ3JlYXRlQ29udGV4dCkKKyNkZWZpbmUgZWdsQ3JlYXRlV2luZG93U3VyZmFjZSAgRk5QVFIoZWdsQ3JlYXRlV2luZG93U3VyZmFjZSkKKyNkZWZpbmUgZWdsRGVzdHJveUNvbnRleHQgICAgICAgRk5QVFIoZWdsRGVzdHJveUNvbnRleHQpCisjZGVmaW5lIGVnbERlc3Ryb3lTdXJmYWNlICAgICAgIEZOUFRSKGVnbERlc3Ryb3lTdXJmYWNlKQorI2RlZmluZSBlZ2xHZXRDb25maWdBdHRyaWIgICAgICBGTlBUUihlZ2xHZXRDb25maWdBdHRyaWIpCisjZGVmaW5lIGVnbEdldENvbmZpZ3MgICAgICAgICAgIEZOUFRSKGVnbEdldENvbmZpZ3MpCisjZGVmaW5lIGVnbEdldERpc3BsYXkgICAgICAgICAgIEZOUFRSKGVnbEdldERpc3BsYXkpCisjZGVmaW5lIGVnbEdldEVycm9yICAgICAgICAgICAgIEZOUFRSKGVnbEdldEVycm9yKQorI2RlZmluZSBlZ2xJbml0aWFsaXplICAgICAgICAgICBGTlBUUihlZ2xJbml0aWFsaXplKQorI2RlZmluZSBlZ2xNYWtlQ3VycmVudCAgICAgICAgICBGTlBUUihlZ2xNYWtlQ3VycmVudCkKKyNkZWZpbmUgZWdsU3dhcEJ1ZmZlcnMgICAgICAgICAgRk5QVFIoZWdsU3dhcEJ1ZmZlcnMpCisjZGVmaW5lIGVnbFRlcm1pbmF0ZSAgICAgICAgICAgIEZOUFRSKGVnbFRlcm1pbmF0ZSkKKyNlbmRpZiAvKiAhQU5EUk9JRF9OREsgKi8KKworI2RlZmluZSBnbEJsZW5kRnVuYyAgICAgICAgICAgICBGTlBUUihnbEJsZW5kRnVuYykKKyNkZWZpbmUgZ2xDbGVhciAgICAgICAgICAgICAgICAgRk5QVFIoZ2xDbGVhcikKKyNkZWZpbmUgZ2xDbGVhckNvbG9yeCAgICAgICAgICAgRk5QVFIoZ2xDbGVhckNvbG9yeCkKKyNkZWZpbmUgZ2xDb2xvcjR4ICAgICAgICAgICAgICAgRk5QVFIoZ2xDb2xvcjR4KQorI2RlZmluZSBnbENvbG9yUG9pbnRlciAgICAgICAgICBGTlBUUihnbENvbG9yUG9pbnRlcikKKyNkZWZpbmUgZ2xEaXNhYmxlICAgICAgICAgICAgICAgRk5QVFIoZ2xEaXNhYmxlKQorI2RlZmluZSBnbERpc2FibGVDbGllbnRTdGF0ZSAgICBGTlBUUihnbERpc2FibGVDbGllbnRTdGF0ZSkKKyNkZWZpbmUgZ2xEcmF3QXJyYXlzICAgICAgICAgICAgRk5QVFIoZ2xEcmF3QXJyYXlzKQorI2RlZmluZSBnbEVuYWJsZSAgICAgICAgICAgICAgICBGTlBUUihnbEVuYWJsZSkKKyNkZWZpbmUgZ2xFbmFibGVDbGllbnRTdGF0ZSAgICAgRk5QVFIoZ2xFbmFibGVDbGllbnRTdGF0ZSkKKyNkZWZpbmUgZ2xGcnVzdHVteCAgICAgICAgICAgICAgRk5QVFIoZ2xGcnVzdHVteCkKKyNkZWZpbmUgZ2xHZXRFcnJvciAgICAgICAgICAgICAgRk5QVFIoZ2xHZXRFcnJvcikKKyNkZWZpbmUgZ2xMaWdodHh2ICAgICAgICAgICAgICAgRk5QVFIoZ2xMaWdodHh2KQorI2RlZmluZSBnbExvYWRJZGVudGl0eSAgICAgICAgICBGTlBUUihnbExvYWRJZGVudGl0eSkKKyNkZWZpbmUgZ2xNYXRlcmlhbHggICAgICAgICAgICAgRk5QVFIoZ2xNYXRlcmlhbHgpCisjZGVmaW5lIGdsTWF0ZXJpYWx4diAgICAgICAgICAgIEZOUFRSKGdsTWF0ZXJpYWx4dikKKyNkZWZpbmUgZ2xNYXRyaXhNb2RlICAgICAgICAgICAgRk5QVFIoZ2xNYXRyaXhNb2RlKQorI2RlZmluZSBnbE11bHRNYXRyaXh4ICAgICAgICAgICBGTlBUUihnbE11bHRNYXRyaXh4KQorI2RlZmluZSBnbE5vcm1hbFBvaW50ZXIgICAgICAgICBGTlBUUihnbE5vcm1hbFBvaW50ZXIpCisjZGVmaW5lIGdsUG9wTWF0cml4ICAgICAgICAgICAgIEZOUFRSKGdsUG9wTWF0cml4KQorI2RlZmluZSBnbFB1c2hNYXRyaXggICAgICAgICAgICBGTlBUUihnbFB1c2hNYXRyaXgpCisjZGVmaW5lIGdsUm90YXRleCAgICAgICAgICAgICAgIEZOUFRSKGdsUm90YXRleCkKKyNkZWZpbmUgZ2xTY2FsZXggICAgICAgICAgICAgICAgRk5QVFIoZ2xTY2FsZXgpCisjZGVmaW5lIGdsU2hhZGVNb2RlbCAgICAgICAgICAgIEZOUFRSKGdsU2hhZGVNb2RlbCkKKyNkZWZpbmUgZ2xUcmFuc2xhdGV4ICAgICAgICAgICAgRk5QVFIoZ2xUcmFuc2xhdGV4KQorI2RlZmluZSBnbFZlcnRleFBvaW50ZXIgICAgICAgICBGTlBUUihnbFZlcnRleFBvaW50ZXIpCisjZGVmaW5lIGdsVmlld3BvcnQgICAgICAgICAgICAgIEZOUFRSKGdsVmlld3BvcnQpCisKKyNlbmRpZiAvLyAhSU1QT1JUR0xfTk9fRk5QVFJfREVGUworCisKKyNlbmRpZiAvLyAhRElTQUJMRV9JTVBPUlRHTAorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8vICFJTVBPUlRHTF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS90ZXN0cy9uZGtTYW5BbmdlbGVzL3NyYy9tYWluL2puaS9zaGFwZXMuaCBiL3Rlc3RzL25ka1NhbkFuZ2VsZXMvc3JjL21haW4vam5pL3NoYXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZmZhZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9uZGtTYW5BbmdlbGVzL3NyYy9tYWluL2puaS9zaGFwZXMuaApAQCAtMCwwICsxLDU5IEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBzaGFwZXMuaCx2IDEuNiAyMDA1LzAxLzMxIDIyOjE1OjMwIHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNiAkCisgKi8KKworI2lmbmRlZiBTSEFQRVNfSF9JTkNMVURFRAorI2RlZmluZSBTSEFQRVNfSF9JTkNMVURFRAorCisKKyNkZWZpbmUgU1VQRVJTSEFQRV9QQVJBTVMgMTUKKworc3RhdGljIGNvbnN0IGZsb2F0IHNTdXBlclNoYXBlUGFyYW1zW11bU1VQRVJTSEFQRV9QQVJBTVNdID0KK3sKKyAgICAvLyBtICBhICAgICBiICAgICBuMSAgICAgIG4yICAgICBuMyAgICAgbSAgICAgYSAgICAgYiAgICAgbjEgICAgIG4yICAgICAgbjMgICByZXMxIHJlczIgc2NhbGUgIChvcmcucmVzMSxyZXMyKQorICAgIHsgMTAsIDEsICAgIDIsICAgIDkwLCAgICAgIDEsICAgLTQ1LCAgICA4LCAgICAxLCAgICAxLCAgICAtMSwgICAgIDEsICAtMC40ZiwgICAyMCwgIDMwLCAyIH0sIC8vIDQwLCA2MAorICAgIHsgMTAsIDEsICAgIDIsICAgIDkwLCAgICAgIDEsICAgLTQ1LCAgICA0LCAgICAxLCAgICAxLCAgICAxMCwgICAgIDEsICAtMC40ZiwgICAyMCwgIDIwLCA0IH0sIC8vIDQwLCA0MAorICAgIHsgMTAsIDEsICAgIDIsICAgIDYwLCAgICAgIDEsICAgLTEwLCAgICA0LCAgICAxLCAgICAxLCAgICAtMSwgICAgLTIsICAtMC40ZiwgICA0MSwgIDQxLCAxIH0sIC8vIDgyLCA4MgorICAgIHsgIDYsIDEsICAgIDEsICAgIDYwLCAgICAgIDEsICAgLTcwLCAgICA4LCAgICAxLCAgICAxLCAgMC40ZiwgICAgIDMsICAwLjI1ZiwgICAyMCwgIDIwLCAxIH0sIC8vIDQwLCA0MAorICAgIHsgIDQsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIDIwLCAgIDEyLCAgICAxLCAgICAxLCAgMC40ZiwgICAgIDMsICAwLjI1ZiwgICAxMCwgIDMwLCAxIH0sIC8vIDIwLCA2MAorICAgIHsgIDgsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIC00LCAgICA4LCAgICAyLCAgICAxLCAgICAtMSwgICAgIDUsICAgMC41ZiwgICAyNSwgIDI2LCAxIH0sIC8vIDYwLCA2MAorICAgIHsgMTMsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIC00LCAgIDEzLCAgICAxLCAgICAxLCAgICAgMSwgICAgIDUsICAgICAgMSwgICAzMCwgIDMwLCA2IH0sIC8vIDYwLCA2MAorICAgIHsgMTAsIDEsIDEuMWYsIC0wLjVmLCAgIDAuMWYsICAgIDcwLCAgIDYwLCAgICAxLCAgICAxLCAgIC05MCwgICAgIDAsIC0wLjI1ZiwgICAyMCwgIDYwLCA4IH0sIC8vIDYwLCAxODAKKyAgICB7ICA3LCAxLCAgICAxLCAgICAyMCwgIC0wLjNmLCAtMy41ZiwgICAgNiwgICAgMSwgICAgMSwgICAgLTEsICA0LjVmLCAgIDAuNWYsICAgMTAsICAyMCwgNCB9LCAvLyA2MCwgODAKKyAgICB7ICA0LCAxLCAgICAxLCAgICAxMCwgICAgIDEwLCAgICAxMCwgICAgNCwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMTAsICAyMCwgMSB9LCAvLyAyMCwgNDAKKyAgICB7ICA0LCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgNCwgICAgMSwgICAgMSwgICAgIDEsICAgICAxLCAgICAgIDEsICAgMTAsICAxMCwgMiB9LCAvLyAxMCwgMTAKKyAgICB7ICAxLCAxLCAgICAxLCAgICAzOCwgLTAuMjVmLCAgICAxOSwgICAgNCwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMTAsICAxNSwgMiB9LCAvLyAyMCwgNDAKKyAgICB7ICAyLCAxLCAgICAxLCAgMC43ZiwgICAwLjNmLCAgMC4yZiwgICAgMywgICAgMSwgICAgMSwgICAxMDAsICAgMTAwLCAgICAxMDAsICAgMTAsICAyNSwgMiB9LCAvLyAyMCwgNTAKKyAgICB7ICA2LCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgMywgICAgMSwgICAgMSwgICAgIDEsICAgICAxLCAgICAgIDEsICAgMzAsICAzMCwgMiB9LCAvLyA2MCwgNjAKKyAgICB7ICAzLCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgNiwgICAgMSwgICAgMSwgICAgIDIsICAgICAxLCAgICAgIDEsICAgMTAsICAyMCwgMiB9LCAvLyAyMCwgNDAKKyAgICB7ICA2LCAxLCAgICAxLCAgICAgNiwgICA1LjVmLCAgIDEwMCwgICAgNiwgICAgMSwgICAgMSwgICAgMjUsICAgIDEwLCAgICAgMTAsICAgMzAsICAyMCwgMiB9LCAvLyA2MCwgNDAKKyAgICB7ICAzLCAxLCAgICAxLCAgMC41ZiwgICAxLjdmLCAgMS43ZiwgICAgMiwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMjAsICAyMCwgMiB9LCAvLyA0MCwgNDAKKyAgICB7ICA1LCAxLCAgICAxLCAgMC4xZiwgICAxLjdmLCAgMS43ZiwgICAgMSwgICAgMSwgICAgMSwgIDAuM2YsICAwLjVmLCAgIDAuNWYsICAgMjAsICAyMCwgNCB9LCAvLyA0MCwgNDAKKyAgICB7ICAyLCAxLCAgICAxLCAgICAgNiwgICA1LjVmLCAgIDEwMCwgICAgNiwgICAgMSwgICAgMSwgICAgIDQsICAgIDEwLCAgICAgMTAsICAgMTAsICAyMiwgMSB9LCAvLyA0MCwgNDAKKyAgICB7ICA2LCAxLCAgICAxLCAgICAtMSwgICAgIDcwLCAgMC4xZiwgICAgOSwgICAgMSwgMC41ZiwgICAtOTgsIDAuMDVmLCAgICAtNDUsICAgMjAsICAzMCwgNCB9LCAvLyA2MCwgOTEKKyAgICB7ICA2LCAxLCAgICAxLCAgICAtMSwgICAgIDkwLCAtMC4xZiwgICAgNywgICAgMSwgICAgMSwgICAgOTAsICAxLjNmLCAgICAgMzQsICAgMTMsICAxNiwgMSB9LCAvLyAzMiwgNjAKK307CisjZGVmaW5lIFNVUEVSU0hBUEVfQ09VTlQgKHNpemVvZihzU3VwZXJTaGFwZVBhcmFtcykgLyBzaXplb2Yoc1N1cGVyU2hhcGVQYXJhbXNbMF0pKQorCisKKyNlbmRpZiAvLyAhU0hBUEVTX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL3Rlc3RzL25ka1NhbkFuZ2VsZXMvc3JjL21haW4vcmVzL2xheW91dC9tYWluLnhtbCBiL3Rlc3RzL25ka1NhbkFuZ2VsZXMvc3JjL21haW4vcmVzL2xheW91dC9tYWluLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTc2NjYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmRrU2FuQW5nZWxlcy9zcmMvbWFpbi9yZXMvbGF5b3V0L21haW4ueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICA+Cis8VGV4dFZpZXcgIAorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgCisgICAgYW5kcm9pZDp0ZXh0PSJIZWxsbyBXb3JsZCwgRGVtb0FjdGl2aXR5IgorICAgIC8+Cis8L0xpbmVhckxheW91dD4KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvbmRrU2FuQW5nZWxlcy9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvdGVzdHMvbmRrU2FuQW5nZWxlcy9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NGMzMzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9uZGtTYW5BbmdlbGVzL3NyYy9tYWluL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5TYW5BbmdlbGVzPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL292ZXJsYXkxL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL292ZXJsYXkxL2J1aWxkLmdyYWRsZQppbmRleCBjODhjNGMwLi41ZDEyNmUxIDEwMDY0NAotLS0gYS90ZXN0cy9vdmVybGF5MS9idWlsZC5ncmFkbGUKKysrIGIvdGVzdHMvb3ZlcmxheTEvYnVpbGQuZ3JhZGxlCkBAIC0zLDcgKzMsNyBAQAogICAgICAgICBtYXZlbiB7IHVybCAnLi4vLi4vLi4vLi4vb3V0L2hvc3QvZ3JhZGxlL3JlcG8nIH0KICAgICB9CiAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC41LjAtU05BUFNIT1QnCisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvb3ZlcmxheTIvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvb3ZlcmxheTIvYnVpbGQuZ3JhZGxlCmluZGV4IGIzZDdmY2QuLjg0NTYxMGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL292ZXJsYXkyL2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy9vdmVybGF5Mi9idWlsZC5ncmFkbGUKQEAgLTMsNyArMyw3IEBACiAgICAgICAgIG1hdmVuIHsgdXJsICcuLi8uLi8uLi8uLi9vdXQvaG9zdC9ncmFkbGUvcmVwbycgfQogICAgIH0KICAgICBkZXBlbmRlbmNpZXMgewotICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjUuMC1TTkFQU0hPVCcKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC43LjAtU05BUFNIT1QnCiAgICAgfQogfQogCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5Mi9zcmMvZGVidWcvcmVzL2RyYXdhYmxlL3ZhcmlhbnRfdHlwZV9mbGF2b3Jfb3ZlcmxheS5wbmcgYi90ZXN0cy9vdmVybGF5Mi9zcmMvZGVidWcvcmVzL2RyYXdhYmxlL3ZhcmlhbnRfdHlwZV9mbGF2b3Jfb3ZlcmxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4OTM4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL292ZXJsYXkyL3NyYy9kZWJ1Zy9yZXMvZHJhd2FibGUvdmFyaWFudF90eXBlX2ZsYXZvcl9vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5Mi9zcmMvaW5zdHJ1bWVudFRlc3QvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9vdmVybGF5Mi9NYWluVGVzdC5qYXZhIGIvdGVzdHMvb3ZlcmxheTIvc3JjL2luc3RydW1lbnRUZXN0L2phdmEvY29tL2FuZHJvaWQvdGVzdHMvb3ZlcmxheTIvTWFpblRlc3QuamF2YQppbmRleCAyNjNjYjc2Li4zNjQ2NDBkIDEwMDY0NAotLS0gYS90ZXN0cy9vdmVybGF5Mi9zcmMvaW5zdHJ1bWVudFRlc3QvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9vdmVybGF5Mi9NYWluVGVzdC5qYXZhCisrKyBiL3Rlc3RzL292ZXJsYXkyL3NyYy9pbnN0cnVtZW50VGVzdC9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL292ZXJsYXkyL01haW5UZXN0LmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKICAgICBwcml2YXRlIEltYWdlVmlldyBtVHlwZU92ZXJsYXlJVjsKICAgICBwcml2YXRlIEltYWdlVmlldyBtRmxhdm9yT3ZlcmxheUlWOwogICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1UeXBlRmxhdm9yT3ZlcmxheUlWOworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1WYXJpYW50VHlwZUZsYXZvck92ZXJsYXlJVjsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYW4ge0BsaW5rIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSB0aGF0IHRlc3RzIHRoZSB7QGxpbmsgTWFpbn0gYWN0aXZpdHkuCkBAIC0zMyw2ICszNCw3IEBACiAgICAgICAgIG1UeXBlT3ZlcmxheUlWID0gKEltYWdlVmlldykgYS5maW5kVmlld0J5SWQoUi5pZC50eXBlX292ZXJsYXkpOwogICAgICAgICBtRmxhdm9yT3ZlcmxheUlWID0gKEltYWdlVmlldykgYS5maW5kVmlld0J5SWQoUi5pZC5mbGF2b3Jfb3ZlcmxheSk7CiAgICAgICAgIG1UeXBlRmxhdm9yT3ZlcmxheUlWID0gKEltYWdlVmlldykgYS5maW5kVmlld0J5SWQoUi5pZC50eXBlX2ZsYXZvcl9vdmVybGF5KTsKKyAgICAgICAgbVZhcmlhbnRUeXBlRmxhdm9yT3ZlcmxheUlWID0gKEltYWdlVmlldykgYS5maW5kVmlld0J5SWQoUi5pZC52YXJpYW50X3R5cGVfZmxhdm9yX292ZXJsYXkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDcsNiArNDksNyBAQAogICAgICAgICBhc3NlcnROb3ROdWxsKG1UeXBlT3ZlcmxheUlWKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChtRmxhdm9yT3ZlcmxheUlWKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChtVHlwZUZsYXZvck92ZXJsYXlJVik7CisgICAgICAgIGFzc2VydE5vdE51bGwobVZhcmlhbnRUeXBlRmxhdm9yT3ZlcmxheUlWKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9PdmVybGF5KCkgewpAQCAtNjQsNiArNjcsMTAgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZUZsYXZvck92ZXJsYXkoKSB7CiAgICAgICAgIHBpeGVsTG9va2VyKG1UeXBlRmxhdm9yT3ZlcmxheUlWLCBHUkVFTik7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZhcmlhbnRUeXBlRmxhdm9yT3ZlcmxheSgpIHsKKyAgICAgICAgcGl4ZWxMb29rZXIobVZhcmlhbnRUeXBlRmxhdm9yT3ZlcmxheUlWLCBHUkVFTik7CisgICAgfQogICAgIAogICAgIHByaXZhdGUgdm9pZCBwaXhlbExvb2tlcihJbWFnZVZpZXcgaXYsIGludCBleHBlY3RlZENvbG9yKSB7CiAgICAgICAgIEJpdG1hcERyYXdhYmxlIGQgPSAoQml0bWFwRHJhd2FibGUpIGl2LmdldERyYXdhYmxlKCk7CmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5Mi9zcmMvbWFpbi9yZXMvZHJhd2FibGUvdmFyaWFudF90eXBlX2ZsYXZvcl9vdmVybGF5LnBuZyBiL3Rlc3RzL292ZXJsYXkyL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS92YXJpYW50X3R5cGVfZmxhdm9yX292ZXJsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWU1NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vdmVybGF5Mi9zcmMvbWFpbi9yZXMvZHJhd2FibGUvdmFyaWFudF90eXBlX2ZsYXZvcl9vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5Mi9zcmMvbWFpbi9yZXMvbGF5b3V0L21haW4ueG1sIGIvdGVzdHMvb3ZlcmxheTIvc3JjL21haW4vcmVzL2xheW91dC9tYWluLnhtbAppbmRleCA0MzNmMzkwLi40MDhjMWY0IDEwMDY0NAotLS0gYS90ZXN0cy9vdmVybGF5Mi9zcmMvbWFpbi9yZXMvbGF5b3V0L21haW4ueG1sCisrKyBiL3Rlc3RzL292ZXJsYXkyL3NyYy9tYWluL3Jlcy9sYXlvdXQvbWFpbi54bWwKQEAgLTI0LDUgKzI0LDEwIEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3R5cGVfZmxhdm9yX292ZXJsYXkiCiAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdHlwZV9mbGF2b3Jfb3ZlcmxheSIgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvdmFyaWFudF90eXBlX2ZsYXZvcl9vdmVybGF5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ZhcmlhbnRfdHlwZV9mbGF2b3Jfb3ZlcmxheSIgLz4KIDwvTGluZWFyTGF5b3V0PgogCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5Mi9zcmMvb25lL3Jlcy9kcmF3YWJsZS90eXBlX2ZsYXZvcl9vdmVybGF5LnBuZyBiL3Rlc3RzL292ZXJsYXkyL3NyYy9vbmUvcmVzL2RyYXdhYmxlL3R5cGVfZmxhdm9yX292ZXJsYXkucG5nCmluZGV4IGI1NWU1NDQuLjBlODkzODEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL292ZXJsYXkyL3NyYy9vbmUvcmVzL2RyYXdhYmxlL3R5cGVfZmxhdm9yX292ZXJsYXkucG5nCisrKyBiL3Rlc3RzL292ZXJsYXkyL3NyYy9vbmUvcmVzL2RyYXdhYmxlL3R5cGVfZmxhdm9yX292ZXJsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL292ZXJsYXkyL3NyYy9vbmUvcmVzL2RyYXdhYmxlL3ZhcmlhbnRfdHlwZV9mbGF2b3Jfb3ZlcmxheS5wbmcgYi90ZXN0cy9vdmVybGF5Mi9zcmMvb25lL3Jlcy9kcmF3YWJsZS92YXJpYW50X3R5cGVfZmxhdm9yX292ZXJsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODkzODEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vdmVybGF5Mi9zcmMvb25lL3Jlcy9kcmF3YWJsZS92YXJpYW50X3R5cGVfZmxhdm9yX292ZXJsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL292ZXJsYXkyL3NyYy9vbmVEZWJ1Zy9yZXMvZHJhd2FibGUvdmFyaWFudF90eXBlX2ZsYXZvcl9vdmVybGF5LnBuZyBiL3Rlc3RzL292ZXJsYXkyL3NyYy9vbmVEZWJ1Zy9yZXMvZHJhd2FibGUvdmFyaWFudF90eXBlX2ZsYXZvcl9vdmVybGF5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2UxYWRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3ZlcmxheTIvc3JjL29uZURlYnVnL3Jlcy9kcmF3YWJsZS92YXJpYW50X3R5cGVfZmxhdm9yX292ZXJsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL292ZXJsYXkzL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL292ZXJsYXkzL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQzZjVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3ZlcmxheTMvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsNDUgQEAKK2J1aWxkc2NyaXB0IHsKKyAgICByZXBvc2l0b3JpZXMgeworICAgICAgICBtYXZlbiB7IHVybCAnLi4vLi4vLi4vLi4vb3V0L2hvc3QvZ3JhZGxlL3JlcG8nIH0KKyAgICB9CisgICAgZGVwZW5kZW5jaWVzIHsKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC43LjAtU05BUFNIT1QnCisgICAgfQorfQorCithcHBseSBwbHVnaW46ICdhbmRyb2lkJworCithbmRyb2lkIHsKKyAgICBjb21waWxlU2RrVmVyc2lvbiAxNQorICAgIGJ1aWxkVG9vbHNWZXJzaW9uICIxOC4wLjEiCisKKyAgICBmbGF2b3JHcm91cHMgICJwcmljaW5nIiwgInJlbGVhc2VUeXBlIgorCisgICAgc291cmNlU2V0cyB7CisgICAgICAgYmV0YS5zZXRSb290KCdtb3ZlZFNyYy9iZXRhJykKKyAgICAgICBmcmVlLnNldFJvb3QoJ21vdmVkU3JjL2ZyZWUnKQorICAgICAgIGRlYnVnLnNldFJvb3QoJ21vdmVkU3JjL2RlYnVnJykKKyAgICAgICBmcmVlQmV0YS5zZXRSb290KCdtb3ZlZFNyYy9mcmVlQmV0YScpCisgICAgICAgZnJlZUJldGFEZWJ1Zy5zZXRSb290KCdtb3ZlZFNyYy9mcmVlQmV0YURlYnVnJykKKyAgICAgICBmcmVlTm9ybWFsLnNldFJvb3QoJ21vdmVkU3JjL2ZyZWVOb3JtYWwnKQorICAgIH0KKworICAgIHByb2R1Y3RGbGF2b3JzIHsKKworICAgICAgICBiZXRhIHsKKyAgICAgICAgICAgIGZsYXZvckdyb3VwICJyZWxlYXNlVHlwZSIKKyAgICAgICAgfQorCisgICAgICAgIG5vcm1hbCB7CisgICAgICAgICAgICBmbGF2b3JHcm91cCAicmVsZWFzZVR5cGUiCisgICAgICAgIH0KKworICAgICAgICBmcmVlIHsKKyAgICAgICAgICAgIGZsYXZvckdyb3VwICJwcmljaW5nIgorICAgICAgICB9CisKKyAgICAgICAgcGFpZCB7CisgICAgICAgICAgICBmbGF2b3JHcm91cCAicHJpY2luZyIKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9iZXRhL3Jlcy9kcmF3YWJsZS9iZXRhX292ZXJsYXkucG5nIGIvdGVzdHMvb3ZlcmxheTMvbW92ZWRTcmMvYmV0YS9yZXMvZHJhd2FibGUvYmV0YV9vdmVybGF5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2UxYWRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3ZlcmxheTMvbW92ZWRTcmMvYmV0YS9yZXMvZHJhd2FibGUvYmV0YV9vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9iZXRhL3Jlcy9kcmF3YWJsZS9kZWJ1Z19vdmVybGF5LnBuZyBiL3Rlc3RzL292ZXJsYXkzL21vdmVkU3JjL2JldGEvcmVzL2RyYXdhYmxlL2RlYnVnX292ZXJsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWU1NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9iZXRhL3Jlcy9kcmF3YWJsZS9kZWJ1Z19vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9iZXRhL3Jlcy9kcmF3YWJsZS9mcmVlX2JldGFfZGVidWdfb3ZlcmxheS5wbmcgYi90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9iZXRhL3Jlcy9kcmF3YWJsZS9mcmVlX2JldGFfZGVidWdfb3ZlcmxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1ZTU0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL292ZXJsYXkzL21vdmVkU3JjL2JldGEvcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9kZWJ1Z19vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9iZXRhL3Jlcy9kcmF3YWJsZS9mcmVlX2JldGFfb3ZlcmxheS5wbmcgYi90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9iZXRhL3Jlcy9kcmF3YWJsZS9mcmVlX2JldGFfb3ZlcmxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1ZTU0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL292ZXJsYXkzL21vdmVkU3JjL2JldGEvcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9iZXRhL3Jlcy9kcmF3YWJsZS9mcmVlX292ZXJsYXkucG5nIGIvdGVzdHMvb3ZlcmxheTMvbW92ZWRTcmMvYmV0YS9yZXMvZHJhd2FibGUvZnJlZV9vdmVybGF5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTVlNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3ZlcmxheTMvbW92ZWRTcmMvYmV0YS9yZXMvZHJhd2FibGUvZnJlZV9vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9kZWJ1Zy9yZXMvZHJhd2FibGUvZGVidWdfb3ZlcmxheS5wbmcgYi90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9kZWJ1Zy9yZXMvZHJhd2FibGUvZGVidWdfb3ZlcmxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlMWFkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL292ZXJsYXkzL21vdmVkU3JjL2RlYnVnL3Jlcy9kcmF3YWJsZS9kZWJ1Z19vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9kZWJ1Zy9yZXMvZHJhd2FibGUvZnJlZV9iZXRhX2RlYnVnX292ZXJsYXkucG5nIGIvdGVzdHMvb3ZlcmxheTMvbW92ZWRTcmMvZGVidWcvcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9kZWJ1Z19vdmVybGF5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTVlNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3ZlcmxheTMvbW92ZWRTcmMvZGVidWcvcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9kZWJ1Z19vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlL3Jlcy9kcmF3YWJsZS9kZWJ1Z19vdmVybGF5LnBuZyBiL3Rlc3RzL292ZXJsYXkzL21vdmVkU3JjL2ZyZWUvcmVzL2RyYXdhYmxlL2RlYnVnX292ZXJsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWU1NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlL3Jlcy9kcmF3YWJsZS9kZWJ1Z19vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlL3Jlcy9kcmF3YWJsZS9mcmVlX2JldGFfZGVidWdfb3ZlcmxheS5wbmcgYi90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlL3Jlcy9kcmF3YWJsZS9mcmVlX2JldGFfZGVidWdfb3ZlcmxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1ZTU0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL292ZXJsYXkzL21vdmVkU3JjL2ZyZWUvcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9kZWJ1Z19vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlL3Jlcy9kcmF3YWJsZS9mcmVlX2JldGFfb3ZlcmxheS5wbmcgYi90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlL3Jlcy9kcmF3YWJsZS9mcmVlX2JldGFfb3ZlcmxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1ZTU0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL292ZXJsYXkzL21vdmVkU3JjL2ZyZWUvcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlL3Jlcy9kcmF3YWJsZS9mcmVlX292ZXJsYXkucG5nIGIvdGVzdHMvb3ZlcmxheTMvbW92ZWRTcmMvZnJlZS9yZXMvZHJhd2FibGUvZnJlZV9vdmVybGF5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2UxYWRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3ZlcmxheTMvbW92ZWRTcmMvZnJlZS9yZXMvZHJhd2FibGUvZnJlZV9vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlQmV0YS9yZXMvZHJhd2FibGUvZGVidWdfb3ZlcmxheS5wbmcgYi90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlQmV0YS9yZXMvZHJhd2FibGUvZGVidWdfb3ZlcmxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1ZTU0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL292ZXJsYXkzL21vdmVkU3JjL2ZyZWVCZXRhL3Jlcy9kcmF3YWJsZS9kZWJ1Z19vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlQmV0YS9yZXMvZHJhd2FibGUvZnJlZV9iZXRhX2RlYnVnX292ZXJsYXkucG5nIGIvdGVzdHMvb3ZlcmxheTMvbW92ZWRTcmMvZnJlZUJldGEvcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9kZWJ1Z19vdmVybGF5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTVlNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3ZlcmxheTMvbW92ZWRTcmMvZnJlZUJldGEvcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9kZWJ1Z19vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlQmV0YS9yZXMvZHJhd2FibGUvZnJlZV9iZXRhX292ZXJsYXkucG5nIGIvdGVzdHMvb3ZlcmxheTMvbW92ZWRTcmMvZnJlZUJldGEvcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9vdmVybGF5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2UxYWRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3ZlcmxheTMvbW92ZWRTcmMvZnJlZUJldGEvcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlQmV0YURlYnVnL3Jlcy9kcmF3YWJsZS9mcmVlX2JldGFfZGVidWdfb3ZlcmxheS5wbmcgYi90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlQmV0YURlYnVnL3Jlcy9kcmF3YWJsZS9mcmVlX2JldGFfZGVidWdfb3ZlcmxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlMWFkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL292ZXJsYXkzL21vdmVkU3JjL2ZyZWVCZXRhRGVidWcvcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9kZWJ1Z19vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlTm9ybWFsL3Jlcy9kcmF3YWJsZS9kZWJ1Z19vdmVybGF5LnBuZyBiL3Rlc3RzL292ZXJsYXkzL21vdmVkU3JjL2ZyZWVOb3JtYWwvcmVzL2RyYXdhYmxlL2RlYnVnX292ZXJsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWU1NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlTm9ybWFsL3Jlcy9kcmF3YWJsZS9kZWJ1Z19vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlTm9ybWFsL3Jlcy9kcmF3YWJsZS9mcmVlX25vcm1hbF9vdmVybGF5LnBuZyBiL3Rlc3RzL292ZXJsYXkzL21vdmVkU3JjL2ZyZWVOb3JtYWwvcmVzL2RyYXdhYmxlL2ZyZWVfbm9ybWFsX292ZXJsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZTFhZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vdmVybGF5My9tb3ZlZFNyYy9mcmVlTm9ybWFsL3Jlcy9kcmF3YWJsZS9mcmVlX25vcm1hbF9vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9zcmMvaW5zdHJ1bWVudFRlc3QvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9vdmVybGF5Mi9NYWluVGVzdC5qYXZhIGIvdGVzdHMvb3ZlcmxheTMvc3JjL2luc3RydW1lbnRUZXN0L2phdmEvY29tL2FuZHJvaWQvdGVzdHMvb3ZlcmxheTIvTWFpblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGQ2ZGExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3ZlcmxheTMvc3JjL2luc3RydW1lbnRUZXN0L2phdmEvY29tL2FuZHJvaWQvdGVzdHMvb3ZlcmxheTIvTWFpblRlc3QuamF2YQpAQCAtMCwwICsxLDk4IEBACitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3RzLm92ZXJsYXkyOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworCisKK3B1YmxpYyBjbGFzcyBNYWluVGVzdCBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPE1haW4+IHsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUkVEID0gMHhGRkZGMDAwMDsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgR1JFRU4gPSAweEZGMDBGRjAwOworCisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbU5vT3ZlcmxheUlWOworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1EZWJ1Z092ZXJsYXlJVjsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtQmV0YU92ZXJsYXlJVjsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtRnJlZU5vcm1hbE92ZXJsYXlJVjsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtRnJlZUJldGFEZWJ1Z092ZXJsYXlJVjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4ge0BsaW5rIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSB0aGF0IHRlc3RzIHRoZSB7QGxpbmsgTWFpbn0gYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIE1haW5UZXN0KCkgeworICAgICAgICBzdXBlcihNYWluLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBmaW5hbCBNYWluIGEgPSBnZXRBY3Rpdml0eSgpOworICAgICAgICAvLyBlbnN1cmUgYSB2YWxpZCBoYW5kbGUgdG8gdGhlIGFjdGl2aXR5IGhhcyBiZWVuIHJldHVybmVkCisgICAgICAgIGFzc2VydE5vdE51bGwoYSk7CisgICAgICAgIG1Ob092ZXJsYXlJViA9IChJbWFnZVZpZXcpIGEuZmluZFZpZXdCeUlkKFIuaWQubm9fb3ZlcmxheSk7CisgICAgICAgIG1EZWJ1Z092ZXJsYXlJViA9IChJbWFnZVZpZXcpIGEuZmluZFZpZXdCeUlkKFIuaWQuZGVidWdfb3ZlcmxheSk7CisgICAgICAgIG1CZXRhT3ZlcmxheUlWID0gKEltYWdlVmlldykgYS5maW5kVmlld0J5SWQoUi5pZC5iZXRhX292ZXJsYXkpOworICAgICAgICBtRnJlZU5vcm1hbE92ZXJsYXlJViA9IChJbWFnZVZpZXcpIGEuZmluZFZpZXdCeUlkKFIuaWQuZnJlZV9ub3JtYWxfb3ZlcmxheSk7CisgICAgICAgIG1GcmVlQmV0YURlYnVnT3ZlcmxheUlWID0gKEltYWdlVmlldykgYS5maW5kVmlld0J5SWQoUi5pZC5mcmVlX2JldGFfZGVidWdfb3ZlcmxheSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgJ3Rlc3QgcHJlY29uZGl0aW9ucycgaXMgYSBjb252ZW50aW9uIHRvIHNpZ25hbCB0aGF0IGlmIHRoaXMKKyAgICAgKiB0ZXN0IGRvZXNuJ3QgcGFzcywgdGhlIHRlc3QgY2FzZSB3YXMgbm90IHNldCB1cCBwcm9wZXJseSBhbmQgaXQgbWlnaHQKKyAgICAgKiBleHBsYWluIGFueSBhbmQgYWxsIGZhaWx1cmVzIGluIG90aGVyIHRlc3RzLiAgVGhpcyBpcyBub3QgZ3VhcmFudGVlZAorICAgICAqIHRvIHJ1biBiZWZvcmUgb3RoZXIgdGVzdHMsIGFzIGp1bml0IHVzZXMgcmVmbGVjdGlvbiB0byBmaW5kIHRoZSB0ZXN0cy4KKyAgICAgKi8KKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVjb25kaXRpb25zKCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG1Ob092ZXJsYXlJVik7CisgICAgICAgIGFzc2VydE5vdE51bGwobURlYnVnT3ZlcmxheUlWKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRnJlZUJldGFEZWJ1Z092ZXJsYXlJVik7CisgICAgICAgIGFzc2VydE5vdE51bGwobUZyZWVOb3JtYWxPdmVybGF5SVYpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1GcmVlQmV0YURlYnVnT3ZlcmxheUlWKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9PdmVybGF5KCkgeworICAgICAgICBwaXhlbExvb2tlcihtTm9PdmVybGF5SVYsIEdSRUVOKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVidWdPdmVybGF5KCkgeworICAgICAgICBpZiAoImRlYnVnIi5lcXVhbHMoQnVpbGRDb25maWcuQlVJTERfVFlQRSkpIHsKKyAgICAgICAgICAgIHBpeGVsTG9va2VyKG1EZWJ1Z092ZXJsYXlJViwgR1JFRU4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGl4ZWxMb29rZXIobURlYnVnT3ZlcmxheUlWLCBSRUQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJldGFPdmVybGF5KCkgeworICAgICAgICBpZiAoImJldGEiLmVxdWFscyhCdWlsZENvbmZpZy5GTEFWT1IyKSkgeworICAgICAgICAgICAgcGl4ZWxMb29rZXIobUJldGFPdmVybGF5SVYsIEdSRUVOKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBpeGVsTG9va2VyKG1CZXRhT3ZlcmxheUlWLCBSRUQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZyZWVOb3JtYWxPdmVybGF5KCkgeworICAgICAgICBpZiAoImZyZWVOb3JtYWwiLmVxdWFscyhCdWlsZENvbmZpZy5GTEFWT1IpKSB7CisgICAgICAgICAgICBwaXhlbExvb2tlcihtRnJlZU5vcm1hbE92ZXJsYXlJViwgR1JFRU4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGl4ZWxMb29rZXIobUZyZWVOb3JtYWxPdmVybGF5SVYsIFJFRCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnJlZUJldGFEZWJ1Z092ZXJsYXkoKSB7CisgICAgICAgIGlmICgiZnJlZUJldGEiLmVxdWFscyhCdWlsZENvbmZpZy5GTEFWT1IpICYmICJkZWJ1ZyIuZXF1YWxzKEJ1aWxkQ29uZmlnLkJVSUxEX1RZUEUpKSB7CisgICAgICAgICAgICBwaXhlbExvb2tlcihtRnJlZUJldGFEZWJ1Z092ZXJsYXlJViwgR1JFRU4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGl4ZWxMb29rZXIobUZyZWVCZXRhRGVidWdPdmVybGF5SVYsIFJFRCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHBpeGVsTG9va2VyKEltYWdlVmlldyBpdiwgaW50IGV4cGVjdGVkQ29sb3IpIHsKKyAgICAgICAgQml0bWFwRHJhd2FibGUgZCA9IChCaXRtYXBEcmF3YWJsZSkgaXYuZ2V0RHJhd2FibGUoKTsKKyAgICAgICAgQml0bWFwIGJpdG1hcCA9IGQuZ2V0Qml0bWFwKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZENvbG9yLCBiaXRtYXAuZ2V0UGl4ZWwoMCwgMCkpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3ZlcmxheTMvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL292ZXJsYXkzL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzNWE1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL292ZXJsYXkzL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwxMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0cy5vdmVybGF5MiI+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljb24iPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTWFpbiIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3ZlcmxheTMvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9vdmVybGF5Mi9NYWluLmphdmEgYi90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL292ZXJsYXkyL01haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGEwYTgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3ZlcmxheTMvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9vdmVybGF5Mi9NYWluLmphdmEKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0cy5vdmVybGF5MjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitwdWJsaWMgY2xhc3MgTWFpbiBleHRlbmRzIEFjdGl2aXR5Cit7CisgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBmaXJzdCBjcmVhdGVkLiAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpCisgICAgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5tYWluKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvZHJhd2FibGUvYmV0YV9vdmVybGF5LnBuZyBiL3Rlc3RzL292ZXJsYXkzL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9iZXRhX292ZXJsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWU1NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvZHJhd2FibGUvYmV0YV9vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvZHJhd2FibGUvZGVidWdfb3ZlcmxheS5wbmcgYi90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvZHJhd2FibGUvZGVidWdfb3ZlcmxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1ZTU0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL292ZXJsYXkzL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9kZWJ1Z19vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvZHJhd2FibGUvZnJlZV9iZXRhX2RlYnVnX292ZXJsYXkucG5nIGIvdGVzdHMvb3ZlcmxheTMvc3JjL21haW4vcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9kZWJ1Z19vdmVybGF5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTVlNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3ZlcmxheTMvc3JjL21haW4vcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9kZWJ1Z19vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvZHJhd2FibGUvZnJlZV9iZXRhX292ZXJsYXkucG5nIGIvdGVzdHMvb3ZlcmxheTMvc3JjL21haW4vcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9vdmVybGF5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTVlNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3ZlcmxheTMvc3JjL21haW4vcmVzL2RyYXdhYmxlL2ZyZWVfYmV0YV9vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvZHJhd2FibGUvZnJlZV9ub3JtYWxfb3ZlcmxheS5wbmcgYi90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvZHJhd2FibGUvZnJlZV9ub3JtYWxfb3ZlcmxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1ZTU0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL292ZXJsYXkzL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9mcmVlX25vcm1hbF9vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvZHJhd2FibGUvZnJlZV9vdmVybGF5LnBuZyBiL3Rlc3RzL292ZXJsYXkzL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9mcmVlX292ZXJsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWU1NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvZHJhd2FibGUvZnJlZV9vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvZHJhd2FibGUvaWNvbi5wbmcgYi90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvZHJhd2FibGUvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3YzY5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL292ZXJsYXkzL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvZHJhd2FibGUvbm9fb3ZlcmxheS5wbmcgYi90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvZHJhd2FibGUvbm9fb3ZlcmxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlMWFkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL292ZXJsYXkzL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9ub19vdmVybGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvbGF5b3V0L21haW4ueG1sIGIvdGVzdHMvb3ZlcmxheTMvc3JjL21haW4vcmVzL2xheW91dC9tYWluLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQ2ODI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3ZlcmxheTMvc3JjL21haW4vcmVzL2xheW91dC9tYWluLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9ub19vdmVybGF5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vX292ZXJsYXkiIC8+CisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2RlYnVnX292ZXJsYXkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGVidWdfb3ZlcmxheSIgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYmV0YV9vdmVybGF5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JldGFfb3ZlcmxheSIgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvZnJlZV9ub3JtYWxfb3ZlcmxheSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mcmVlX25vcm1hbF9vdmVybGF5IiAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9mcmVlX2JldGFfZGVidWdfb3ZlcmxheSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mcmVlX2JldGFfZGVidWdfb3ZlcmxheSIgLz4KKzwvTGluZWFyTGF5b3V0PgorCmRpZmYgLS1naXQgYS90ZXN0cy9vdmVybGF5My9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvdGVzdHMvb3ZlcmxheTMvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTQyMGU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3ZlcmxheTMvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cmVzb3VyY2VzPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiPl9UZXN0LU92ZXJsYXkyPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BrZ092ZXJyaWRlL2J1aWxkLmdyYWRsZSBiL3Rlc3RzL3BrZ092ZXJyaWRlL2J1aWxkLmdyYWRsZQppbmRleCA5YjkwOWE5Li43MmIxZGM0IDEwMDY0NAotLS0gYS90ZXN0cy9wa2dPdmVycmlkZS9idWlsZC5ncmFkbGUKKysrIGIvdGVzdHMvcGtnT3ZlcnJpZGUvYnVpbGQuZ3JhZGxlCkBAIC0zLDcgKzMsNyBAQAogICAgICAgICBtYXZlbiB7IHVybCAnLi4vLi4vLi4vLi4vb3V0L2hvc3QvZ3JhZGxlL3JlcG8nIH0KICAgICB9CiAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC41LjAtU05BUFNIT1QnCisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJwogICAgIH0KIH0KIGFwcGx5IHBsdWdpbjogJ2FuZHJvaWQnCmRpZmYgLS1naXQgYS90ZXN0cy9wcm9ndWFyZC9idWlsZC5ncmFkbGUgYi90ZXN0cy9wcm9ndWFyZC9idWlsZC5ncmFkbGUKaW5kZXggMzk0YTAzOS4uNjU1NjA1ZCAxMDA2NDQKLS0tIGEvdGVzdHMvcHJvZ3VhcmQvYnVpbGQuZ3JhZGxlCisrKyBiL3Rlc3RzL3Byb2d1YXJkL2J1aWxkLmdyYWRsZQpAQCAtMyw3ICszLDcgQEAKICAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNS4wLVNOQVBTSE9UJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKICAgICB9CiB9CiBhcHBseSBwbHVnaW46ICdhbmRyb2lkJwpkaWZmIC0tZ2l0IGEvdGVzdHMvcHJvZ3VhcmQvc3JjL2luc3RydW1lbnRUZXN0L2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvTWFpblRlc3QuamF2YSBiL3Rlc3RzL3Byb2d1YXJkL3NyYy9pbnN0cnVtZW50VGVzdC9qYXZhL2NvbS9hbmRyb2lkL3Rlc3RzL2Jhc2ljL01haW5UZXN0LmphdmEKaW5kZXggY2JiYzUyYi4uNDRiYzlmNCAxMDA2NDQKLS0tIGEvdGVzdHMvcHJvZ3VhcmQvc3JjL2luc3RydW1lbnRUZXN0L2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvTWFpblRlc3QuamF2YQorKysgYi90ZXN0cy9wcm9ndWFyZC9zcmMvaW5zdHJ1bWVudFRlc3QvamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9NYWluVGVzdC5qYXZhCkBAIC0zOCw1ICszOCwxMiBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0Vmlld0NvbnRlbnQoKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiMTIzNCIsIG1UZXh0Vmlldy5nZXRUZXh0KCkpOwogICAgIH0KKworICAgIC8qKiBUZXN0IHVzaW5nIGEgb2JmdXNjYXRlZCBjbGFzcyAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RPYmZ1c2NhdGVkQ29kZSgpIHsKKyAgICAgICAgZmluYWwgTWFpbiBhID0gZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgU3RyaW5nUHJvdmlkZXIgc3AgPSBhLmdldFN0cmluZ1Byb3ZpZGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiNDIiLCBzcC5nZXRTdHJpbmcoNDIpKTsKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Byb2d1YXJkL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvdGVzdHMvYmFzaWMvTWFpbi5qYXZhIGIvdGVzdHMvcHJvZ3VhcmQvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9NYWluLmphdmEKaW5kZXggNmQzYWUxMC4uZTMyNDA0YSAxMDA2NDQKLS0tIGEvdGVzdHMvcHJvZ3VhcmQvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9NYWluLmphdmEKKysrIGIvdGVzdHMvcHJvZ3VhcmQvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90ZXN0cy9iYXNpYy9NYWluLmphdmEKQEAgLTQsMjAgKzQsMjMgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAotcHVibGljIGNsYXNzIE1haW4gZXh0ZW5kcyBBY3Rpdml0eQoteworcHVibGljIGNsYXNzIE1haW4gZXh0ZW5kcyBBY3Rpdml0eSB7CiAKICAgICBwcml2YXRlIGludCBmb28gPSAxMjM0OwogCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdQcm92aWRlciBtU3RyaW5nUHJvdmlkZXIgPSBuZXcgU3RyaW5nUHJvdmlkZXIoKTsKKwogICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKQotICAgIHsKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1haW4pOwogCiAgICAgICAgIFRleHRWaWV3IHR2ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5kYXRlVGV4dCk7Ci0gICAgICAgIFN0cmluZ1Byb3ZpZGVyIHN0cmluZ1Byb3ZpZGVyID0gbmV3IFN0cmluZ1Byb3ZpZGVyKCk7Ci0gICAgICAgIHR2LnNldFRleHQoc3RyaW5nUHJvdmlkZXIuZ2V0U3RyaW5nKGZvbykpOworICAgICAgICB0di5zZXRUZXh0KGdldFN0cmluZ1Byb3ZpZGVyKCkuZ2V0U3RyaW5nKGZvbykpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdQcm92aWRlciBnZXRTdHJpbmdQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1TdHJpbmdQcm92aWRlcjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9wcm9ndWFyZExpYi9idWlsZC5ncmFkbGUgYi90ZXN0cy9wcm9ndWFyZExpYi9idWlsZC5ncmFkbGUKaW5kZXggNjJhNDQwNS4uYjg5OWY5YSAxMDA2NDQKLS0tIGEvdGVzdHMvcHJvZ3VhcmRMaWIvYnVpbGQuZ3JhZGxlCisrKyBiL3Rlc3RzL3Byb2d1YXJkTGliL2J1aWxkLmdyYWRsZQpAQCAtMyw2ICszLDYgQEAKICAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNS4wLVNOQVBTSE9UJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9wcm9ndWFyZExpYi9saWIvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvcHJvZ3VhcmRMaWIvbGliL2J1aWxkLmdyYWRsZQppbmRleCAzYjIwOWJmLi5lZmJmZmU2IDEwMDY0NAotLS0gYS90ZXN0cy9wcm9ndWFyZExpYi9saWIvYnVpbGQuZ3JhZGxlCisrKyBiL3Rlc3RzL3Byb2d1YXJkTGliL2xpYi9idWlsZC5ncmFkbGUKQEAgLTksNiArOSw2IEBACiAgICAgICAgIHZlcnNpb25OYW1lICIyLjAiCiAgICAgICAgIG1pblNka1ZlcnNpb24gMTYKICAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiAxNgotICAgICAgICBwcm9ndWFyZEZpbGUgJ2NvbmZpZy5wcm8nCisgICAgICAgIGNvbnN1bWVyUHJvZ3VhcmRGaWxlcyAnY29uZmlnLnBybycKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVuYW1lZEFway9idWlsZC5ncmFkbGUgYi90ZXN0cy9yZW5hbWVkQXBrL2J1aWxkLmdyYWRsZQppbmRleCA1ZmY2ODljLi4wMzIzYWZlIDEwMDY0NAotLS0gYS90ZXN0cy9yZW5hbWVkQXBrL2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy9yZW5hbWVkQXBrL2J1aWxkLmdyYWRsZQpAQCAtMyw3ICszLDcgQEAKICAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNS4wLVNOQVBTSE9UJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKICAgICB9CiB9CiBhcHBseSBwbHVnaW46ICdhbmRyb2lkJwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVuZGVyc2NyaXB0L2J1aWxkLmdyYWRsZSBiL3Rlc3RzL3JlbmRlcnNjcmlwdC9idWlsZC5ncmFkbGUKaW5kZXggNzUzMDg3MC4uOTNlMTdhZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVuZGVyc2NyaXB0L2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy9yZW5kZXJzY3JpcHQvYnVpbGQuZ3JhZGxlCkBAIC0zLDcgKzMsNyBAQAogICAgICAgICBtYXZlbiB7IHVybCAnLi4vLi4vLi4vLi4vb3V0L2hvc3QvZ3JhZGxlL3JlcG8nIH0KICAgICB9CiAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC41LjAtU05BUFNIT1QnCisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJwogICAgIH0KIH0KIGFwcGx5IHBsdWdpbjogJ2FuZHJvaWQnCmRpZmYgLS1naXQgYS90ZXN0cy9yZW5kZXJzY3JpcHRJbkxpYi9idWlsZC5ncmFkbGUgYi90ZXN0cy9yZW5kZXJzY3JpcHRJbkxpYi9idWlsZC5ncmFkbGUKaW5kZXggNjJhNDQwNS4uYjg5OWY5YSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVuZGVyc2NyaXB0SW5MaWIvYnVpbGQuZ3JhZGxlCisrKyBiL3Rlc3RzL3JlbmRlcnNjcmlwdEluTGliL2J1aWxkLmdyYWRsZQpAQCAtMyw2ICszLDYgQEAKICAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNS4wLVNOQVBTSE9UJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9yZW5kZXJzY3JpcHRNdWx0aVNyYy9idWlsZC5ncmFkbGUgYi90ZXN0cy9yZW5kZXJzY3JpcHRNdWx0aVNyYy9idWlsZC5ncmFkbGUKaW5kZXggZTQxZjMwMS4uM2EzYjlmNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVuZGVyc2NyaXB0TXVsdGlTcmMvYnVpbGQuZ3JhZGxlCisrKyBiL3Rlc3RzL3JlbmRlcnNjcmlwdE11bHRpU3JjL2J1aWxkLmdyYWRsZQpAQCAtMyw3ICszLDcgQEAKICAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNS4wLVNOQVBTSE9UJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKICAgICB9CiB9CiBhcHBseSBwbHVnaW46ICdhbmRyb2lkJwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVwby9hcHAvYnVpbGQuZ3JhZGxlIGIvdGVzdHMvcmVwby9hcHAvYnVpbGQuZ3JhZGxlCmluZGV4IGI3ZDhlNGEuLjI5NTEyZjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlcG8vYXBwL2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy9yZXBvL2FwcC9idWlsZC5ncmFkbGUKQEAgLTMsNyArMyw3IEBACiAgICAgICAgIG1hdmVuIHsgdXJsICcuLi8uLi8uLi8uLi8uLi9vdXQvaG9zdC9ncmFkbGUvcmVwbycgfQogICAgIH0KICAgICBkZXBlbmRlbmNpZXMgewotICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjUuMC1TTkFQU0hPVCcKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC43LjAtU05BUFNIT1QnCiAgICAgfQogfQogCmRpZmYgLS1naXQgYS90ZXN0cy9yZXBvL2Jhc2VMaWJyYXJ5L2J1aWxkLmdyYWRsZSBiL3Rlc3RzL3JlcG8vYmFzZUxpYnJhcnkvYnVpbGQuZ3JhZGxlCmluZGV4IGNhMjI2ZGUuLjFmNWRiZTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlcG8vYmFzZUxpYnJhcnkvYnVpbGQuZ3JhZGxlCisrKyBiL3Rlc3RzL3JlcG8vYmFzZUxpYnJhcnkvYnVpbGQuZ3JhZGxlCkBAIC0zLDcgKzMsNyBAQAogICAgICAgICBtYXZlbiB7IHVybCAnLi4vLi4vLi4vLi4vLi4vb3V0L2hvc3QvZ3JhZGxlL3JlcG8nIH0KICAgICB9CiAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC41LjAtU05BUFNIT1QnCisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVwby9saWJyYXJ5L2J1aWxkLmdyYWRsZSBiL3Rlc3RzL3JlcG8vbGlicmFyeS9idWlsZC5ncmFkbGUKaW5kZXggZDJmNmFlNi4uMmQxY2NkNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVwby9saWJyYXJ5L2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy9yZXBvL2xpYnJhcnkvYnVpbGQuZ3JhZGxlCkBAIC0zLDcgKzMsNyBAQAogICAgICAgICBtYXZlbiB7IHVybCAnLi4vLi4vLi4vLi4vLi4vb3V0L2hvc3QvZ3JhZGxlL3JlcG8nIH0KICAgICB9CiAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MC41LjAtU05BUFNIT1QnCisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNy4wLVNOQVBTSE9UJwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9idWlsZC5ncmFkbGUgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGYzMjYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9idWlsZC5ncmFkbGUKQEAgLTAsMCArMSwzOSBAQAorYnVpbGRzY3JpcHQgeworICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIG1hdmVuIHsgdXJsICcuLi8uLi8uLi8uLi9vdXQvaG9zdC9ncmFkbGUvcmVwbycgfQorICAgIH0KKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKKyAgICB9Cit9CithcHBseSBwbHVnaW46ICdhbmRyb2lkJworCithbmRyb2lkIHsKKyAgICBjb21waWxlU2RrVmVyc2lvbiAxOAorICAgIGJ1aWxkVG9vbHNWZXJzaW9uICIxOC4xLjEiCisKKyAgICBkZWZhdWx0Q29uZmlnIHsKKyAgICAgICAgbWluU2RrVmVyc2lvbiA4CisgICAgICAgIHRhcmdldFNka1ZlcnNpb24gMTYKKyAgICAgICAgcmVuZGVyc2NyaXB0VGFyZ2V0QXBpIDE4CisgICAgICAgIHJlbmRlcnNjcmlwdFN1cHBvcnRNb2RlIHRydWUKKyAgICB9CisKKyAgICBwcm9kdWN0Rmxhdm9ycyB7CisgICAgICAgIHg4NiB7CisgICAgICAgICAgICBuZGsgeworICAgICAgICAgICAgICAgIGFiaUZpbHRlciAieDg2IgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFybSB7CisgICAgICAgICAgICBuZGsgeworICAgICAgICAgICAgICAgIGFiaUZpbHRlciAiYXJtZWFiaS12N2EiCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWlwcyB7CisgICAgICAgICAgICBuZGsgeworICAgICAgICAgICAgICAgIGFiaUZpbHRlciAibWlwcyIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvcHJvZ3VhcmQtcHJvamVjdC50eHQgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3Byb2d1YXJkLXByb2plY3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZmUxNTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3Byb2d1YXJkLXByb2plY3QudHh0CkBAIC0wLDAgKzEsMjAgQEAKKyMgVG8gZW5hYmxlIFByb0d1YXJkIGluIHlvdXIgcHJvamVjdCwgZWRpdCBwcm9qZWN0LnByb3BlcnRpZXMKKyMgdG8gZGVmaW5lIHRoZSBwcm9ndWFyZC5jb25maWcgcHJvcGVydHkgYXMgZGVzY3JpYmVkIGluIHRoYXQgZmlsZS4KKyMKKyMgQWRkIHByb2plY3Qgc3BlY2lmaWMgUHJvR3VhcmQgcnVsZXMgaGVyZS4KKyMgQnkgZGVmYXVsdCwgdGhlIGZsYWdzIGluIHRoaXMgZmlsZSBhcmUgYXBwZW5kZWQgdG8gZmxhZ3Mgc3BlY2lmaWVkCisjIGluICR7c2RrLmRpcn0vdG9vbHMvcHJvZ3VhcmQvcHJvZ3VhcmQtYW5kcm9pZC50eHQKKyMgWW91IGNhbiBlZGl0IHRoZSBpbmNsdWRlIHBhdGggYW5kIG9yZGVyIGJ5IGNoYW5naW5nIHRoZSBQcm9HdWFyZAorIyBpbmNsdWRlIHByb3BlcnR5IGluIHByb2plY3QucHJvcGVydGllcy4KKyMKKyMgRm9yIG1vcmUgZGV0YWlscywgc2VlCisjICAgaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL3Byb2d1YXJkLmh0bWwKKworIyBBZGQgYW55IHByb2plY3Qgc3BlY2lmaWMga2VlcCBvcHRpb25zIGhlcmU6CisKKyMgSWYgeW91ciBwcm9qZWN0IHVzZXMgV2ViVmlldyB3aXRoIEpTLCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZworIyBhbmQgc3BlY2lmeSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgdG8gdGhlIEphdmFTY3JpcHQgaW50ZXJmYWNlCisjIGNsYXNzOgorIy1rZWVwY2xhc3NtZW1iZXJzIGNsYXNzIGZxY24ub2YuamF2YXNjcmlwdC5pbnRlcmZhY2UuZm9yLndlYnZpZXcgeworIyAgIHB1YmxpYyAqOworI30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvcHJvamVjdC5wcm9wZXJ0aWVzIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9wcm9qZWN0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4MTBlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvcHJvamVjdC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjIgQEAKKyMgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IEFuZHJvaWQgVG9vbHMuCisjIERvIG5vdCBtb2RpZnkgdGhpcyBmaWxlIC0tIFlPVVIgQ0hBTkdFUyBXSUxMIEJFIEVSQVNFRCEKKyMKKyMgVGhpcyBmaWxlIG11c3QgYmUgY2hlY2tlZCBpbiBWZXJzaW9uIENvbnRyb2wgU3lzdGVtcy4KKyMKKyMgVG8gY3VzdG9taXplIHByb3BlcnRpZXMgdXNlZCBieSB0aGUgQW50IGJ1aWxkIHN5c3RlbSBlZGl0CisjICJhbnQucHJvcGVydGllcyIsIGFuZCBvdmVycmlkZSB2YWx1ZXMgdG8gYWRhcHQgdGhlIHNjcmlwdCB0byB5b3VyCisjIHByb2plY3Qgc3RydWN0dXJlLgorIworIyBUbyBlbmFibGUgUHJvR3VhcmQgdG8gc2hyaW5rIGFuZCBvYmZ1c2NhdGUgeW91ciBjb2RlLCB1bmNvbW1lbnQgdGhpcyAoYXZhaWxhYmxlIHByb3BlcnRpZXM6IHNkay5kaXIsIHVzZXIuaG9tZSk6CisjcHJvZ3VhcmQuY29uZmlnPSR7c2RrLmRpcn0vdG9vbHMvcHJvZ3VhcmQvcHJvZ3VhcmQtYW5kcm9pZC50eHQ6cHJvZ3VhcmQtcHJvamVjdC50eHQKKworIyBQcm9qZWN0IHRhcmdldC4KK3RhcmdldD1hbmRyb2lkLTE4CityZW5kZXJzY3JpcHQudGFyZ2V0PTE4CityZW5kZXJzY3JpcHQuc3VwcG9ydC5tb2RlPXRydWUKKworCitrZXkuc3RvcmU9L1VzZXJzL3hhdi8uYW5kcm9pZC9kZWJ1Zy5rZXlzdG9yZQora2V5LnN0b3JlLnBhc3N3b3JkPWFuZHJvaWQKK2tleS5hbGlhcz1hbmRyb2lkZGVidWdrZXkKK2tleS5hbGlhcy5wYXNzd29yZD1hbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyOWZhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnJzLmltYWdlMiI+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjgiIC8+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IklQIEdCIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9CV0ZpbHRlci5qYXZhIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0JXRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxOTg1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9CV0ZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLmltYWdlMjsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworCisKK3B1YmxpYyBjbGFzcyBCV0ZpbHRlciBleHRlbmRzIFRlc3RCYXNlIHsKKyAgICBwcml2YXRlIFNjcmlwdENfYndmaWx0ZXIgbVNjcmlwdDsKKworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVRlc3QoYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19id2ZpbHRlcihtUlMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7CisgICAgICAgIG1TY3JpcHQuaW52b2tlX3ByZXBhcmVCd0ZpbHRlcig1MCwgNTAsIDUwKTsKKyAgICAgICAgbVNjcmlwdC5mb3JFYWNoX2J3RmlsdGVyS2VybmVsKG1JblBpeGVsc0FsbG9jYXRpb24sIG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9CbGVuZC5qYXZhIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0JsZW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgxYmE4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9CbGVuZC5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy5pbWFnZTI7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBqYXZhLmxhbmcuU2hvcnQ7CisKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjgucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyOworCitwdWJsaWMgY2xhc3MgQmxlbmQgZXh0ZW5kcyBUZXN0QmFzZSB7CisgICAgcHJpdmF0ZSBTY3JpcHRJbnRyaW5zaWNCbGVuZCBtQmxlbmQ7CisgICAgcHJpdmF0ZSBTY3JpcHRDX2JsZW5kIG1CbGVuZEhlbHBlcjsKKyAgICBwcml2YXRlIHNob3J0IGltYWdlMUFscGhhID0gMTI4OworICAgIHByaXZhdGUgc2hvcnQgaW1hZ2UyQWxwaGEgPSAxMjg7CisKKyAgICBTdHJpbmcgbUludHJpbnNpY05hbWVzW107CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gaW1hZ2UxOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBpbWFnZTI7CisgICAgcHJpdmF0ZSBpbnQgY3VycmVudEludHJpbnNpYyA9IDA7CisKKyAgICBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgbUludHJpbnNpY1NwaW5uZXJMaXN0ZW5lciA9CisgICAgICAgICAgICBuZXcgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1TZWxlY3RlZChBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvcywgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW50cmluc2ljID0gcG9zOworICAgICAgICAgICAgICAgICAgICBpZiAobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1blRlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdC51cGRhdGVEaXNwbGF5KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk5vdGhpbmdTZWxlY3RlZChBZGFwdGVyVmlldyBwYXJlbnQpIHsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVUZXN0KGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIHJlcykgeworICAgICAgICBtQmxlbmQgPSBTY3JpcHRJbnRyaW5zaWNCbGVuZC5jcmVhdGUobVJTLCBFbGVtZW50LlU4XzQobVJTKSk7CisgICAgICAgIG1CbGVuZEhlbHBlciA9IG5ldyBTY3JpcHRDX2JsZW5kKG1SUyk7CisgICAgICAgIG1CbGVuZEhlbHBlci5zZXRfYWxwaGEoKHNob3J0KTEyOCk7CisKKyAgICAgICAgaW1hZ2UxID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1JblBpeGVsc0FsbG9jYXRpb24uZ2V0VHlwZSgpKTsKKyAgICAgICAgaW1hZ2UyID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1JblBpeGVsc0FsbG9jYXRpb24yLmdldFR5cGUoKSk7CisKKyAgICAgICAgbUludHJpbnNpY05hbWVzID0gbmV3IFN0cmluZ1sxNF07CisgICAgICAgIG1JbnRyaW5zaWNOYW1lc1swXSA9ICJTb3VyY2UiOworICAgICAgICBtSW50cmluc2ljTmFtZXNbMV0gPSAiRGVzdGluYXRpb24iOworICAgICAgICBtSW50cmluc2ljTmFtZXNbMl0gPSAiU291cmNlIE92ZXIiOworICAgICAgICBtSW50cmluc2ljTmFtZXNbM10gPSAiRGVzdGluYXRpb24gT3ZlciI7CisgICAgICAgIG1JbnRyaW5zaWNOYW1lc1s0XSA9ICJTb3VyY2UgSW4iOworICAgICAgICBtSW50cmluc2ljTmFtZXNbNV0gPSAiRGVzdGluYXRpb24gSW4iOworICAgICAgICBtSW50cmluc2ljTmFtZXNbNl0gPSAiU291cmNlIE91dCI7CisgICAgICAgIG1JbnRyaW5zaWNOYW1lc1s3XSA9ICJEZXN0aW5hdGlvbiBPdXQiOworICAgICAgICBtSW50cmluc2ljTmFtZXNbOF0gPSAiU291cmNlIEF0b3AiOworICAgICAgICBtSW50cmluc2ljTmFtZXNbOV0gPSAiRGVzdGluYXRpb24gQXRvcCI7CisgICAgICAgIG1JbnRyaW5zaWNOYW1lc1sxMF0gPSAiWE9SIjsKKyAgICAgICAgbUludHJpbnNpY05hbWVzWzExXSA9ICJBZGQiOworICAgICAgICBtSW50cmluc2ljTmFtZXNbMTJdID0gIlN1YnRyYWN0IjsKKyAgICAgICAgbUludHJpbnNpY05hbWVzWzEzXSA9ICJNdWx0aXBseSI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25TcGlubmVyMVNldHVwKFNwaW5uZXIgcykgeworICAgICAgICBzLnNldEFkYXB0ZXIobmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KAorICAgICAgICAgICAgYWN0LCBSLmxheW91dC5zcGlubmVyX2xheW91dCwgbUludHJpbnNpY05hbWVzKSk7CisgICAgICAgIHMuc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtSW50cmluc2ljU3Bpbm5lckxpc3RlbmVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25CYXIxU2V0dXAoU2Vla0JhciBiLCBUZXh0VmlldyB0KSB7CisgICAgICAgIHQuc2V0VGV4dCgiSW1hZ2UgMSBBbHBoYSIpOworICAgICAgICBiLnNldE1heCgyNTUpOworICAgICAgICBiLnNldFByb2dyZXNzKGltYWdlMUFscGhhKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25CYXIxQ2hhbmdlZChpbnQgcHJvZ3Jlc3MpIHsKKyAgICAgICAgaW1hZ2UxQWxwaGEgPSAoc2hvcnQpcHJvZ3Jlc3M7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25CYXIyU2V0dXAoU2Vla0JhciBiLCBUZXh0VmlldyB0KSB7CisgICAgICAgIHQuc2V0VGV4dCgiSW1hZ2UgMiBBbHBoYSIpOworICAgICAgICBiLnNldE1heCgyNTUpOworICAgICAgICBiLnNldFByb2dyZXNzKGltYWdlMkFscGhhKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25CYXIyQ2hhbmdlZChpbnQgcHJvZ3Jlc3MpIHsKKyAgICAgICAgaW1hZ2UyQWxwaGEgPSAoc2hvcnQpcHJvZ3Jlc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKKyAgICAgICAgaW1hZ2UxLmNvcHkyRFJhbmdlRnJvbSgwLCAwLCBtSW5QaXhlbHNBbGxvY2F0aW9uLmdldFR5cGUoKS5nZXRYKCksIG1JblBpeGVsc0FsbG9jYXRpb24uZ2V0VHlwZSgpLmdldFkoKSwgbUluUGl4ZWxzQWxsb2NhdGlvbiwgMCwgMCk7CisgICAgICAgIGltYWdlMi5jb3B5MkRSYW5nZUZyb20oMCwgMCwgbUluUGl4ZWxzQWxsb2NhdGlvbjIuZ2V0VHlwZSgpLmdldFgoKSwgbUluUGl4ZWxzQWxsb2NhdGlvbjIuZ2V0VHlwZSgpLmdldFkoKSwgbUluUGl4ZWxzQWxsb2NhdGlvbjIsIDAsIDApOworCisgICAgICAgIG1CbGVuZEhlbHBlci5zZXRfYWxwaGEoaW1hZ2UxQWxwaGEpOworICAgICAgICBtQmxlbmRIZWxwZXIuZm9yRWFjaF9zZXRJbWFnZUFscGhhKGltYWdlMSk7CisKKyAgICAgICAgbUJsZW5kSGVscGVyLnNldF9hbHBoYShpbWFnZTJBbHBoYSk7CisgICAgICAgIG1CbGVuZEhlbHBlci5mb3JFYWNoX3NldEltYWdlQWxwaGEoaW1hZ2UyKTsKKworICAgICAgICBzd2l0Y2ggKGN1cnJlbnRJbnRyaW5zaWMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgbUJsZW5kLmZvckVhY2hTcmMoaW1hZ2UxLCBpbWFnZTIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG1CbGVuZC5mb3JFYWNoRHN0KGltYWdlMSwgaW1hZ2UyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtQmxlbmQuZm9yRWFjaFNyY092ZXIoaW1hZ2UxLCBpbWFnZTIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIG1CbGVuZC5mb3JFYWNoRHN0T3ZlcihpbWFnZTEsIGltYWdlMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgbUJsZW5kLmZvckVhY2hTcmNJbihpbWFnZTEsIGltYWdlMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgbUJsZW5kLmZvckVhY2hEc3RJbihpbWFnZTEsIGltYWdlMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgbUJsZW5kLmZvckVhY2hTcmNPdXQoaW1hZ2UxLCBpbWFnZTIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIG1CbGVuZC5mb3JFYWNoRHN0T3V0KGltYWdlMSwgaW1hZ2UyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtQmxlbmQuZm9yRWFjaFNyY0F0b3AoaW1hZ2UxLCBpbWFnZTIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIG1CbGVuZC5mb3JFYWNoRHN0QXRvcChpbWFnZTEsIGltYWdlMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgIG1CbGVuZC5mb3JFYWNoWG9yKGltYWdlMSwgaW1hZ2UyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgbUJsZW5kLmZvckVhY2hBZGQoaW1hZ2UxLCBpbWFnZTIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICBtQmxlbmQuZm9yRWFjaFN1YnRyYWN0KGltYWdlMSwgaW1hZ2UyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgbUJsZW5kLmZvckVhY2hNdWx0aXBseShpbWFnZTEsIGltYWdlMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uLmNvcHkyRFJhbmdlRnJvbSgwLCAwLCBpbWFnZTIuZ2V0VHlwZSgpLmdldFgoKSwgaW1hZ2UyLmdldFR5cGUoKS5nZXRZKCksIGltYWdlMiwgMCwgMCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvQmx1cjI1LmphdmEgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvQmx1cjI1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUxOGIwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9CbHVyMjUuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMuaW1hZ2UyOworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CisKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjgucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgQmx1cjI1IGV4dGVuZHMgVGVzdEJhc2UgeworICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlSW50cmluc2ljID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTY3JpcHRJbnRyaW5zaWNCbHVyIG1JbnRyaW5zaWM7CisKKyAgICBwcml2YXRlIGludCBNQVhfUkFESVVTID0gMjU7CisgICAgcHJpdmF0ZSBTY3JpcHRDX3RocmVzaG9sZCBtU2NyaXB0OworICAgIHByaXZhdGUgZmxvYXQgbVJhZGl1cyA9IE1BWF9SQURJVVM7CisgICAgcHJpdmF0ZSBmbG9hdCBtU2F0dXJhdGlvbiA9IDEuMGY7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjE7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjI7CisKKworICAgIHB1YmxpYyBCbHVyMjUoYm9vbGVhbiB1c2VJbnRyaW5zaWMpIHsKKyAgICAgICAgbVVzZUludHJpbnNpYyA9IHVzZUludHJpbnNpYzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkJhcjFTZXR1cChTZWVrQmFyIGIsIFRleHRWaWV3IHQpIHsKKyAgICAgICAgdC5zZXRUZXh0KCJSYWRpdXMiKTsKKyAgICAgICAgYi5zZXRQcm9ncmVzcygxMDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIG9uQmFyMUNoYW5nZWQoaW50IHByb2dyZXNzKSB7CisgICAgICAgIG1SYWRpdXMgPSAoKGZsb2F0KXByb2dyZXNzKSAvIDEwMC4wZiAqIE1BWF9SQURJVVM7CisgICAgICAgIGlmIChtUmFkaXVzIDw9IDAuMTBmKSB7CisgICAgICAgICAgICBtUmFkaXVzID0gMC4xMGY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Vc2VJbnRyaW5zaWMpIHsKKyAgICAgICAgICAgIG1JbnRyaW5zaWMuc2V0UmFkaXVzKG1SYWRpdXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNjcmlwdC5pbnZva2Vfc2V0UmFkaXVzKChpbnQpbVJhZGl1cyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVRlc3QoYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIGludCB3aWR0aCA9IG1JblBpeGVsc0FsbG9jYXRpb24uZ2V0VHlwZSgpLmdldFgoKTsKKyAgICAgICAgaW50IGhlaWdodCA9IG1JblBpeGVsc0FsbG9jYXRpb24uZ2V0VHlwZSgpLmdldFkoKTsKKworICAgICAgICBpZiAobVVzZUludHJpbnNpYykgeworICAgICAgICAgICAgbUludHJpbnNpYyA9IFNjcmlwdEludHJpbnNpY0JsdXIuY3JlYXRlKG1SUywgRWxlbWVudC5VOF80KG1SUykpOworICAgICAgICAgICAgbUludHJpbnNpYy5zZXRSYWRpdXMoTUFYX1JBRElVUyk7CisgICAgICAgICAgICBtSW50cmluc2ljLnNldElucHV0KG1JblBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBUeXBlLkJ1aWxkZXIgdGIgPSBuZXcgVHlwZS5CdWlsZGVyKG1SUywgRWxlbWVudC5GMzJfNChtUlMpKTsKKyAgICAgICAgICAgIHRiLnNldFgod2lkdGgpOworICAgICAgICAgICAgdGIuc2V0WShoZWlnaHQpOworICAgICAgICAgICAgbVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMSA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCB0Yi5jcmVhdGUoKSk7CisgICAgICAgICAgICBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24yID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIHRiLmNyZWF0ZSgpKTsKKworICAgICAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX3RocmVzaG9sZChtUlMsIHJlcywgUi5yYXcudGhyZXNob2xkKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X3dpZHRoKHdpZHRoKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X2hlaWdodChoZWlnaHQpOworICAgICAgICAgICAgbVNjcmlwdC5pbnZva2Vfc2V0UmFkaXVzKE1BWF9SQURJVVMpOworCisgICAgICAgICAgICBtU2NyaXB0LnNldF9JblBpeGVsKG1JblBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICAgICAgbVNjcmlwdC5zZXRfU2NyYXRjaFBpeGVsMShtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24xKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X1NjcmF0Y2hQaXhlbDIobVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW5UZXN0KCkgeworICAgICAgICBpZiAobVVzZUludHJpbnNpYykgeworICAgICAgICAgICAgbUludHJpbnNpYy5mb3JFYWNoKG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TY3JpcHQuZm9yRWFjaF9jb3B5SW4obUluUGl4ZWxzQWxsb2NhdGlvbiwgbVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMSk7CisgICAgICAgICAgICBtU2NyaXB0LmZvckVhY2hfaG9yeihtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24yKTsKKyAgICAgICAgICAgIG1TY3JpcHQuZm9yRWFjaF92ZXJ0KG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldHVwQmVuY2htYXJrKCkgeworICAgICAgICBpZiAobVVzZUludHJpbnNpYykgeworICAgICAgICAgICAgbUludHJpbnNpYy5zZXRSYWRpdXMoTUFYX1JBRElVUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2NyaXB0Lmludm9rZV9zZXRSYWRpdXMoTUFYX1JBRElVUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleGl0QmVuY2htYXJrKCkgeworICAgICAgICBpZiAobVVzZUludHJpbnNpYykgeworICAgICAgICAgICAgbUludHJpbnNpYy5zZXRSYWRpdXMobVJhZGl1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2NyaXB0Lmludm9rZV9zZXRSYWRpdXMoKGludCltUmFkaXVzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9CbHVyMjVHLmphdmEgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvQmx1cjI1Ry5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YWE5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvQmx1cjI1Ry5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLmltYWdlMjsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY4LnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworcHVibGljIGNsYXNzIEJsdXIyNUcgZXh0ZW5kcyBUZXN0QmFzZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX1JBRElVUyA9IDI1OworICAgIHByaXZhdGUgZmxvYXQgbVJhZGl1cyA9IE1BWF9SQURJVVM7CisKKyAgICBwcml2YXRlIFNjcmlwdEludHJpbnNpY0JsdXIgbUludHJpbnNpYzsKKworICAgIHByaXZhdGUgU2NyaXB0Q19ncmV5c2NhbGUgbVNjcmlwdDsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMTsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMjsKKworCisgICAgcHVibGljIEJsdXIyNUcoKSB7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25CYXIxU2V0dXAoU2Vla0JhciBiLCBUZXh0VmlldyB0KSB7CisgICAgICAgIHQuc2V0VGV4dCgiUmFkaXVzIik7CisgICAgICAgIGIuc2V0UHJvZ3Jlc3MoMTAwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBvbkJhcjFDaGFuZ2VkKGludCBwcm9ncmVzcykgeworICAgICAgICBtUmFkaXVzID0gKChmbG9hdClwcm9ncmVzcykgLyAxMDAuMGYgKiBNQVhfUkFESVVTOworICAgICAgICBpZiAobVJhZGl1cyA8PSAwLjEwZikgeworICAgICAgICAgICAgbVJhZGl1cyA9IDAuMTBmOworICAgICAgICB9CisgICAgICAgIG1JbnRyaW5zaWMuc2V0UmFkaXVzKG1SYWRpdXMpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgY3JlYXRlVGVzdChhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyByZXMpIHsKKyAgICAgICAgaW50IHdpZHRoID0gbUluUGl4ZWxzQWxsb2NhdGlvbi5nZXRUeXBlKCkuZ2V0WCgpOworICAgICAgICBpbnQgaGVpZ2h0ID0gbUluUGl4ZWxzQWxsb2NhdGlvbi5nZXRUeXBlKCkuZ2V0WSgpOworCisgICAgICAgIFR5cGUuQnVpbGRlciB0YiA9IG5ldyBUeXBlLkJ1aWxkZXIobVJTLCBFbGVtZW50LlU4KG1SUykpOworICAgICAgICB0Yi5zZXRYKHdpZHRoKTsKKyAgICAgICAgdGIuc2V0WShoZWlnaHQpOworICAgICAgICBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24xID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIHRiLmNyZWF0ZSgpKTsKKyAgICAgICAgbVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMiA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCB0Yi5jcmVhdGUoKSk7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX2dyZXlzY2FsZShtUlMpOworICAgICAgICBtU2NyaXB0LmZvckVhY2hfdG9VOChtSW5QaXhlbHNBbGxvY2F0aW9uLCBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24xKTsKKworICAgICAgICBtSW50cmluc2ljID0gU2NyaXB0SW50cmluc2ljQmx1ci5jcmVhdGUobVJTLCBFbGVtZW50LlU4KG1SUykpOworICAgICAgICBtSW50cmluc2ljLnNldFJhZGl1cyhNQVhfUkFESVVTKTsKKyAgICAgICAgbUludHJpbnNpYy5zZXRJbnB1dChtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24xKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW5UZXN0KCkgeworICAgICAgICBtSW50cmluc2ljLmZvckVhY2gobVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dXBCZW5jaG1hcmsoKSB7CisgICAgICAgIG1JbnRyaW5zaWMuc2V0UmFkaXVzKE1BWF9SQURJVVMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4aXRCZW5jaG1hcmsoKSB7CisgICAgICAgIG1JbnRyaW5zaWMuc2V0UmFkaXVzKG1SYWRpdXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJpdG1hcChCaXRtYXAgYikgeworICAgICAgICBtU2NyaXB0LmZvckVhY2hfdG9VOF80KG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjIsIG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24uY29weVRvKGIpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvQ29sb3JDdWJlLmphdmEgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvQ29sb3JDdWJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2MDM4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9Db2xvckN1YmUuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy5pbWFnZTI7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKKworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52OC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgQ29sb3JDdWJlIGV4dGVuZHMgVGVzdEJhc2UgeworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQ3ViZTsKKyAgICBwcml2YXRlIFNjcmlwdENfY29sb3JjdWJlIG1TY3JpcHQ7CisgICAgcHJpdmF0ZSBTY3JpcHRJbnRyaW5zaWMzRExVVCBtSW50cmluc2ljOworICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlSW50cmluc2ljOworCisgICAgcHVibGljIENvbG9yQ3ViZShib29sZWFuIHVzZUludHJpbnNpYykgeworICAgICAgICBtVXNlSW50cmluc2ljID0gdXNlSW50cmluc2ljOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0Q3ViZSgpIHsKKyAgICAgICAgZmluYWwgaW50IHN4ID0gMzI7CisgICAgICAgIGZpbmFsIGludCBzeSA9IDMyOworICAgICAgICBmaW5hbCBpbnQgc3ogPSAxNjsKKworICAgICAgICBUeXBlLkJ1aWxkZXIgdGIgPSBuZXcgVHlwZS5CdWlsZGVyKG1SUywgRWxlbWVudC5VOF80KG1SUykpOworICAgICAgICB0Yi5zZXRYKHN4KTsKKyAgICAgICAgdGIuc2V0WShzeSk7CisgICAgICAgIHRiLnNldFooc3opOworICAgICAgICBUeXBlIHQgPSB0Yi5jcmVhdGUoKTsKKyAgICAgICAgbUN1YmUgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgdCk7CisKKyAgICAgICAgaW50IGRhdFtdID0gbmV3IGludFtzeCAqIHN5ICogc3pdOworICAgICAgICBmb3IgKGludCB6ID0gMDsgeiA8IHN6OyB6KyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgc3k7IHkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgc3g7IHgrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHYgPSAweGZmMDAwMDAwOworICAgICAgICAgICAgICAgICAgICB2IHw9ICgweGZmICogeCAvIChzeCAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgdiB8PSAoMHhmZiAqIHkgLyAoc3kgLSAxKSkgPDwgODsKKyAgICAgICAgICAgICAgICAgICAgdiB8PSAoMHhmZiAqIHogLyAoc3ogLSAxKSkgPDwgMTY7CisgICAgICAgICAgICAgICAgICAgIGRhdFt6KnN5KnN4ICsgeSpzeCArIHhdID0gdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtQ3ViZS5jb3B5RnJvbVVuY2hlY2tlZChkYXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVRlc3QoYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19jb2xvcmN1YmUobVJTLCByZXMsIFIucmF3LmNvbG9yY3ViZSk7CisgICAgICAgIG1JbnRyaW5zaWMgPSBTY3JpcHRJbnRyaW5zaWMzRExVVC5jcmVhdGUobVJTLCBFbGVtZW50LlU4XzQobVJTKSk7CisKKyAgICAgICAgaW5pdEN1YmUoKTsKKyAgICAgICAgbVNjcmlwdC5pbnZva2Vfc2V0Q3ViZShtQ3ViZSk7CisgICAgICAgIG1JbnRyaW5zaWMuc2V0TFVUKG1DdWJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW5UZXN0KCkgeworICAgICAgICBpZiAobVVzZUludHJpbnNpYykgeworICAgICAgICAgICAgbUludHJpbnNpYy5mb3JFYWNoKG1JblBpeGVsc0FsbG9jYXRpb24sIG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TY3JpcHQuZm9yRWFjaF9yb290KG1JblBpeGVsc0FsbG9jYXRpb24sIG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0NvbG9yTWF0cml4LmphdmEgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvQ29sb3JNYXRyaXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjBmODZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0NvbG9yTWF0cml4LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMuaW1hZ2UyOworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CisKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjgucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIENvbG9yTWF0cml4IGV4dGVuZHMgVGVzdEJhc2UgeworICAgIHByaXZhdGUgU2NyaXB0Q19jb2xvcm1hdHJpeCBtU2NyaXB0OworICAgIHByaXZhdGUgU2NyaXB0SW50cmluc2ljQ29sb3JNYXRyaXggbUludHJpbnNpYzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVVzZUludHJpbnNpYzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVVzZUdyZXk7CisKKyAgICBwdWJsaWMgQ29sb3JNYXRyaXgoYm9vbGVhbiB1c2VJbnRyaW5zaWMsIGJvb2xlYW4gdXNlR3JleSkgeworICAgICAgICBtVXNlSW50cmluc2ljID0gdXNlSW50cmluc2ljOworICAgICAgICBtVXNlR3JleSA9IHVzZUdyZXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY3JlYXRlVGVzdChhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyByZXMpIHsKKyAgICAgICAgTWF0cml4NGYgbSA9IG5ldyBNYXRyaXg0ZigpOworICAgICAgICBtLnNldCgxLCAwLCAwLjJmKTsKKyAgICAgICAgbS5zZXQoMSwgMSwgMC45Zik7CisgICAgICAgIG0uc2V0KDEsIDIsIDAuMmYpOworCisgICAgICAgIGlmIChtVXNlSW50cmluc2ljKSB7CisgICAgICAgICAgICBtSW50cmluc2ljID0gU2NyaXB0SW50cmluc2ljQ29sb3JNYXRyaXguY3JlYXRlKG1SUywgRWxlbWVudC5VOF80KG1SUykpOworICAgICAgICAgICAgaWYgKG1Vc2VHcmV5KSB7CisgICAgICAgICAgICAgICAgbUludHJpbnNpYy5zZXRHcmV5c2NhbGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUludHJpbnNpYy5zZXRDb2xvck1hdHJpeChtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19jb2xvcm1hdHJpeChtUlMsIHJlcywgUi5yYXcuY29sb3JtYXRyaXgpOworICAgICAgICAgICAgbVNjcmlwdC5pbnZva2Vfc2V0TWF0cml4KG0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKKyAgICAgICAgaWYgKG1Vc2VJbnRyaW5zaWMpIHsKKyAgICAgICAgICAgIG1JbnRyaW5zaWMuZm9yRWFjaChtSW5QaXhlbHNBbGxvY2F0aW9uLCBtT3V0UGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2NyaXB0LmZvckVhY2hfcm9vdChtSW5QaXhlbHNBbGxvY2F0aW9uLCBtT3V0UGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9Db250cmFzdC5qYXZhIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0NvbnRyYXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlNWQyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9Db250cmFzdC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLmltYWdlMjsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworCisKK3B1YmxpYyBjbGFzcyBDb250cmFzdCBleHRlbmRzIFRlc3RCYXNlIHsKKyAgICBwcml2YXRlIFNjcmlwdENfY29udHJhc3QgbVNjcmlwdDsKKworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVRlc3QoYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19jb250cmFzdChtUlMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7CisgICAgICAgIG1TY3JpcHQuaW52b2tlX3NldEJyaWdodCg1MC5mKTsKKyAgICAgICAgbVNjcmlwdC5mb3JFYWNoX2NvbnRyYXN0KG1JblBpeGVsc0FsbG9jYXRpb24sIG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9Db252b2x2ZTN4My5qYXZhIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0NvbnZvbHZlM3gzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4NTJmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9Db252b2x2ZTN4My5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLmltYWdlMjsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworCitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY4LnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBDb252b2x2ZTN4MyBleHRlbmRzIFRlc3RCYXNlIHsKKyAgICBwcml2YXRlIFNjcmlwdENfaXAyX2NvbnZvbHZlM3gzIG1TY3JpcHQ7CisgICAgcHJpdmF0ZSBTY3JpcHRJbnRyaW5zaWNDb252b2x2ZTN4MyBtSW50cmluc2ljOworCisgICAgcHJpdmF0ZSBpbnQgbVdpZHRoOworICAgIHByaXZhdGUgaW50IG1IZWlnaHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Vc2VJbnRyaW5zaWM7CisKKyAgICBwdWJsaWMgQ29udm9sdmUzeDMoYm9vbGVhbiB1c2VJbnRyaW5zaWMpIHsKKyAgICAgICAgbVVzZUludHJpbnNpYyA9IHVzZUludHJpbnNpYzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVUZXN0KGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIHJlcykgeworICAgICAgICBtV2lkdGggPSBtSW5QaXhlbHNBbGxvY2F0aW9uLmdldFR5cGUoKS5nZXRYKCk7CisgICAgICAgIG1IZWlnaHQgPSBtSW5QaXhlbHNBbGxvY2F0aW9uLmdldFR5cGUoKS5nZXRZKCk7CisKKyAgICAgICAgZmxvYXQgZltdID0gbmV3IGZsb2F0WzldOworICAgICAgICBmWzBdID0gIDAuZjsgICAgZlsxXSA9IC0xLmY7ICAgIGZbMl0gPSAgMC5mOworICAgICAgICBmWzNdID0gLTEuZjsgICAgZls0XSA9ICA1LmY7ICAgIGZbNV0gPSAtMS5mOworICAgICAgICBmWzZdID0gIDAuZjsgICAgZls3XSA9IC0xLmY7ICAgIGZbOF0gPSAgMC5mOworCisgICAgICAgIGlmIChtVXNlSW50cmluc2ljKSB7CisgICAgICAgICAgICBtSW50cmluc2ljID0gU2NyaXB0SW50cmluc2ljQ29udm9sdmUzeDMuY3JlYXRlKG1SUywgRWxlbWVudC5VOF80KG1SUykpOworICAgICAgICAgICAgbUludHJpbnNpYy5zZXRDb2VmZmljaWVudHMoZik7CisgICAgICAgICAgICBtSW50cmluc2ljLnNldElucHV0KG1JblBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX2lwMl9jb252b2x2ZTN4MyhtUlMsIHJlcywgUi5yYXcuaXAyX2NvbnZvbHZlM3gzKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X2dDb2VmZnMoZik7CisgICAgICAgICAgICBtU2NyaXB0LnNldF9nSW4obUluUGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgICAgICBtU2NyaXB0LnNldF9nV2lkdGgobVdpZHRoKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X2dIZWlnaHQobUhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW5UZXN0KCkgeworICAgICAgICBpZiAobVVzZUludHJpbnNpYykgeworICAgICAgICAgICAgbUludHJpbnNpYy5mb3JFYWNoKG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TY3JpcHQuZm9yRWFjaF9yb290KG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0NvbnZvbHZlNXg1LmphdmEgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvQ29udm9sdmU1eDUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmRhM2M0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0NvbnZvbHZlNXg1LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMuaW1hZ2UyOworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CisKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjgucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIENvbnZvbHZlNXg1IGV4dGVuZHMgVGVzdEJhc2UgeworICAgIHByaXZhdGUgU2NyaXB0Q19jb252b2x2ZTV4NSBtU2NyaXB0OworICAgIHByaXZhdGUgU2NyaXB0SW50cmluc2ljQ29udm9sdmU1eDUgbUludHJpbnNpYzsKKworICAgIHByaXZhdGUgaW50IG1XaWR0aDsKKyAgICBwcml2YXRlIGludCBtSGVpZ2h0OworICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlSW50cmluc2ljOworCisgICAgcHVibGljIENvbnZvbHZlNXg1KGJvb2xlYW4gdXNlSW50cmluc2ljKSB7CisgICAgICAgIG1Vc2VJbnRyaW5zaWMgPSB1c2VJbnRyaW5zaWM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY3JlYXRlVGVzdChhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyByZXMpIHsKKyAgICAgICAgbVdpZHRoID0gbUluUGl4ZWxzQWxsb2NhdGlvbi5nZXRUeXBlKCkuZ2V0WCgpOworICAgICAgICBtSGVpZ2h0ID0gbUluUGl4ZWxzQWxsb2NhdGlvbi5nZXRUeXBlKCkuZ2V0WSgpOworCisgICAgICAgIGZsb2F0IGZbXSA9IG5ldyBmbG9hdFsyNV07CisgICAgICAgIC8vZlswXSA9IDAuMDEyZjsgZlsxXSA9IDAuMDI1ZjsgZlsyXSA9IDAuMDMxZjsgZlszXSA9IDAuMDI1ZjsgZls0XSA9IDAuMDEyZjsKKyAgICAgICAgLy9mWzVdID0gMC4wMjVmOyBmWzZdID0gMC4wNTdmOyBmWzddID0gMC4wNzVmOyBmWzhdID0gMC4wNTdmOyBmWzldID0gMC4wMjVmOworICAgICAgICAvL2ZbMTBdPSAwLjAzMWY7IGZbMTFdPSAwLjA3NWY7IGZbMTJdPSAwLjA5NWY7IGZbMTNdPSAwLjA3NWY7IGZbMTRdPSAwLjAzMWY7CisgICAgICAgIC8vZlsxNV09IDAuMDI1ZjsgZlsxNl09IDAuMDU3ZjsgZlsxN109IDAuMDc1ZjsgZlsxOF09IDAuMDU3ZjsgZlsxOV09IDAuMDI1ZjsKKyAgICAgICAgLy9mWzIwXT0gMC4wMTJmOyBmWzIxXT0gMC4wMjVmOyBmWzIyXT0gMC4wMzFmOyBmWzIzXT0gMC4wMjVmOyBmWzI0XT0gMC4wMTJmOworCisgICAgICAgIC8vZlswXSA9IDEuZjsgZlsxXSA9IDIuZjsgZlsyXSA9IDAuZjsgZlszXSA9IC0yLmY7IGZbNF0gPSAtMS5mOworICAgICAgICAvL2ZbNV0gPSA0LmY7IGZbNl0gPSA4LmY7IGZbN10gPSAwLmY7IGZbOF0gPSAtOC5mOyBmWzldID0gLTQuZjsKKyAgICAgICAgLy9mWzEwXT0gNi5mOyBmWzExXT0xMi5mOyBmWzEyXT0gMC5mOyBmWzEzXT0tMTIuZjsgZlsxNF09IC02LmY7CisgICAgICAgIC8vZlsxNV09IDQuZjsgZlsxNl09IDguZjsgZlsxN109IDAuZjsgZlsxOF09IC04LmY7IGZbMTldPSAtNC5mOworICAgICAgICAvL2ZbMjBdPSAxLmY7IGZbMjFdPSAyLmY7IGZbMjJdPSAwLmY7IGZbMjNdPSAtMi5mOyBmWzI0XT0gLTEuZjsKKworICAgICAgICBmWzBdID0gLTEuZjsgZlsxXSA9IC0zLmY7IGZbMl0gPSAtNC5mOyBmWzNdID0gLTMuZjsgZls0XSA9IC0xLmY7CisgICAgICAgIGZbNV0gPSAtMy5mOyBmWzZdID0gIDAuZjsgZls3XSA9ICA2LmY7IGZbOF0gPSAgMC5mOyBmWzldID0gLTMuZjsKKyAgICAgICAgZlsxMF09IC00LmY7IGZbMTFdPSAgNi5mOyBmWzEyXT0gMjAuZjsgZlsxM109ICA2LmY7IGZbMTRdPSAtNC5mOworICAgICAgICBmWzE1XT0gLTMuZjsgZlsxNl09ICAwLmY7IGZbMTddPSAgNi5mOyBmWzE4XT0gIDAuZjsgZlsxOV09IC0zLmY7CisgICAgICAgIGZbMjBdPSAtMS5mOyBmWzIxXT0gLTMuZjsgZlsyMl09IC00LmY7IGZbMjNdPSAtMy5mOyBmWzI0XT0gLTEuZjsKKworICAgICAgICBpZiAobVVzZUludHJpbnNpYykgeworICAgICAgICAgICAgbUludHJpbnNpYyA9IFNjcmlwdEludHJpbnNpY0NvbnZvbHZlNXg1LmNyZWF0ZShtUlMsIEVsZW1lbnQuVThfNChtUlMpKTsKKyAgICAgICAgICAgIG1JbnRyaW5zaWMuc2V0Q29lZmZpY2llbnRzKGYpOworICAgICAgICAgICAgbUludHJpbnNpYy5zZXRJbnB1dChtSW5QaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19jb252b2x2ZTV4NShtUlMsIHJlcywgUi5yYXcuY29udm9sdmU1eDUpOworICAgICAgICAgICAgbVNjcmlwdC5zZXRfZ0NvZWZmcyhmKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X2dJbihtSW5QaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X2dXaWR0aChtV2lkdGgpOworICAgICAgICAgICAgbVNjcmlwdC5zZXRfZ0hlaWdodChtSGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7CisgICAgICAgIGlmIChtVXNlSW50cmluc2ljKSB7CisgICAgICAgICAgICBtSW50cmluc2ljLmZvckVhY2gobU91dFBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNjcmlwdC5mb3JFYWNoX3Jvb3QobU91dFBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvQ29weS5qYXZhIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0NvcHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjcxOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0NvcHkuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy5pbWFnZTI7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKKworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52OC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgQ29weSBleHRlbmRzIFRlc3RCYXNlIHsKKyAgICBwcml2YXRlIFNjcmlwdENfY29weSBtU2NyaXB0OworCisgICAgcHVibGljIHZvaWQgY3JlYXRlVGVzdChhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyByZXMpIHsKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX2NvcHkobVJTLCByZXMsIFIucmF3LmNvcHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7CisgICAgICAgIG1TY3JpcHQuZm9yRWFjaF9yb290KG1JblBpeGVsc0FsbG9jYXRpb24sIG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9Dcm9zc1Byb2Nlc3MuamF2YSBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9Dcm9zc1Byb2Nlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njc4N2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0Nyb3NzUHJvY2Vzcy5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLmltYWdlMjsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworCitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY4LnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBDcm9zc1Byb2Nlc3MgZXh0ZW5kcyBUZXN0QmFzZSB7CisgICAgcHJpdmF0ZSBTY3JpcHRJbnRyaW5zaWNMVVQgbUludHJpbnNpYzsKKworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVRlc3QoYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIG1JbnRyaW5zaWMgPSBTY3JpcHRJbnRyaW5zaWNMVVQuY3JlYXRlKG1SUywgRWxlbWVudC5VOF80KG1SUykpOworICAgICAgICBmb3IgKGludCBjdD0wOyBjdCA8IDI1NjsgY3QrKykgeworICAgICAgICAgICAgZmxvYXQgZiA9ICgoZmxvYXQpY3QpIC8gMjU1LmY7CisKKyAgICAgICAgICAgIGZsb2F0IHIgPSBmOworICAgICAgICAgICAgaWYgKHIgPCAwLjVmKSB7CisgICAgICAgICAgICAgICAgciA9IDQuMGYgKiByICogciAqIHI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHIgPSAxLjBmIC0gcjsKKyAgICAgICAgICAgICAgICByID0gMS4wZiAtICg0LjBmICogciAqIHIgKiByKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbnRyaW5zaWMuc2V0UmVkKGN0LCAoaW50KShyICogMjU1LmYgKyAwLjVmKSk7CisKKyAgICAgICAgICAgIGZsb2F0IGcgPSBmOworICAgICAgICAgICAgaWYgKGcgPCAwLjVmKSB7CisgICAgICAgICAgICAgICAgZyA9IDIuMGYgKiBnICogZzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZyA9IDEuMGYgLSBnOworICAgICAgICAgICAgICAgIGcgPSAxLjBmIC0gKDIuMGYgKiBnICogZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSW50cmluc2ljLnNldEdyZWVuKGN0LCAoaW50KShnICogMjU1LmYgKyAwLjVmKSk7CisKKyAgICAgICAgICAgIGZsb2F0IGIgPSBmICogMC41ZiArIDAuMjVmOworICAgICAgICAgICAgbUludHJpbnNpYy5zZXRCbHVlKGN0LCAoaW50KShiICogMjU1LmYgKyAwLjVmKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7CisgICAgICAgIG1JbnRyaW5zaWMuZm9yRWFjaChtSW5QaXhlbHNBbGxvY2F0aW9uLCBtT3V0UGl4ZWxzQWxsb2NhdGlvbik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvRXhwb3N1cmUuamF2YSBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9FeHBvc3VyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjZiNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvRXhwb3N1cmUuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy5pbWFnZTI7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKKworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52OC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIEV4cG9zdXJlIGV4dGVuZHMgVGVzdEJhc2UgeworICAgIHByaXZhdGUgU2NyaXB0Q19leHBvc3VyZSBtU2NyaXB0OworCisgICAgcHVibGljIHZvaWQgY3JlYXRlVGVzdChhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyByZXMpIHsKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX2V4cG9zdXJlKG1SUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKKyAgICAgICAgbVNjcmlwdC5pbnZva2Vfc2V0QnJpZ2h0KDUwLmYpOworICAgICAgICBtU2NyaXB0LmZvckVhY2hfZXhwb3N1cmUobUluUGl4ZWxzQWxsb2NhdGlvbiwgbU91dFBpeGVsc0FsbG9jYXRpb24pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0Zpc2hleWUuamF2YSBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9GaXNoZXllLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiZWI4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9GaXNoZXllLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLmltYWdlMjsKKworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52OC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgRmlzaGV5ZSBleHRlbmRzIFRlc3RCYXNlIHsKKyAgICBwcml2YXRlIFNjcmlwdENfZmlzaGV5ZV9mdWxsIG1TY3JpcHRfZnVsbCA9IG51bGw7CisgICAgcHJpdmF0ZSBTY3JpcHRDX2Zpc2hleWVfcmVsYXhlZCBtU2NyaXB0X3JlbGF4ZWQgPSBudWxsOworICAgIHByaXZhdGUgU2NyaXB0Q19maXNoZXllX2FwcHJveF9mdWxsIG1TY3JpcHRfYXBwcm94X2Z1bGwgPSBudWxsOworICAgIHByaXZhdGUgU2NyaXB0Q19maXNoZXllX2FwcHJveF9yZWxheGVkIG1TY3JpcHRfYXBwcm94X3JlbGF4ZWQgPSBudWxsOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBhcHByb3g7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlbGF4ZWQ7CisgICAgcHJpdmF0ZSBmbG9hdCBjZW50ZXJfeCA9IDAuNWY7CisgICAgcHJpdmF0ZSBmbG9hdCBjZW50ZXJfeSA9IDAuNWY7CisgICAgcHJpdmF0ZSBmbG9hdCBzY2FsZSA9IDAuNWY7CisKKyAgICBwdWJsaWMgRmlzaGV5ZShib29sZWFuIGFwcHJveCwgYm9vbGVhbiByZWxheGVkKSB7CisgICAgICAgIHRoaXMuYXBwcm94ID0gYXBwcm94OworICAgICAgICB0aGlzLnJlbGF4ZWQgPSByZWxheGVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uQmFyMVNldHVwKFNlZWtCYXIgYiwgVGV4dFZpZXcgdCkgeworICAgICAgICB0LnNldFRleHQoIlNjYWxlIik7CisgICAgICAgIGIuc2V0TWF4KDEwMCk7CisgICAgICAgIGIuc2V0UHJvZ3Jlc3MoMjUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gb25CYXIyU2V0dXAoU2Vla0JhciBiLCBUZXh0VmlldyB0KSB7CisgICAgICAgIHQuc2V0VGV4dCgiU2hpZnQgY2VudGVyIFgiKTsKKyAgICAgICAgYi5zZXRNYXgoMTAwKTsKKyAgICAgICAgYi5zZXRQcm9ncmVzcyg1MCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBvbkJhcjNTZXR1cChTZWVrQmFyIGIsIFRleHRWaWV3IHQpIHsKKyAgICAgICAgdC5zZXRUZXh0KCJTaGlmdCBjZW50ZXIgWSIpOworICAgICAgICBiLnNldE1heCgxMDApOworICAgICAgICBiLnNldFByb2dyZXNzKDUwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25CYXIxQ2hhbmdlZChpbnQgcHJvZ3Jlc3MpIHsKKyAgICAgICAgc2NhbGUgPSBwcm9ncmVzcyAvIDUwLjBmOworICAgICAgICBkb19pbml0KCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIG9uQmFyMkNoYW5nZWQoaW50IHByb2dyZXNzKSB7CisgICAgICAgIGNlbnRlcl94ID0gcHJvZ3Jlc3MgLyAxMDAuMGY7CisgICAgICAgIGRvX2luaXQoKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgb25CYXIzQ2hhbmdlZChpbnQgcHJvZ3Jlc3MpIHsKKyAgICAgICAgY2VudGVyX3kgPSBwcm9ncmVzcyAvIDEwMC4wZjsKKyAgICAgICAgZG9faW5pdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb19pbml0KCkgeworICAgICAgICBpZiAoYXBwcm94KSB7CisgICAgICAgICAgICBpZiAocmVsYXhlZCkKKyAgICAgICAgICAgICAgICBtU2NyaXB0X2FwcHJveF9yZWxheGVkLmludm9rZV9pbml0X2ZpbHRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24uZ2V0VHlwZSgpLmdldFgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24uZ2V0VHlwZSgpLmdldFkoKSwgY2VudGVyX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJfeSwgc2NhbGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1TY3JpcHRfYXBwcm94X2Z1bGwuaW52b2tlX2luaXRfZmlsdGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbi5nZXRUeXBlKCkuZ2V0WCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbi5nZXRUeXBlKCkuZ2V0WSgpLCBjZW50ZXJfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcl95LCBzY2FsZSk7CisgICAgICAgIH0gZWxzZSBpZiAocmVsYXhlZCkKKyAgICAgICAgICAgIG1TY3JpcHRfcmVsYXhlZC5pbnZva2VfaW5pdF9maWx0ZXIoCisgICAgICAgICAgICAgICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24uZ2V0VHlwZSgpLmdldFgoKSwKKyAgICAgICAgICAgICAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbi5nZXRUeXBlKCkuZ2V0WSgpLCBjZW50ZXJfeCwgY2VudGVyX3ksCisgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbVNjcmlwdF9mdWxsLmludm9rZV9pbml0X2ZpbHRlcigKKyAgICAgICAgICAgICAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbi5nZXRUeXBlKCkuZ2V0WCgpLAorICAgICAgICAgICAgICAgICAgICBtSW5QaXhlbHNBbGxvY2F0aW9uLmdldFR5cGUoKS5nZXRZKCksIGNlbnRlcl94LCBjZW50ZXJfeSwKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVRlc3QoYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIGlmIChhcHByb3gpIHsKKyAgICAgICAgICAgIGlmIChyZWxheGVkKSB7CisgICAgICAgICAgICAgICAgbVNjcmlwdF9hcHByb3hfcmVsYXhlZCA9IG5ldyBTY3JpcHRDX2Zpc2hleWVfYXBwcm94X3JlbGF4ZWQobVJTLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzLCBSLnJhdy5maXNoZXllX2FwcHJveF9yZWxheGVkKTsKKyAgICAgICAgICAgICAgICBtU2NyaXB0X2FwcHJveF9yZWxheGVkLnNldF9pbl9hbGxvYyhtSW5QaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICBtU2NyaXB0X2FwcHJveF9yZWxheGVkLnNldF9zYW1wbGVyKFNhbXBsZXIuQ0xBTVBfTElORUFSKG1SUykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU2NyaXB0X2FwcHJveF9mdWxsID0gbmV3IFNjcmlwdENfZmlzaGV5ZV9hcHByb3hfZnVsbChtUlMsIHJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFIucmF3LmZpc2hleWVfYXBwcm94X2Z1bGwpOworICAgICAgICAgICAgICAgIG1TY3JpcHRfYXBwcm94X2Z1bGwuc2V0X2luX2FsbG9jKG1JblBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICAgICAgICAgIG1TY3JpcHRfYXBwcm94X2Z1bGwuc2V0X3NhbXBsZXIoU2FtcGxlci5DTEFNUF9MSU5FQVIobVJTKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmVsYXhlZCkgeworICAgICAgICAgICAgbVNjcmlwdF9yZWxheGVkID0gbmV3IFNjcmlwdENfZmlzaGV5ZV9yZWxheGVkKG1SUywgcmVzLAorICAgICAgICAgICAgICAgICAgICBSLnJhdy5maXNoZXllX3JlbGF4ZWQpOworICAgICAgICAgICAgbVNjcmlwdF9yZWxheGVkLnNldF9pbl9hbGxvYyhtSW5QaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgICAgIG1TY3JpcHRfcmVsYXhlZC5zZXRfc2FtcGxlcihTYW1wbGVyLkNMQU1QX0xJTkVBUihtUlMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TY3JpcHRfZnVsbCA9IG5ldyBTY3JpcHRDX2Zpc2hleWVfZnVsbChtUlMsIHJlcywKKyAgICAgICAgICAgICAgICAgICAgUi5yYXcuZmlzaGV5ZV9mdWxsKTsKKyAgICAgICAgICAgIG1TY3JpcHRfZnVsbC5zZXRfaW5fYWxsb2MobUluUGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgICAgICBtU2NyaXB0X2Z1bGwuc2V0X3NhbXBsZXIoU2FtcGxlci5DTEFNUF9MSU5FQVIobVJTKSk7CisgICAgICAgIH0KKyAgICAgICAgZG9faW5pdCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7CisgICAgICAgIGlmIChhcHByb3gpIHsKKyAgICAgICAgICAgIGlmIChyZWxheGVkKQorICAgICAgICAgICAgICAgIG1TY3JpcHRfYXBwcm94X3JlbGF4ZWQuZm9yRWFjaF9yb290KG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtU2NyaXB0X2FwcHJveF9mdWxsLmZvckVhY2hfcm9vdChtT3V0UGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgIH0gZWxzZSBpZiAocmVsYXhlZCkKKyAgICAgICAgICAgIG1TY3JpcHRfcmVsYXhlZC5mb3JFYWNoX3Jvb3QobU91dFBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtU2NyaXB0X2Z1bGwuZm9yRWFjaF9yb290KG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0dyYWluLmphdmEgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvR3JhaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQzYzMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0dyYWluLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMuaW1hZ2UyOworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CisKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjgucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgR3JhaW4gZXh0ZW5kcyBUZXN0QmFzZSB7CisgICAgcHJpdmF0ZSBTY3JpcHRDX2dyYWluIG1TY3JpcHQ7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1Ob2lzZTsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbU5vaXNlMjsKKworCisgICAgcHVibGljIGJvb2xlYW4gb25CYXIxU2V0dXAoU2Vla0JhciBiLCBUZXh0VmlldyB0KSB7CisgICAgICAgIHQuc2V0VGV4dCgiU3RyZW5ndGgiKTsKKyAgICAgICAgYi5zZXRQcm9ncmVzcyg1MCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQmFyMUNoYW5nZWQoaW50IHByb2dyZXNzKSB7CisgICAgICAgIGZsb2F0IHMgPSBwcm9ncmVzcyAvIDEwMC4wZjsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ05vaXNlU3RyZW5ndGgocyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZmluZEhpZ2hCaXQoaW50IHYpIHsKKyAgICAgICAgaW50IGJpdCA9IDA7CisgICAgICAgIHdoaWxlICh2ID4gMSkgeworICAgICAgICAgICAgYml0Kys7CisgICAgICAgICAgICB2ID4+PSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiaXQ7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVUZXN0KGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIHJlcykgeworICAgICAgICBpbnQgd2lkdGggPSBtSW5QaXhlbHNBbGxvY2F0aW9uLmdldFR5cGUoKS5nZXRYKCk7CisgICAgICAgIGludCBoZWlnaHQgPSBtSW5QaXhlbHNBbGxvY2F0aW9uLmdldFR5cGUoKS5nZXRZKCk7CisKKyAgICAgICAgaW50IG5vaXNlVyA9IGZpbmRIaWdoQml0KHdpZHRoKTsKKyAgICAgICAgaW50IG5vaXNlSCA9IGZpbmRIaWdoQml0KGhlaWdodCk7CisgICAgICAgIGlmIChub2lzZVcgPiA5KSB7CisgICAgICAgICAgICBub2lzZVcgPSA5OworICAgICAgICB9CisgICAgICAgIGlmIChub2lzZUggPiA5KSB7CisgICAgICAgICAgICBub2lzZUggPSA5OworICAgICAgICB9CisgICAgICAgIG5vaXNlVyA9IDEgPDwgbm9pc2VXOworICAgICAgICBub2lzZUggPSAxIDw8IG5vaXNlSDsKKworICAgICAgICBUeXBlLkJ1aWxkZXIgdGIgPSBuZXcgVHlwZS5CdWlsZGVyKG1SUywgRWxlbWVudC5VOChtUlMpKTsKKyAgICAgICAgdGIuc2V0WChub2lzZVcpOworICAgICAgICB0Yi5zZXRZKG5vaXNlSCk7CisgICAgICAgIG1Ob2lzZSA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCB0Yi5jcmVhdGUoKSk7CisgICAgICAgIG1Ob2lzZTIgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgdGIuY3JlYXRlKCkpOworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19ncmFpbihtUlMsIHJlcywgUi5yYXcuZ3JhaW4pOworICAgICAgICBtU2NyaXB0LnNldF9nV01hc2sobm9pc2VXIC0gMSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dITWFzayhub2lzZUggLSAxKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ05vaXNlU3RyZW5ndGgoMC41Zik7CisgICAgICAgIG1TY3JpcHQuc2V0X2dCbGVuZFNvdXJjZShtTm9pc2UpOworICAgICAgICBtU2NyaXB0LnNldF9nTm9pc2UobU5vaXNlMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKKyAgICAgICAgbVNjcmlwdC5mb3JFYWNoX2dlblJhbmQobU5vaXNlKTsKKyAgICAgICAgbVNjcmlwdC5mb3JFYWNoX2JsZW5kOShtTm9pc2UyKTsKKyAgICAgICAgbVNjcmlwdC5mb3JFYWNoX3Jvb3QobUluUGl4ZWxzQWxsb2NhdGlvbiwgbU91dFBpeGVsc0FsbG9jYXRpb24pOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvR3JleXNjYWxlLmphdmEgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvR3JleXNjYWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxNmUyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9HcmV5c2NhbGUuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy5pbWFnZTI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgR3JleXNjYWxlIGV4dGVuZHMgVGVzdEJhc2UgeworICAgIHByaXZhdGUgU2NyaXB0Q19ncmV5c2NhbGUgbVNjcmlwdDsKKworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVRlc3QoYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19ncmV5c2NhbGUobVJTLCByZXMsIFIucmF3LmdyZXlzY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKKyAgICAgICAgbVNjcmlwdC5mb3JFYWNoX3Jvb3QobUluUGl4ZWxzQWxsb2NhdGlvbiwgbU91dFBpeGVsc0FsbG9jYXRpb24pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0dyb3VwVGVzdC5qYXZhIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0dyb3VwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Y2VlYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvR3JvdXBUZXN0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMuaW1hZ2UyOworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CisKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjgucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIEdyb3VwVGVzdCBleHRlbmRzIFRlc3RCYXNlIHsKKyAgICBwcml2YXRlIFNjcmlwdEludHJpbnNpY0NvbnZvbHZlM3gzIG1Db252b2x2ZTsKKyAgICBwcml2YXRlIFNjcmlwdEludHJpbnNpY0NvbG9yTWF0cml4IG1NYXRyaXg7CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMTsKKyAgICBwcml2YXRlIFNjcmlwdEdyb3VwIG1Hcm91cDsKKworICAgIHByaXZhdGUgaW50IG1XaWR0aDsKKyAgICBwcml2YXRlIGludCBtSGVpZ2h0OworICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlTmF0aXZlOworCisKKyAgICBwdWJsaWMgR3JvdXBUZXN0KGJvb2xlYW4gdXNlTmF0aXZlKSB7CisgICAgICAgIG1Vc2VOYXRpdmUgPSB1c2VOYXRpdmU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY3JlYXRlVGVzdChhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyByZXMpIHsKKyAgICAgICAgbVdpZHRoID0gbUluUGl4ZWxzQWxsb2NhdGlvbi5nZXRUeXBlKCkuZ2V0WCgpOworICAgICAgICBtSGVpZ2h0ID0gbUluUGl4ZWxzQWxsb2NhdGlvbi5nZXRUeXBlKCkuZ2V0WSgpOworCisgICAgICAgIG1Db252b2x2ZSA9IFNjcmlwdEludHJpbnNpY0NvbnZvbHZlM3gzLmNyZWF0ZShtUlMsIEVsZW1lbnQuVThfNChtUlMpKTsKKyAgICAgICAgbU1hdHJpeCA9IFNjcmlwdEludHJpbnNpY0NvbG9yTWF0cml4LmNyZWF0ZShtUlMsIEVsZW1lbnQuVThfNChtUlMpKTsKKworICAgICAgICBmbG9hdCBmW10gPSBuZXcgZmxvYXRbOV07CisgICAgICAgIGZbMF0gPSAgMC5mOyAgICBmWzFdID0gLTEuZjsgICAgZlsyXSA9ICAwLmY7CisgICAgICAgIGZbM10gPSAtMS5mOyAgICBmWzRdID0gIDUuZjsgICAgZls1XSA9IC0xLmY7CisgICAgICAgIGZbNl0gPSAgMC5mOyAgICBmWzddID0gLTEuZjsgICAgZls4XSA9ICAwLmY7CisgICAgICAgIG1Db252b2x2ZS5zZXRDb2VmZmljaWVudHMoZik7CisKKyAgICAgICAgTWF0cml4NGYgbSA9IG5ldyBNYXRyaXg0ZigpOworICAgICAgICBtLnNldCgxLCAwLCAwLjJmKTsKKyAgICAgICAgbS5zZXQoMSwgMSwgMC45Zik7CisgICAgICAgIG0uc2V0KDEsIDIsIDAuMmYpOworICAgICAgICBtTWF0cml4LnNldENvbG9yTWF0cml4KG0pOworCisgICAgICAgIFR5cGUuQnVpbGRlciB0YiA9IG5ldyBUeXBlLkJ1aWxkZXIobVJTLCBFbGVtZW50LlU4XzQobVJTKSk7CisgICAgICAgIHRiLnNldFgobVdpZHRoKTsKKyAgICAgICAgdGIuc2V0WShtSGVpZ2h0KTsKKyAgICAgICAgVHlwZSBjb25uZWN0ID0gdGIuY3JlYXRlKCk7CisKKyAgICAgICAgaWYgKG1Vc2VOYXRpdmUpIHsKKyAgICAgICAgICAgIFNjcmlwdEdyb3VwLkJ1aWxkZXIgYiA9IG5ldyBTY3JpcHRHcm91cC5CdWlsZGVyKG1SUyk7CisgICAgICAgICAgICBiLmFkZEtlcm5lbChtQ29udm9sdmUuZ2V0S2VybmVsSUQoKSk7CisgICAgICAgICAgICBiLmFkZEtlcm5lbChtTWF0cml4LmdldEtlcm5lbElEKCkpOworICAgICAgICAgICAgYi5hZGRDb25uZWN0aW9uKGNvbm5lY3QsIG1Db252b2x2ZS5nZXRLZXJuZWxJRCgpLCBtTWF0cml4LmdldEtlcm5lbElEKCkpOworICAgICAgICAgICAgbUdyb3VwID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjEgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgY29ubmVjdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW5UZXN0KCkgeworICAgICAgICBtQ29udm9sdmUuc2V0SW5wdXQobUluUGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgIGlmIChtVXNlTmF0aXZlKSB7CisgICAgICAgICAgICBtR3JvdXAuc2V0T3V0cHV0KG1NYXRyaXguZ2V0S2VybmVsSUQoKSwgbU91dFBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICAgICAgbUdyb3VwLmV4ZWN1dGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Db252b2x2ZS5mb3JFYWNoKG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjEpOworICAgICAgICAgICAgbU1hdHJpeC5mb3JFYWNoKG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjEsIG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5Mi5qYXZhIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMGUyZGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkyLmphdmEKQEAgLTAsMCArMSw0NzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLmltYWdlMjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjgucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5MiBleHRlbmRzIEFjdGl2aXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFRBRyA9ICJJbWciOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0ZJTEUgPSAiaW1hZ2VfcHJvY2Vzc2luZ19yZXN1bHQuY3N2IjsKKworICAgIFJlbmRlclNjcmlwdCBtUlM7CisgICAgQWxsb2NhdGlvbiBtSW5QaXhlbHNBbGxvY2F0aW9uOworICAgIEFsbG9jYXRpb24gbUluUGl4ZWxzQWxsb2NhdGlvbjI7CisgICAgQWxsb2NhdGlvbiBtT3V0UGl4ZWxzQWxsb2NhdGlvbjsKKworICAgIC8qKgorICAgICAqIERlZmluZSBlbnVtIHR5cGUgZm9yIHRlc3QgbmFtZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgZW51bSBUZXN0TmFtZSB7CisgICAgICAgIC8vIHRvdGFsbHkgdGhlcmUgYXJlIDM4IHRlc3QgY2FzZXMKKyAgICAgICAgTEVWRUxTX1ZFQzNfUkVMQVhFRCAoIkxldmVscyBWZWMzIFJlbGF4ZWQiKSwKKyAgICAgICAgTEVWRUxTX1ZFQzRfUkVMQVhFRCAoIkxldmVscyBWZWM0IFJlbGF4ZWQiKSwKKyAgICAgICAgTEVWRUxTX1ZFQzNfRlVMTCAoIkxldmVscyBWZWMzIEZ1bGwiKSwKKyAgICAgICAgTEVWRUxTX1ZFQzRfRlVMTCAoIkxldmVscyBWZWM0IEZ1bGwiKSwKKyAgICAgICAgQkxVUl9SQURJVVNfMjUgKCJCbHVyIHJhZGl1cyAyNSIpLAorICAgICAgICBJTlRSSU5TSUNfQkxVRV9SQURJVVNfMjUgKCJJbnRyaW5zaWMgQmx1ciByYWRpdXMgMjUiKSwKKyAgICAgICAgR1JFWVNDQUxFICgiR3JleXNjYWxlIiksCisgICAgICAgIEdSQUlOICgiR3JhaW4iKSwKKyAgICAgICAgRklTSEVZRV9GVUxMICgiRmlzaGV5ZSBGdWxsIiksCisgICAgICAgIEZJU0hFWUVfUkVMQVhFRCAoIkZpc2hleWUgUmVsYXhlZCIpLAorICAgICAgICBGSVNIRVlFX0FQUFJPWElNQVRFX0ZVTEwgKCJGaXNoZXllIEFwcHJveGltYXRlIEZ1bGwiKSwKKyAgICAgICAgRklTSEVZRV9BUFBST1hJTUFURV9SRUxBWEVEICgiRmlzaGV5ZSBBcHByb3hpbWF0ZSBSZWxheGVkIiksCisgICAgICAgIFZJR05FVFRFX0ZVTEwgKCJWaWduZXR0ZSBGdWxsIiksCisgICAgICAgIFZJR05FVFRFX1JFTEFYRUQgKCJWaWduZXR0ZSBSZWxheGVkIiksCisgICAgICAgIFZJR05FVFRFX0FQUFJPWElNQVRFX0ZVTEwgKCJWaWduZXR0ZSBBcHByb3hpbWF0ZSBGdWxsIiksCisgICAgICAgIFZJR05FVFRFX0FQUFJPWElNQVRFX1JFTEFYRUQgKCJWaWduZXR0ZSBBcHByb3hpbWF0ZSBSZWxheGVkIiksCisgICAgICAgIEdST1VQX1RFU1RfRU1VTEFURUQgKCJHcm91cCBUZXN0IChlbXVsYXRlZCkiKSwKKyAgICAgICAgR1JPVVBfVEVTVF9OQVRJVkUgKCJHcm91cCBUZXN0IChuYXRpdmUpIiksCisgICAgICAgIENPTlZPTFZFXzNYMyAoIkNvbnZvbHZlIDN4MyIpLAorICAgICAgICBJTlRSSU5TSUNTX0NPTlZPTFZFXzNYMyAoIkludHJpbnNpY3MgQ29udm9sdmUgM3gzIiksCisgICAgICAgIENPTE9SX01BVFJJWCAoIkNvbG9yTWF0cml4IiksCisgICAgICAgIElOVFJJTlNJQ1NfQ09MT1JfTUFUUklYICgiSW50cmluc2ljcyBDb2xvck1hdHJpeCIpLAorICAgICAgICBJTlRSSU5TSUNTX0NPTE9SX01BVFJJWF9HUkVZICgiSW50cmluc2ljcyBDb2xvck1hdHJpeCBHcmV5IiksCisgICAgICAgIENPUFkgKCJDb3B5IiksCisgICAgICAgIENST1NTX1BST0NFU1NfVVNJTkdfTFVUICgiQ3Jvc3NQcm9jZXNzICh1c2luZyBMVVQpIiksCisgICAgICAgIENPTlZPTFZFXzVYNSAoIkNvbnZvbHZlIDV4NSIpLAorICAgICAgICBJTlRSSU5TSUNTX0NPTlZPTFZFXzVYNSAoIkludHJpbnNpY3MgQ29udm9sdmUgNXg1IiksCisgICAgICAgIE1BTkRFTEJST1QgKCJNYW5kZWxicm90IiksCisgICAgICAgIElOVFJJTlNJQ1NfQkxFTkQgKCJJbnRyaW5zaWNzIEJsZW5kIiksCisgICAgICAgIElOVFJJTlNJQ1NfQkxVUl8yNUcgKCJJbnRyaW5zaWNzIEJsdXIgMjUgdWNoYXIiKSwKKyAgICAgICAgVklCUkFOQ0UgKCJWaWJyYW5jZSIpLAorICAgICAgICBCV19GSUxURVIgKCJCVyBGaWx0ZXIiKSwKKyAgICAgICAgU0hBRE9XUyAoIlNoYWRvd3MiKSwKKyAgICAgICAgQ09OVFJBU1QgKCJDb250cmFzdCIpLAorICAgICAgICBFWFBPU1VSRSAoIkV4cG9zdXJlIiksCisgICAgICAgIFdISVRFX0JBTEFOQ0UgKCJXaGl0ZSBCYWxhbmNlIiksCisgICAgICAgIENPTE9SX0NVQkUgKCJDb2xvciBDdWJlIiksCisgICAgICAgIENPTE9SX0NVQkVfM0RfSU5UUklOU0lDICgiQ29sb3IgQ3ViZSAoM0QgTFVUIGludHJpbnNpYykiKTsKKworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgcHJpdmF0ZSBUZXN0TmFtZShTdHJpbmcgcykgeworICAgICAgICAgICAgbmFtZSA9IHM7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm4gcXVvdGVkIHN0cmluZyBhcyBkaXNwbGF5ZWQgdGVzdCBuYW1lCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEJpdG1hcCBtQml0bWFwSW47CisgICAgQml0bWFwIG1CaXRtYXBJbjI7CisgICAgQml0bWFwIG1CaXRtYXBPdXQ7CisKKyAgICBwcml2YXRlIFNwaW5uZXIgbVNwaW5uZXI7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1CYXIxOworICAgIHByaXZhdGUgU2Vla0JhciBtQmFyMjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbUJhcjM7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1CYXI0OworICAgIHByaXZhdGUgU2Vla0JhciBtQmFyNTsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UZXh0MTsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UZXh0MjsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UZXh0MzsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UZXh0NDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UZXh0NTsKKworICAgIHByaXZhdGUgZmxvYXQgbVNhdHVyYXRpb24gPSAxLjBmOworCisgICAgcHJpdmF0ZSBUZXh0VmlldyBtQmVuY2htYXJrUmVzdWx0OworICAgIHByaXZhdGUgU3Bpbm5lciBtVGVzdFNwaW5uZXI7CisKKyAgICBwcml2YXRlIFN1cmZhY2VWaWV3IG1TdXJmYWNlVmlldzsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtRGlzcGxheVZpZXc7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbURvaW5nQmVuY2htYXJrOworCisgICAgcHJpdmF0ZSBUZXN0QmFzZSBtVGVzdDsKKyAgICBwcml2YXRlIGludCBtUnVuQ291bnQ7CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVEaXNwbGF5KCkgeworICAgICAgICAgICAgbVRlc3QudXBkYXRlQml0bWFwKG1CaXRtYXBPdXQpOworICAgICAgICAgICAgbURpc3BsYXlWaWV3LmludmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgeworICAgICAgICBpZiAoZnJvbVVzZXIpIHsKKworICAgICAgICAgICAgaWYgKHNlZWtCYXIgPT0gbUJhcjEpIHsKKyAgICAgICAgICAgICAgICBtVGVzdC5vbkJhcjFDaGFuZ2VkKHByb2dyZXNzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vla0JhciA9PSBtQmFyMikgeworICAgICAgICAgICAgICAgIG1UZXN0Lm9uQmFyMkNoYW5nZWQocHJvZ3Jlc3MpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzZWVrQmFyID09IG1CYXIzKSB7CisgICAgICAgICAgICAgICAgbVRlc3Qub25CYXIzQ2hhbmdlZChwcm9ncmVzcyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNlZWtCYXIgPT0gbUJhcjQpIHsKKyAgICAgICAgICAgICAgICBtVGVzdC5vbkJhcjRDaGFuZ2VkKHByb2dyZXNzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vla0JhciA9PSBtQmFyNSkgeworICAgICAgICAgICAgICAgIG1UZXN0Lm9uQmFyNUNoYW5nZWQocHJvZ3Jlc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtVGVzdC5ydW5UZXN0KCk7CisgICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgIH0KKworICAgIHZvaWQgc2V0dXBCYXJzKCkgeworICAgICAgICBtU3Bpbm5lci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIG1UZXN0Lm9uU3Bpbm5lcjFTZXR1cChtU3Bpbm5lcik7CisKKyAgICAgICAgbUJhcjEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICBtVGV4dDEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICBtVGVzdC5vbkJhcjFTZXR1cChtQmFyMSwgbVRleHQxKTsKKworICAgICAgICBtQmFyMi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIG1UZXh0Mi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIG1UZXN0Lm9uQmFyMlNldHVwKG1CYXIyLCBtVGV4dDIpOworCisgICAgICAgIG1CYXIzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgbVRleHQzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgbVRlc3Qub25CYXIzU2V0dXAobUJhcjMsIG1UZXh0Myk7CisKKyAgICAgICAgbUJhcjQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICBtVGV4dDQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICBtVGVzdC5vbkJhcjRTZXR1cChtQmFyNCwgbVRleHQ0KTsKKworICAgICAgICBtQmFyNS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIG1UZXh0NS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIG1UZXN0Lm9uQmFyNVNldHVwKG1CYXI1LCBtVGV4dDUpOworICAgIH0KKworCisgICAgdm9pZCBjaGFuZ2VUZXN0KFRlc3ROYW1lIHRlc3ROYW1lKSB7CisgICAgICAgIGlmIChtVGVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGVzdC5kZXN0cm95KCk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKHRlc3ROYW1lKSB7CisgICAgICAgIGNhc2UgTEVWRUxTX1ZFQzNfUkVMQVhFRDoKKyAgICAgICAgICAgIG1UZXN0ID0gbmV3IExldmVsc1Y0KGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMRVZFTFNfVkVDNF9SRUxBWEVEOgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgTGV2ZWxzVjQoZmFsc2UsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTEVWRUxTX1ZFQzNfRlVMTDoKKyAgICAgICAgICAgIG1UZXN0ID0gbmV3IExldmVsc1Y0KHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExFVkVMU19WRUM0X0ZVTEw6CisgICAgICAgICAgICBtVGVzdCA9IG5ldyBMZXZlbHNWNCh0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJMVVJfUkFESVVTXzI1OgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgQmx1cjI1KGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOVFJJTlNJQ19CTFVFX1JBRElVU18yNToKKyAgICAgICAgICAgIG1UZXN0ID0gbmV3IEJsdXIyNSh0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdSRVlTQ0FMRToKKyAgICAgICAgICAgIG1UZXN0ID0gbmV3IEdyZXlzY2FsZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1JBSU46CisgICAgICAgICAgICBtVGVzdCA9IG5ldyBHcmFpbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRklTSEVZRV9GVUxMOgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgRmlzaGV5ZShmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRklTSEVZRV9SRUxBWEVEOgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgRmlzaGV5ZShmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGSVNIRVlFX0FQUFJPWElNQVRFX0ZVTEw6CisgICAgICAgICAgICBtVGVzdCA9IG5ldyBGaXNoZXllKHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZJU0hFWUVfQVBQUk9YSU1BVEVfUkVMQVhFRDoKKyAgICAgICAgICAgIG1UZXN0ID0gbmV3IEZpc2hleWUodHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWSUdORVRURV9GVUxMOgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgVmlnbmV0dGUoZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZJR05FVFRFX1JFTEFYRUQ6CisgICAgICAgICAgICBtVGVzdCA9IG5ldyBWaWduZXR0ZShmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWSUdORVRURV9BUFBST1hJTUFURV9GVUxMOgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgVmlnbmV0dGUodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVklHTkVUVEVfQVBQUk9YSU1BVEVfUkVMQVhFRDoKKyAgICAgICAgICAgIG1UZXN0ID0gbmV3IFZpZ25ldHRlKHRydWUsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1JPVVBfVEVTVF9FTVVMQVRFRDoKKyAgICAgICAgICAgIG1UZXN0ID0gbmV3IEdyb3VwVGVzdChmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHUk9VUF9URVNUX05BVElWRToKKyAgICAgICAgICAgIG1UZXN0ID0gbmV3IEdyb3VwVGVzdCh0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENPTlZPTFZFXzNYMzoKKyAgICAgICAgICAgIG1UZXN0ID0gbmV3IENvbnZvbHZlM3gzKGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOVFJJTlNJQ1NfQ09OVk9MVkVfM1gzOgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgQ29udm9sdmUzeDModHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDT0xPUl9NQVRSSVg6CisgICAgICAgICAgICBtVGVzdCA9IG5ldyBDb2xvck1hdHJpeChmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5UUklOU0lDU19DT0xPUl9NQVRSSVg6CisgICAgICAgICAgICBtVGVzdCA9IG5ldyBDb2xvck1hdHJpeCh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlRSSU5TSUNTX0NPTE9SX01BVFJJWF9HUkVZOgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgQ29sb3JNYXRyaXgodHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDT1BZOgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgQ29weSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1JPU1NfUFJPQ0VTU19VU0lOR19MVVQ6CisgICAgICAgICAgICBtVGVzdCA9IG5ldyBDcm9zc1Byb2Nlc3MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENPTlZPTFZFXzVYNToKKyAgICAgICAgICAgIG1UZXN0ID0gbmV3IENvbnZvbHZlNXg1KGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOVFJJTlNJQ1NfQ09OVk9MVkVfNVg1OgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgQ29udm9sdmU1eDUodHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQU5ERUxCUk9UOgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgTWFuZGVsYnJvdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5UUklOU0lDU19CTEVORDoKKyAgICAgICAgICAgIG1UZXN0ID0gbmV3IEJsZW5kKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlRSSU5TSUNTX0JMVVJfMjVHOgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgQmx1cjI1RygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVklCUkFOQ0U6CisgICAgICAgICAgICBtVGVzdCA9IG5ldyBWaWJyYW5jZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQldfRklMVEVSOgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgQldGaWx0ZXIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNIQURPV1M6CisgICAgICAgICAgICBtVGVzdCA9IG5ldyBTaGFkb3dzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDT05UUkFTVDoKKyAgICAgICAgICAgIG1UZXN0ID0gbmV3IENvbnRyYXN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFWFBPU1VSRToKKyAgICAgICAgICAgIG1UZXN0ID0gbmV3IEV4cG9zdXJlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXSElURV9CQUxBTkNFOgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgV2hpdGVCYWxhbmNlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDT0xPUl9DVUJFOgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgQ29sb3JDdWJlKGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENPTE9SX0NVQkVfM0RfSU5UUklOU0lDOgorICAgICAgICAgICAgbVRlc3QgPSBuZXcgQ29sb3JDdWJlKHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtVGVzdC5jcmVhdGVCYXNlVGVzdCh0aGlzLCBtQml0bWFwSW4sIG1CaXRtYXBJbjIsIG1CaXRtYXBPdXQpOworICAgICAgICBzZXR1cEJhcnMoKTsKKworICAgICAgICBtVGVzdC5ydW5UZXN0KCk7CisgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKKyAgICAgICAgbUJlbmNobWFya1Jlc3VsdC5zZXRUZXh0KCJSZXN1bHQ6IG5vdCBydW4iKTsKKyAgICB9CisKKyAgICB2b2lkIHNldHVwVGVzdHMoKSB7CisgICAgICAgIG1UZXN0U3Bpbm5lci5zZXRBZGFwdGVyKG5ldyBBcnJheUFkYXB0ZXI8VGVzdE5hbWU+KAorICAgICAgICAgICAgdGhpcywgUi5sYXlvdXQuc3Bpbm5lcl9sYXlvdXQsIFRlc3ROYW1lLnZhbHVlcygpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1UZXN0U3Bpbm5lckxpc3RlbmVyID0KKyAgICAgICAgICAgIG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zLCBsb25nIGlkKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZVRlc3QoVGVzdE5hbWUudmFsdWVzKClbcG9zXSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXcgcGFyZW50KSB7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5tYWluKTsKKworICAgICAgICBtQml0bWFwSW4gPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuaW1nMTYwMHgxMDY3KTsKKyAgICAgICAgbUJpdG1hcEluMiA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5pbWcxNjAweDEwNjdiKTsKKyAgICAgICAgbUJpdG1hcE91dCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAobUJpdG1hcEluLmdldFdpZHRoKCksIG1CaXRtYXBJbi5nZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpdG1hcEluLmdldENvbmZpZygpKTsKKworICAgICAgICBtU3VyZmFjZVZpZXcgPSAoU3VyZmFjZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN1cmZhY2UpOworCisgICAgICAgIG1EaXNwbGF5VmlldyA9IChJbWFnZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRpc3BsYXkpOworICAgICAgICBtRGlzcGxheVZpZXcuc2V0SW1hZ2VCaXRtYXAobUJpdG1hcE91dCk7CisKKyAgICAgICAgbVNwaW5uZXIgPSAoU3Bpbm5lcikgZmluZFZpZXdCeUlkKFIuaWQuc3Bpbm5lcjEpOworCisgICAgICAgIG1CYXIxID0gKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnNsaWRlcjEpOworICAgICAgICBtQmFyMiA9IChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC5zbGlkZXIyKTsKKyAgICAgICAgbUJhcjMgPSAoU2Vla0JhcikgZmluZFZpZXdCeUlkKFIuaWQuc2xpZGVyMyk7CisgICAgICAgIG1CYXI0ID0gKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnNsaWRlcjQpOworICAgICAgICBtQmFyNSA9IChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC5zbGlkZXI1KTsKKworICAgICAgICBtQmFyMS5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUJhcjIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1CYXIzLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtQmFyNC5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUJhcjUuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgbVRleHQxID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zbGlkZXIxVGV4dCk7CisgICAgICAgIG1UZXh0MiA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc2xpZGVyMlRleHQpOworICAgICAgICBtVGV4dDMgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnNsaWRlcjNUZXh0KTsKKyAgICAgICAgbVRleHQ0ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zbGlkZXI0VGV4dCk7CisgICAgICAgIG1UZXh0NSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc2xpZGVyNVRleHQpOworCisgICAgICAgIG1UZXN0U3Bpbm5lciA9IChTcGlubmVyKSBmaW5kVmlld0J5SWQoUi5pZC5maWx0ZXJzZWxlY3Rpb24pOworICAgICAgICBtVGVzdFNwaW5uZXIuc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtVGVzdFNwaW5uZXJMaXN0ZW5lcik7CisKKyAgICAgICAgbUJlbmNobWFya1Jlc3VsdCA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuYmVuY2htYXJrVGV4dCk7CisgICAgICAgIG1CZW5jaG1hcmtSZXN1bHQuc2V0VGV4dCgiUmVzdWx0OiBub3QgcnVuIik7CisKKworICAgICAgICBtUlMgPSBSZW5kZXJTY3JpcHQuY3JlYXRlKHRoaXMpOworICAgICAgICBtSW5QaXhlbHNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwKG1SUywgbUJpdG1hcEluKTsKKyAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbjIgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXAobVJTLCBtQml0bWFwSW4yKTsKKyAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXAobVJTLCBtQml0bWFwT3V0KTsKKworCisgICAgICAgIHNldHVwVGVzdHMoKTsKKyAgICAgICAgY2hhbmdlVGVzdChUZXN0TmFtZS5MRVZFTFNfVkVDM19SRUxBWEVEKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgQml0bWFwIGxvYWRCaXRtYXAoaW50IHJlc291cmNlKSB7CisgICAgICAgIGZpbmFsIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOworICAgICAgICBvcHRpb25zLmluUHJlZmVycmVkQ29uZmlnID0gQml0bWFwLkNvbmZpZy5BUkdCXzg4ODg7CisgICAgICAgIHJldHVybiBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGdldFJlc291cmNlcygpLCByZXNvdXJjZSwgb3B0aW9ucyk7CisgICAgfQorCisgICAgLy8gYnV0dG9uIGhvb2sKKyAgICBwdWJsaWMgdm9pZCBiZW5jaG1hcmsoVmlldyB2KSB7CisgICAgICAgIGZsb2F0IHQgPSBnZXRCZW5jaG1hcmsoKTsKKyAgICAgICAgLy9sb25nIGphdmFUaW1lID0gamF2YUZpbHRlcigpOworICAgICAgICAvL21CZW5jaG1hcmtSZXN1bHQuc2V0VGV4dCgiUlM6ICIgKyB0ICsgIiBtcyAgSmF2YTogIiArIGphdmFUaW1lICsgIiBtcyIpOworICAgICAgICBtQmVuY2htYXJrUmVzdWx0LnNldFRleHQoIlJlc3VsdDogIiArIHQgKyAiIG1zIik7CisgICAgICAgIExvZy52KFRBRywgImdldEJlbmNobWFyazogUmVuZGVyc2NyaXB0IGZyYW1lIHRpbWUgY29yZSBtcyAiICsgdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmVuY2htYXJrX2FsbChWaWV3IHYpIHsKKyAgICAgICAgLy8gd3JpdGUgcmVzdWx0IGludG8gYSBmaWxlCisgICAgICAgIEZpbGUgZXh0ZXJuYWxTdG9yYWdlID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCk7CisgICAgICAgIGlmICghZXh0ZXJuYWxTdG9yYWdlLmNhbldyaXRlKCkpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgInNkY2FyZCBpcyBub3Qgd3JpdGFibGUiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBGaWxlIHJlc3VsdEZpbGUgPSBuZXcgRmlsZShleHRlcm5hbFN0b3JhZ2UsIFJFU1VMVF9GSUxFKTsKKyAgICAgICAgLy9yZXN1bHRGaWxlLnNldFdyaXRhYmxlKHRydWUsIGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIHJzV3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHJlc3VsdEZpbGUpKTsKKyAgICAgICAgICAgIExvZy52KFRBRywgIlNhdmVkIHJlc3VsdHMgaW46ICIgKyByZXN1bHRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIGZvciAoVGVzdE5hbWUgdG46IFRlc3ROYW1lLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgY2hhbmdlVGVzdCh0bik7CisgICAgICAgICAgICAgICAgZmxvYXQgdCA9IGdldEJlbmNobWFyaygpOworICAgICAgICAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZygiIiArIHRuLnRvU3RyaW5nKCkgKyAiLCAiICsgdCk7CisgICAgICAgICAgICAgICAgcnNXcml0ZXIud3JpdGUocyArICJcbiIpOworICAgICAgICAgICAgICAgIExvZy52KFRBRywgIlRlc3QgIiArIHMgKyAibXNcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnNXcml0ZXIuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAiVW5hYmxlIHRvIHdyaXRlIHJlc3VsdCBmaWxlICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2hhbmdlVGVzdChUZXN0TmFtZS5MRVZFTFNfVkVDM19SRUxBWEVEKTsKKyAgICB9CisKKyAgICAvLyBGb3IgYmVuY2htYXJrIHRlc3QKKyAgICBwdWJsaWMgZmxvYXQgZ2V0QmVuY2htYXJrKCkgeworICAgICAgICBtRG9pbmdCZW5jaG1hcmsgPSB0cnVlOworCisgICAgICAgIG1UZXN0LnNldHVwQmVuY2htYXJrKCk7CisgICAgICAgIGxvbmcgcmVzdWx0ID0gMDsKKworICAgICAgICAvL0xvZy52KFRBRywgIldhcm1pbmciKTsKKyAgICAgICAgbG9uZyB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgMjUwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBtVGVzdC5ydW5UZXN0KCk7CisgICAgICAgICAgICBtVGVzdC5maW5pc2goKTsKKyAgICAgICAgfSB3aGlsZSAodCA+IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisKKyAgICAgICAgLy9Mb2cudihUQUcsICJCZW5jaG1hcmtpbmciKTsKKyAgICAgICAgaW50IGN0ID0gMDsKKyAgICAgICAgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgbVRlc3QucnVuVGVzdCgpOworICAgICAgICAgICAgbVRlc3QuZmluaXNoKCk7CisgICAgICAgICAgICBjdCsrOworICAgICAgICB9IHdoaWxlICgodCsxMDAwKSA+IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OworICAgICAgICBmbG9hdCBmdCA9IChmbG9hdCl0OworICAgICAgICBmdCAvPSBjdDsKKworICAgICAgICBtVGVzdC5leGl0QmVuY2htYXJrKCk7CisgICAgICAgIG1Eb2luZ0JlbmNobWFyayA9IGZhbHNlOworCisgICAgICAgIHJldHVybiBmdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvTGV2ZWxzVjQuamF2YSBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9MZXZlbHNWNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZTM3MjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvTGV2ZWxzVjQuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMuaW1hZ2UyOworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CisKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjgucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisKK3B1YmxpYyBjbGFzcyBMZXZlbHNWNCBleHRlbmRzIFRlc3RCYXNlIHsKKyAgICBwcml2YXRlIFNjcmlwdENfbGV2ZWxzX3JlbGF4ZWQgbVNjcmlwdFI7CisgICAgcHJpdmF0ZSBTY3JpcHRDX2xldmVsc19mdWxsIG1TY3JpcHRGOworICAgIHByaXZhdGUgZmxvYXQgbUluQmxhY2sgPSAwLjBmOworICAgIHByaXZhdGUgZmxvYXQgbU91dEJsYWNrID0gMC4wZjsKKyAgICBwcml2YXRlIGZsb2F0IG1JbldoaXRlID0gMjU1LjBmOworICAgIHByaXZhdGUgZmxvYXQgbU91dFdoaXRlID0gMjU1LjBmOworICAgIHByaXZhdGUgZmxvYXQgbVNhdHVyYXRpb24gPSAxLjBmOworCisgICAgTWF0cml4M2Ygc2F0TWF0cml4ID0gbmV3IE1hdHJpeDNmKCk7CisgICAgZmxvYXQgbUluV01pbkluQjsKKyAgICBmbG9hdCBtT3V0V01pbk91dEI7CisgICAgZmxvYXQgbU92ZXJJbldNaW5JbkI7CisKKyAgICBib29sZWFuIG1Vc2VGdWxsOworICAgIGJvb2xlYW4gbVVzZVY0OworCisgICAgTGV2ZWxzVjQoYm9vbGVhbiB1c2VGdWxsLCBib29sZWFuIHVzZVY0KSB7CisgICAgICAgIG1Vc2VGdWxsID0gdXNlRnVsbDsKKyAgICAgICAgbVVzZVY0ID0gdXNlVjQ7CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgc2V0TGV2ZWxzKCkgeworICAgICAgICBtSW5XTWluSW5CID0gbUluV2hpdGUgLSBtSW5CbGFjazsKKyAgICAgICAgbU91dFdNaW5PdXRCID0gbU91dFdoaXRlIC0gbU91dEJsYWNrOworICAgICAgICBtT3ZlckluV01pbkluQiA9IDEuZiAvIG1JbldNaW5JbkI7CisKKyAgICAgICAgbVNjcmlwdFIuc2V0X2luQmxhY2sobUluQmxhY2spOworICAgICAgICBtU2NyaXB0Ui5zZXRfb3V0QmxhY2sobU91dEJsYWNrKTsKKyAgICAgICAgbVNjcmlwdFIuc2V0X2luV01pbkluQihtSW5XTWluSW5CKTsKKyAgICAgICAgbVNjcmlwdFIuc2V0X291dFdNaW5PdXRCKG1PdXRXTWluT3V0Qik7CisgICAgICAgIG1TY3JpcHRSLnNldF9vdmVySW5XTWluSW5CKG1PdmVySW5XTWluSW5CKTsKKyAgICAgICAgbVNjcmlwdEYuc2V0X2luQmxhY2sobUluQmxhY2spOworICAgICAgICBtU2NyaXB0Ri5zZXRfb3V0QmxhY2sobU91dEJsYWNrKTsKKyAgICAgICAgbVNjcmlwdEYuc2V0X2luV01pbkluQihtSW5XTWluSW5CKTsKKyAgICAgICAgbVNjcmlwdEYuc2V0X291dFdNaW5PdXRCKG1PdXRXTWluT3V0Qik7CisgICAgICAgIG1TY3JpcHRGLnNldF9vdmVySW5XTWluSW5CKG1PdmVySW5XTWluSW5CKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0U2F0dXJhdGlvbigpIHsKKyAgICAgICAgZmxvYXQgcldlaWdodCA9IDAuMjk5ZjsKKyAgICAgICAgZmxvYXQgZ1dlaWdodCA9IDAuNTg3ZjsKKyAgICAgICAgZmxvYXQgYldlaWdodCA9IDAuMTE0ZjsKKyAgICAgICAgZmxvYXQgb25lTWludXNTID0gMS4wZiAtIG1TYXR1cmF0aW9uOworCisgICAgICAgIHNhdE1hdHJpeC5zZXQoMCwgMCwgb25lTWludXNTICogcldlaWdodCArIG1TYXR1cmF0aW9uKTsKKyAgICAgICAgc2F0TWF0cml4LnNldCgwLCAxLCBvbmVNaW51c1MgKiByV2VpZ2h0KTsKKyAgICAgICAgc2F0TWF0cml4LnNldCgwLCAyLCBvbmVNaW51c1MgKiByV2VpZ2h0KTsKKyAgICAgICAgc2F0TWF0cml4LnNldCgxLCAwLCBvbmVNaW51c1MgKiBnV2VpZ2h0KTsKKyAgICAgICAgc2F0TWF0cml4LnNldCgxLCAxLCBvbmVNaW51c1MgKiBnV2VpZ2h0ICsgbVNhdHVyYXRpb24pOworICAgICAgICBzYXRNYXRyaXguc2V0KDEsIDIsIG9uZU1pbnVzUyAqIGdXZWlnaHQpOworICAgICAgICBzYXRNYXRyaXguc2V0KDIsIDAsIG9uZU1pbnVzUyAqIGJXZWlnaHQpOworICAgICAgICBzYXRNYXRyaXguc2V0KDIsIDEsIG9uZU1pbnVzUyAqIGJXZWlnaHQpOworICAgICAgICBzYXRNYXRyaXguc2V0KDIsIDIsIG9uZU1pbnVzUyAqIGJXZWlnaHQgKyBtU2F0dXJhdGlvbik7CisgICAgICAgIG1TY3JpcHRSLnNldF9jb2xvck1hdChzYXRNYXRyaXgpOworICAgICAgICBtU2NyaXB0Ri5zZXRfY29sb3JNYXQoc2F0TWF0cml4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkJhcjFTZXR1cChTZWVrQmFyIGIsIFRleHRWaWV3IHQpIHsKKyAgICAgICAgYi5zZXRQcm9ncmVzcyg1MCk7CisgICAgICAgIHQuc2V0VGV4dCgiU2F0dXJhdGlvbiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gb25CYXIyU2V0dXAoU2Vla0JhciBiLCBUZXh0VmlldyB0KSB7CisgICAgICAgIGIuc2V0TWF4KDEyOCk7CisgICAgICAgIGIuc2V0UHJvZ3Jlc3MoMCk7CisgICAgICAgIHQuc2V0VGV4dCgiSW4gQmxhY2siKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHB1YmxpYyBib29sZWFuIG9uQmFyM1NldHVwKFNlZWtCYXIgYiwgVGV4dFZpZXcgdCkgeworICAgICAgICBiLnNldE1heCgxMjgpOworICAgICAgICBiLnNldFByb2dyZXNzKDApOworICAgICAgICB0LnNldFRleHQoIk91dCBCbGFjayIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gb25CYXI0U2V0dXAoU2Vla0JhciBiLCBUZXh0VmlldyB0KSB7CisgICAgICAgIGIuc2V0TWF4KDEyOCk7CisgICAgICAgIGIuc2V0UHJvZ3Jlc3MoMTI4KTsKKyAgICAgICAgdC5zZXRUZXh0KCJPdXQgV2hpdGUiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHB1YmxpYyBib29sZWFuIG9uQmFyNVNldHVwKFNlZWtCYXIgYiwgVGV4dFZpZXcgdCkgeworICAgICAgICBiLnNldE1heCgxMjgpOworICAgICAgICBiLnNldFByb2dyZXNzKDEyOCk7CisgICAgICAgIHQuc2V0VGV4dCgiT3V0IFdoaXRlIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQmFyMUNoYW5nZWQoaW50IHByb2dyZXNzKSB7CisgICAgICAgIG1TYXR1cmF0aW9uID0gKGZsb2F0KXByb2dyZXNzIC8gNTAuMGY7CisgICAgICAgIHNldFNhdHVyYXRpb24oKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgb25CYXIyQ2hhbmdlZChpbnQgcHJvZ3Jlc3MpIHsKKyAgICAgICAgbUluQmxhY2sgPSAoZmxvYXQpcHJvZ3Jlc3M7CisgICAgICAgIHNldExldmVscygpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBvbkJhcjNDaGFuZ2VkKGludCBwcm9ncmVzcykgeworICAgICAgICBtT3V0QmxhY2sgPSAoZmxvYXQpcHJvZ3Jlc3M7CisgICAgICAgIHNldExldmVscygpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBvbkJhcjRDaGFuZ2VkKGludCBwcm9ncmVzcykgeworICAgICAgICBtSW5XaGl0ZSA9IChmbG9hdClwcm9ncmVzcyArIDEyNy4wZjsKKyAgICAgICAgc2V0TGV2ZWxzKCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIG9uQmFyNUNoYW5nZWQoaW50IHByb2dyZXNzKSB7CisgICAgICAgIG1PdXRXaGl0ZSA9IChmbG9hdClwcm9ncmVzcyArIDEyNy4wZjsKKyAgICAgICAgc2V0TGV2ZWxzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY3JlYXRlVGVzdChhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyByZXMpIHsKKyAgICAgICAgbVNjcmlwdFIgPSBuZXcgU2NyaXB0Q19sZXZlbHNfcmVsYXhlZChtUlMsIHJlcywgUi5yYXcubGV2ZWxzX3JlbGF4ZWQpOworICAgICAgICBtU2NyaXB0RiA9IG5ldyBTY3JpcHRDX2xldmVsc19mdWxsKG1SUywgcmVzLCBSLnJhdy5sZXZlbHNfZnVsbCk7CisgICAgICAgIHNldFNhdHVyYXRpb24oKTsKKyAgICAgICAgc2V0TGV2ZWxzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKKyAgICAgICAgaWYgKG1Vc2VGdWxsKSB7CisgICAgICAgICAgICBpZiAobVVzZVY0KSB7CisgICAgICAgICAgICAgICAgbVNjcmlwdEYuZm9yRWFjaF9yb290NChtSW5QaXhlbHNBbGxvY2F0aW9uLCBtT3V0UGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TY3JpcHRGLmZvckVhY2hfcm9vdChtSW5QaXhlbHNBbGxvY2F0aW9uLCBtT3V0UGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobVVzZVY0KSB7CisgICAgICAgICAgICAgICAgbVNjcmlwdFIuZm9yRWFjaF9yb290NChtSW5QaXhlbHNBbGxvY2F0aW9uLCBtT3V0UGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TY3JpcHRSLmZvckVhY2hfcm9vdChtSW5QaXhlbHNBbGxvY2F0aW9uLCBtT3V0UGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL01hbmRlbGJyb3QuamF2YSBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9NYW5kZWxicm90LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4MDU4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9NYW5kZWxicm90LmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMuaW1hZ2UyOworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK3B1YmxpYyBjbGFzcyBNYW5kZWxicm90IGV4dGVuZHMgVGVzdEJhc2UgeworICAgIHByaXZhdGUgU2NyaXB0Q19tYW5kZWxicm90IG1TY3JpcHQ7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkJhcjFTZXR1cChTZWVrQmFyIGIsIFRleHRWaWV3IHQpIHsKKyAgICAgICAgdC5zZXRUZXh0KCJJdGVyYXRpb25zIik7CisgICAgICAgIGIuc2V0UHJvZ3Jlc3MoMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQmFyMUNoYW5nZWQoaW50IHByb2dyZXNzKSB7CisgICAgICAgIGludCBpdGVycyA9IHByb2dyZXNzICogMyArIDUwOworICAgICAgICBtU2NyaXB0LnNldF9nTWF4SXRlcmF0aW9uKGl0ZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkJhcjJTZXR1cChTZWVrQmFyIGIsIFRleHRWaWV3IHQpIHsKKyAgICAgICAgdC5zZXRUZXh0KCJMb3dlciBCb3VuZDogWCIpOworICAgICAgICBiLnNldFByb2dyZXNzKDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkJhcjJDaGFuZ2VkKGludCBwcm9ncmVzcykgeworICAgICAgICBmbG9hdCBzY2FsZUZhY3RvciA9IG1TY3JpcHQuZ2V0X3NjYWxlRmFjdG9yKCk7CisgICAgICAgIC8vIGFsbG93IHZpZXdwb3J0IHRvIGJlIG1vdmVkIGJ5IDJ4IHNjYWxlIGZhY3RvcgorICAgICAgICBmbG9hdCBsb3dlckJvdW5kWCA9IC0yLmYgKyAoKHByb2dyZXNzIC8gc2NhbGVGYWN0b3IpIC8gNTAuZik7CisgICAgICAgIG1TY3JpcHQuc2V0X2xvd2VyQm91bmRYKGxvd2VyQm91bmRYKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkJhcjNTZXR1cChTZWVrQmFyIGIsIFRleHRWaWV3IHQpIHsKKyAgICAgICAgdC5zZXRUZXh0KCJMb3dlciBCb3VuZDogWSIpOworICAgICAgICBiLnNldFByb2dyZXNzKDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkJhcjNDaGFuZ2VkKGludCBwcm9ncmVzcykgeworICAgICAgICBmbG9hdCBzY2FsZUZhY3RvciA9IG1TY3JpcHQuZ2V0X3NjYWxlRmFjdG9yKCk7CisgICAgICAgIC8vIGFsbG93IHZpZXdwb3J0IHRvIGJlIG1vdmVkIGJ5IDJ4IHNjYWxlIGZhY3RvcgorICAgICAgICBmbG9hdCBsb3dlckJvdW5kWSA9IC0yLmYgKyAoKHByb2dyZXNzIC8gc2NhbGVGYWN0b3IpIC8gNTAuZik7CisgICAgICAgIG1TY3JpcHQuc2V0X2xvd2VyQm91bmRZKGxvd2VyQm91bmRZKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkJhcjRTZXR1cChTZWVrQmFyIGIsIFRleHRWaWV3IHQpIHsKKyAgICAgICAgdC5zZXRUZXh0KCJTY2FsZSBGYWN0b3IiKTsKKyAgICAgICAgYi5zZXRQcm9ncmVzcygwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25CYXI0Q2hhbmdlZChpbnQgcHJvZ3Jlc3MpIHsKKyAgICAgICAgZmxvYXQgc2NhbGVGYWN0b3IgPSA0LmYgLSAoMy45NmYgKiAocHJvZ3Jlc3MgLyAxMDAuZikpOworICAgICAgICBtU2NyaXB0LnNldF9zY2FsZUZhY3RvcihzY2FsZUZhY3Rvcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY3JlYXRlVGVzdChhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyByZXMpIHsKKyAgICAgICAgaW50IHdpZHRoID0gbU91dFBpeGVsc0FsbG9jYXRpb24uZ2V0VHlwZSgpLmdldFgoKTsKKyAgICAgICAgaW50IGhlaWdodCA9IG1PdXRQaXhlbHNBbGxvY2F0aW9uLmdldFR5cGUoKS5nZXRZKCk7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX21hbmRlbGJyb3QobVJTLCByZXMsIFIucmF3Lm1hbmRlbGJyb3QpOworICAgICAgICBtU2NyaXB0LnNldF9nRGltWCh3aWR0aCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dEaW1ZKGhlaWdodCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dNYXhJdGVyYXRpb24oNTApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7CisgICAgICAgIG1TY3JpcHQuZm9yRWFjaF9yb290KG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvU2hhZG93cy5qYXZhIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL1NoYWRvd3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTNjNTZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL1NoYWRvd3MuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy5pbWFnZTI7CisKKworcHVibGljIGNsYXNzIFNoYWRvd3MgZXh0ZW5kcyBUZXN0QmFzZSB7CisgICAgcHJpdmF0ZSBTY3JpcHRDX3NoYWRvd3MgbVNjcmlwdDsKKworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVRlc3QoYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19zaGFkb3dzKG1SUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKKyAgICAgICAgbVNjcmlwdC5pbnZva2VfcHJlcGFyZVNoYWRvd3MoNTAuZik7CisgICAgICAgIG1TY3JpcHQuZm9yRWFjaF9zaGFkb3dzS2VybmVsKG1JblBpeGVsc0FsbG9jYXRpb24sIG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9UZXN0QmFzZS5qYXZhIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL1Rlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhYmM3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9UZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy5pbWFnZTI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY4LnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0QmFzZSAgeworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEFHID0gIkltZyI7CisKKyAgICBwcm90ZWN0ZWQgUmVuZGVyU2NyaXB0IG1SUzsKKyAgICBwcm90ZWN0ZWQgQWxsb2NhdGlvbiBtSW5QaXhlbHNBbGxvY2F0aW9uOworICAgIHByb3RlY3RlZCBBbGxvY2F0aW9uIG1JblBpeGVsc0FsbG9jYXRpb24yOworICAgIHByb3RlY3RlZCBBbGxvY2F0aW9uIG1PdXRQaXhlbHNBbGxvY2F0aW9uOworCisgICAgcHJvdGVjdGVkIEltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5MiBhY3Q7CisKKyAgICAvLyBPdmVycmlkZSB0byB1c2UgVUkgZWxlbWVudHMKKyAgICBwdWJsaWMgdm9pZCBvbkJhcjFDaGFuZ2VkKGludCBwcm9ncmVzcykgeworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBvbkJhcjJDaGFuZ2VkKGludCBwcm9ncmVzcykgeworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBvbkJhcjNDaGFuZ2VkKGludCBwcm9ncmVzcykgeworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBvbkJhcjRDaGFuZ2VkKGludCBwcm9ncmVzcykgeworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBvbkJhcjVDaGFuZ2VkKGludCBwcm9ncmVzcykgeworICAgIH0KKworICAgIC8vIE92ZXJyaWRlIHRvIHVzZSBVSSBlbGVtZW50cworICAgIC8vIFVudXNlZCBiYXJzIHdpbGwgYmUgaGlkZGVuLgorICAgIHB1YmxpYyBib29sZWFuIG9uQmFyMVNldHVwKFNlZWtCYXIgYiwgVGV4dFZpZXcgdCkgeworICAgICAgICBiLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICB0LnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHB1YmxpYyBib29sZWFuIG9uQmFyMlNldHVwKFNlZWtCYXIgYiwgVGV4dFZpZXcgdCkgeworICAgICAgICBiLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICB0LnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHB1YmxpYyBib29sZWFuIG9uQmFyM1NldHVwKFNlZWtCYXIgYiwgVGV4dFZpZXcgdCkgeworICAgICAgICBiLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICB0LnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHB1YmxpYyBib29sZWFuIG9uQmFyNFNldHVwKFNlZWtCYXIgYiwgVGV4dFZpZXcgdCkgeworICAgICAgICBiLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICB0LnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHB1YmxpYyBib29sZWFuIG9uQmFyNVNldHVwKFNlZWtCYXIgYiwgVGV4dFZpZXcgdCkgeworICAgICAgICBiLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICB0LnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25TcGlubmVyMVNldHVwKFNwaW5uZXIgcykgeworICAgICAgICBzLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlQmFzZVRlc3QoSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkyIGlwYWN0LCBCaXRtYXAgYiwgQml0bWFwIGIyLCBCaXRtYXAgb3V0YikgeworICAgICAgICBhY3QgPSBpcGFjdDsKKyAgICAgICAgbVJTID0gaXBhY3QubVJTOworCisgICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24gPSBpcGFjdC5tSW5QaXhlbHNBbGxvY2F0aW9uOworICAgICAgICBtSW5QaXhlbHNBbGxvY2F0aW9uMiA9IGlwYWN0Lm1JblBpeGVsc0FsbG9jYXRpb24yOworICAgICAgICBtT3V0UGl4ZWxzQWxsb2NhdGlvbiA9IGlwYWN0Lm1PdXRQaXhlbHNBbGxvY2F0aW9uOworCisgICAgICAgIGNyZWF0ZVRlc3QoYWN0LmdldFJlc291cmNlcygpKTsKKyAgICB9CisKKyAgICAvLyBNdXN0IG92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY3JlYXRlVGVzdChhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyByZXMpIHsKKyAgICB9CisKKyAgICAvLyBNdXN0IG92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIG1SUy5maW5pc2goKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJpdG1hcChCaXRtYXAgYikgeworICAgICAgICBtT3V0UGl4ZWxzQWxsb2NhdGlvbi5jb3B5VG8oYik7CisgICAgfQorCisgICAgLy8gT3ZlcnJpZGUgdG8gY29uZmlndXJlIHNwZWNpZmljIGJlbmNobWFyayBjb25maWcuCisgICAgcHVibGljIHZvaWQgc2V0dXBCZW5jaG1hcmsoKSB7CisgICAgfQorCisgICAgLy8gT3ZlcnJpZGUgdG8gcmVzZXQgYWZ0ZXIgYmVuY2htYXJrLgorICAgIHB1YmxpYyB2b2lkIGV4aXRCZW5jaG1hcmsoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL1ZpYnJhbmNlLmphdmEgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvVmlicmFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2MwYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL1ZpYnJhbmNlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMuaW1hZ2UyOworCitwdWJsaWMgY2xhc3MgVmlicmFuY2UgZXh0ZW5kcyBUZXN0QmFzZSB7CisgICAgcHJpdmF0ZSBTY3JpcHRDX3ZpYnJhbmNlIG1TY3JpcHQ7CisKKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVUZXN0KGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIHJlcykgeworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfdmlicmFuY2UobVJTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW5UZXN0KCkgeworICAgICAgICBtU2NyaXB0LnNldF92aWJyYW5jZSg1MC5mKTsKKyAgICAgICAgbVNjcmlwdC5pbnZva2VfcHJlcGFyZVZpYnJhbmNlKCk7CisgICAgICAgIG1TY3JpcHQuZm9yRWFjaF92aWJyYW5jZUtlcm5lbChtSW5QaXhlbHNBbGxvY2F0aW9uLCBtT3V0UGl4ZWxzQWxsb2NhdGlvbik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvVmlnbmV0dGUuamF2YSBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9WaWduZXR0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNmQzNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvcnMvaW1hZ2UvVmlnbmV0dGUuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMuaW1hZ2UyOworCitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworcHVibGljIGNsYXNzIFZpZ25ldHRlIGV4dGVuZHMgVGVzdEJhc2UgeworICAgIHByaXZhdGUgU2NyaXB0Q192aWduZXR0ZV9mdWxsIG1TY3JpcHRfZnVsbCA9IG51bGw7CisgICAgcHJpdmF0ZSBTY3JpcHRDX3ZpZ25ldHRlX3JlbGF4ZWQgbVNjcmlwdF9yZWxheGVkID0gbnVsbDsKKyAgICBwcml2YXRlIFNjcmlwdENfdmlnbmV0dGVfYXBwcm94X2Z1bGwgbVNjcmlwdF9hcHByb3hfZnVsbCA9IG51bGw7CisgICAgcHJpdmF0ZSBTY3JpcHRDX3ZpZ25ldHRlX2FwcHJveF9yZWxheGVkIG1TY3JpcHRfYXBwcm94X3JlbGF4ZWQgPSBudWxsOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBhcHByb3g7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlbGF4ZWQ7CisgICAgcHJpdmF0ZSBmbG9hdCBjZW50ZXJfeCA9IDAuNWY7CisgICAgcHJpdmF0ZSBmbG9hdCBjZW50ZXJfeSA9IDAuNWY7CisgICAgcHJpdmF0ZSBmbG9hdCBzY2FsZSA9IDAuNWY7CisgICAgcHJpdmF0ZSBmbG9hdCBzaGFkZSA9IDAuNWY7CisgICAgcHJpdmF0ZSBmbG9hdCBzbG9wZSA9IDIwLjBmOworCisgICAgcHVibGljIFZpZ25ldHRlKGJvb2xlYW4gYXBwcm94LCBib29sZWFuIHJlbGF4ZWQpIHsKKyAgICAgICAgdGhpcy5hcHByb3ggPSBhcHByb3g7CisgICAgICAgIHRoaXMucmVsYXhlZCA9IHJlbGF4ZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25CYXIxU2V0dXAoU2Vla0JhciBiLCBUZXh0VmlldyB0KSB7CisgICAgICAgIHQuc2V0VGV4dCgiU2NhbGUiKTsKKyAgICAgICAgYi5zZXRNYXgoMTAwKTsKKyAgICAgICAgYi5zZXRQcm9ncmVzcygyNSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBvbkJhcjJTZXR1cChTZWVrQmFyIGIsIFRleHRWaWV3IHQpIHsKKyAgICAgICAgdC5zZXRUZXh0KCJTaGFkZSIpOworICAgICAgICBiLnNldE1heCgxMDApOworICAgICAgICBiLnNldFByb2dyZXNzKDUwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHB1YmxpYyBib29sZWFuIG9uQmFyM1NldHVwKFNlZWtCYXIgYiwgVGV4dFZpZXcgdCkgeworICAgICAgICB0LnNldFRleHQoIlNsb3BlIik7CisgICAgICAgIGIuc2V0TWF4KDEwMCk7CisgICAgICAgIGIuc2V0UHJvZ3Jlc3MoMjApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gb25CYXI0U2V0dXAoU2Vla0JhciBiLCBUZXh0VmlldyB0KSB7CisgICAgICAgIHQuc2V0VGV4dCgiU2hpZnQgY2VudGVyIFgiKTsKKyAgICAgICAgYi5zZXRNYXgoMTAwKTsKKyAgICAgICAgYi5zZXRQcm9ncmVzcyg1MCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBvbkJhcjVTZXR1cChTZWVrQmFyIGIsIFRleHRWaWV3IHQpIHsKKyAgICAgICAgdC5zZXRUZXh0KCJTaGlmdCBjZW50ZXIgWSIpOworICAgICAgICBiLnNldE1heCgxMDApOworICAgICAgICBiLnNldFByb2dyZXNzKDUwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25CYXIxQ2hhbmdlZChpbnQgcHJvZ3Jlc3MpIHsKKyAgICAgICAgc2NhbGUgPSBwcm9ncmVzcyAvIDUwLjBmOworICAgICAgICBkb19pbml0KCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIG9uQmFyMkNoYW5nZWQoaW50IHByb2dyZXNzKSB7CisgICAgICAgIHNoYWRlID0gcHJvZ3Jlc3MgLyAxMDAuMGY7CisgICAgICAgIGRvX2luaXQoKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgb25CYXIzQ2hhbmdlZChpbnQgcHJvZ3Jlc3MpIHsKKyAgICAgICAgc2xvcGUgPSAoZmxvYXQpcHJvZ3Jlc3M7CisgICAgICAgIGRvX2luaXQoKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgb25CYXI0Q2hhbmdlZChpbnQgcHJvZ3Jlc3MpIHsKKyAgICAgICAgY2VudGVyX3ggPSBwcm9ncmVzcyAvIDEwMC4wZjsKKyAgICAgICAgZG9faW5pdCgpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBvbkJhcjVDaGFuZ2VkKGludCBwcm9ncmVzcykgeworICAgICAgICBjZW50ZXJfeSA9IHByb2dyZXNzIC8gMTAwLjBmOworICAgICAgICBkb19pbml0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvX2luaXQoKSB7CisgICAgICAgIGlmIChhcHByb3gpIHsKKyAgICAgICAgICAgIGlmIChyZWxheGVkKQorICAgICAgICAgICAgICAgIG1TY3JpcHRfYXBwcm94X3JlbGF4ZWQuaW52b2tlX2luaXRfdmlnbmV0dGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtSW5QaXhlbHNBbGxvY2F0aW9uLmdldFR5cGUoKS5nZXRYKCksCisgICAgICAgICAgICAgICAgICAgICAgICBtSW5QaXhlbHNBbGxvY2F0aW9uLmdldFR5cGUoKS5nZXRZKCksIGNlbnRlcl94LAorICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyX3ksIHNjYWxlLCBzaGFkZSwgc2xvcGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1TY3JpcHRfYXBwcm94X2Z1bGwuaW52b2tlX2luaXRfdmlnbmV0dGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtSW5QaXhlbHNBbGxvY2F0aW9uLmdldFR5cGUoKS5nZXRYKCksCisgICAgICAgICAgICAgICAgICAgICAgICBtSW5QaXhlbHNBbGxvY2F0aW9uLmdldFR5cGUoKS5nZXRZKCksIGNlbnRlcl94LAorICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyX3ksIHNjYWxlLCBzaGFkZSwgc2xvcGUpOworICAgICAgICB9IGVsc2UgaWYgKHJlbGF4ZWQpCisgICAgICAgICAgICBtU2NyaXB0X3JlbGF4ZWQuaW52b2tlX2luaXRfdmlnbmV0dGUoCisgICAgICAgICAgICAgICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24uZ2V0VHlwZSgpLmdldFgoKSwKKyAgICAgICAgICAgICAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbi5nZXRUeXBlKCkuZ2V0WSgpLCBjZW50ZXJfeCwgY2VudGVyX3ksCisgICAgICAgICAgICAgICAgICAgIHNjYWxlLCBzaGFkZSwgc2xvcGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtU2NyaXB0X2Z1bGwuaW52b2tlX2luaXRfdmlnbmV0dGUoCisgICAgICAgICAgICAgICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24uZ2V0VHlwZSgpLmdldFgoKSwKKyAgICAgICAgICAgICAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbi5nZXRUeXBlKCkuZ2V0WSgpLCBjZW50ZXJfeCwgY2VudGVyX3ksCisgICAgICAgICAgICAgICAgICAgIHNjYWxlLCBzaGFkZSwgc2xvcGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVRlc3QoYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIGlmIChhcHByb3gpIHsKKyAgICAgICAgICAgIGlmIChyZWxheGVkKQorICAgICAgICAgICAgICAgIG1TY3JpcHRfYXBwcm94X3JlbGF4ZWQgPSBuZXcgU2NyaXB0Q192aWduZXR0ZV9hcHByb3hfcmVsYXhlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SUywgcmVzLCBSLnJhdy52aWduZXR0ZV9hcHByb3hfcmVsYXhlZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbVNjcmlwdF9hcHByb3hfZnVsbCA9IG5ldyBTY3JpcHRDX3ZpZ25ldHRlX2FwcHJveF9mdWxsKAorICAgICAgICAgICAgICAgICAgICAgICAgbVJTLCByZXMsIFIucmF3LnZpZ25ldHRlX2FwcHJveF9mdWxsKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWxheGVkKQorICAgICAgICAgICAgbVNjcmlwdF9yZWxheGVkID0gbmV3IFNjcmlwdENfdmlnbmV0dGVfcmVsYXhlZChtUlMsIHJlcywKKyAgICAgICAgICAgICAgICAgICAgUi5yYXcudmlnbmV0dGVfcmVsYXhlZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1TY3JpcHRfZnVsbCA9IG5ldyBTY3JpcHRDX3ZpZ25ldHRlX2Z1bGwobVJTLCByZXMsCisgICAgICAgICAgICAgICAgICAgIFIucmF3LnZpZ25ldHRlX2Z1bGwpOworICAgICAgICBkb19pbml0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKKyAgICAgICAgaWYgKGFwcHJveCkgeworICAgICAgICAgICAgaWYgKHJlbGF4ZWQpCisgICAgICAgICAgICAgICAgbVNjcmlwdF9hcHByb3hfcmVsYXhlZC5mb3JFYWNoX3Jvb3QobUluUGl4ZWxzQWxsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtU2NyaXB0X2FwcHJveF9mdWxsLmZvckVhY2hfcm9vdChtSW5QaXhlbHNBbGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICB9IGVsc2UgaWYgKHJlbGF4ZWQpCisgICAgICAgICAgICBtU2NyaXB0X3JlbGF4ZWQuZm9yRWFjaF9yb290KG1JblBpeGVsc0FsbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbVNjcmlwdF9mdWxsLmZvckVhY2hfcm9vdChtSW5QaXhlbHNBbGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICBtT3V0UGl4ZWxzQWxsb2NhdGlvbik7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9XaGl0ZUJhbGFuY2UuamF2YSBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9ycy9pbWFnZS9XaGl0ZUJhbGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NThlM2IxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3JzL2ltYWdlL1doaXRlQmFsYW5jZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLmltYWdlMjsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworCitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY4LnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgV2hpdGVCYWxhbmNlIGV4dGVuZHMgVGVzdEJhc2UgeworICAgIHByaXZhdGUgU2NyaXB0Q193YmFsYW5jZSBtU2NyaXB0OworCisgICAgcHVibGljIHZvaWQgY3JlYXRlVGVzdChhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyByZXMpIHsKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX3diYWxhbmNlKG1SUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfaGlzdG9ncmFtU291cmNlKG1JblBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICBtU2NyaXB0LnNldF9oaXN0b2dyYW1XaWR0aChtSW5QaXhlbHNBbGxvY2F0aW9uLmdldFR5cGUoKS5nZXRYKCkpOworICAgICAgICBtU2NyaXB0LnNldF9oaXN0b2dyYW1IZWlnaHQobUluUGl4ZWxzQWxsb2NhdGlvbi5nZXRUeXBlKCkuZ2V0WSgpKTsKKyAgICAgICAgbVNjcmlwdC5pbnZva2VfcHJlcGFyZVdoaXRlQmFsYW5jZSgpOworICAgICAgICBtU2NyaXB0LmZvckVhY2hfd2hpdGVCYWxhbmNlS2VybmVsKG1JblBpeGVsc0FsbG9jYXRpb24sIG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcmVzL2RyYXdhYmxlLW5vZHBpL2NpdHkucG5nIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9yZXMvZHJhd2FibGUtbm9kcGkvY2l0eS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2ZWVmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcmVzL2RyYXdhYmxlLW5vZHBpL2NpdHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcmVzL2RyYXdhYmxlLW5vZHBpL2ltZzE2MDB4MTA2Ny5qcGcgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS1ub2RwaS9pbWcxNjAweDEwNjcuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZDNlZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS1ub2RwaS9pbWcxNjAweDEwNjcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcmVzL2RyYXdhYmxlLW5vZHBpL2ltZzE2MDB4MTA2N2IuanBnIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9yZXMvZHJhd2FibGUtbm9kcGkvaW1nMTYwMHgxMDY3Yi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkMDc4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcmVzL2RyYXdhYmxlLW5vZHBpL2ltZzE2MDB4MTA2N2IuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcmVzL2xheW91dC9tYWluLnhtbCBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcmVzL2xheW91dC9tYWluLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGEyYjkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9yZXMvbGF5b3V0L21haW4ueG1sCkBAIC0wLDAgKzEsMTM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RvcGxldmVsIj4KKyAgICA8U3VyZmFjZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdXJmYWNlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIiAvPgorICAgIDxTY3JvbGxWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+CisgICAgICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kaXNwbGF5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgICAgICAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9iZW5jaG1hcmsiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9ImJlbmNobWFyayIvPgorICAgICAgICAgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmVuY2htYXJrVGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjhwdCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zYXR1cmF0aW9uIi8+CisgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAgICAgICAgIDxTcGlubmVyCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9maWx0ZXJzZWxlY3Rpb24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisgICAgICAgICAgICA8U3Bpbm5lcgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3Bpbm5lcjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NsaWRlcjFUZXh0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iOHB0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwc3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxNXNwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zYXR1cmF0aW9uIi8+CisgICAgICAgICAgICAgPFNlZWtCYXIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NsaWRlcjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NsaWRlcjJUZXh0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iOHB0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwc3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxNXNwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9nYW1tYSIvPgorICAgICAgICAgICAgPFNlZWtCYXIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NsaWRlcjIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NsaWRlcjNUZXh0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjE1c3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iOHB0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9vdXRfd2hpdGUiLz4KKyAgICAgICAgICAgIDxTZWVrQmFyCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zbGlkZXIzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwc3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwc3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgorICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zbGlkZXI0VGV4dCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjhwdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMHNwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTVzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaW5fd2hpdGUiLz4KKyAgICAgICAgICAgIDxTZWVrQmFyCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zbGlkZXI0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwc3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwc3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgorICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zbGlkZXI1VGV4dCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjhwdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMHNwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTVzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaW5fd2hpdGUiLz4KKyAgICAgICAgICAgIDxTZWVrQmFyCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zbGlkZXI1IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwc3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwc3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgorICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2JlbmNobWFya19hbGwiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b25DbGljaz0iYmVuY2htYXJrX2FsbCIvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9TY3JvbGxWaWV3PgorPC9MaW5lYXJMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcmVzL2xheW91dC9zcGlubmVyX2xheW91dC54bWwgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3Jlcy9sYXlvdXQvc3Bpbm5lcl9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOTZiYmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3Jlcy9sYXlvdXQvc3Bpbm5lcl9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisKKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOnBhZGRpbmc9IjEwZHAiCisgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKKy8+CmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdkZDE2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gR2VuZXJhbCAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS1zbGlkZXIgbGFiZWwgLS0+CisgICAgPHN0cmluZyBuYW1lPSJibHVyX2Rlc2NyaXB0aW9uIj5CbHVyIFJhZGl1czwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5fd2hpdGUiPkluIFdoaXRlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJvdXRfd2hpdGUiPk91dCBXaGl0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5fYmxhY2siPkluIEJsYWNrPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJvdXRfYmxhY2siPk91dCBCbGFjazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ2FtbWEiPkdhbW1hPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYXR1cmF0aW9uIj5TYXR1cmF0aW9uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiZW5jaG1hcmsiPkJlbmNobWFyazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmVuY2htYXJrX2FsbCI+QmVuY2htYXJrIEFsbDwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvYmxlbmQucnMgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2JsZW5kLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYzEyNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2JsZW5kLnJzCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiaXAucnNoIgorCit1Y2hhciBhbHBoYSA9IDB4MDsKKwordm9pZCBzZXRJbWFnZUFscGhhKHVjaGFyNCAqdl9vdXQsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgdl9vdXQtPnJnYmEgPSBjb252ZXJ0X3VjaGFyNCgoY29udmVydF91aW50NCh2X291dC0+cmdiYSkgKiBhbHBoYSkgPj4gKHVpbnQ0KTgpOworICB2X291dC0+YSA9IGFscGhhOworfQorCmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2J3ZmlsdGVyLnJzIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9id2ZpbHRlci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzA2ZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9id2ZpbHRlci5ycwpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImlwLnJzaCIKKy8vI3ByYWdtYSByc19mcF9yZWxheGVkCisKK3N0YXRpYyBmbG9hdCBzciA9IDAuZjsKK3N0YXRpYyBmbG9hdCBzZyA9IDAuZjsKK3N0YXRpYyBmbG9hdCBzYiA9IDAuZjsKKwordm9pZCBwcmVwYXJlQndGaWx0ZXIodWludDMyX3QgcncsIHVpbnQzMl90IGd3LCB1aW50MzJfdCBidykgeworCisgICAgc3IgPSBydzsKKyAgICBzZyA9IGd3OworICAgIHNiID0gYnc7CisKKyAgICBmbG9hdCBpbWFnZU1pbiA9IG1pbihzZyxzYik7CisgICAgaW1hZ2VNaW4gPSBmbWluKHNyLGltYWdlTWluKTsKKyAgICBmbG9hdCBpbWFnZU1heCA9IG1heChzZyxzYik7CisgICAgaW1hZ2VNYXggPSBmbWF4KHNyLGltYWdlTWF4KTsKKyAgICBmbG9hdCBhdmcgPSAoaW1hZ2VNaW4gKyBpbWFnZU1heCkvMjsKKyAgICBzYiAvPSBhdmc7CisgICAgc2cgLz0gYXZnOworICAgIHNyIC89IGF2ZzsKKworfQorCit2b2lkIGJ3RmlsdGVyS2VybmVsKGNvbnN0IHVjaGFyNCAqaW4sIHVjaGFyNCAqb3V0KSB7CisgICAgZmxvYXQgciA9IGluLT5yICogc3I7CisgICAgZmxvYXQgZyA9IGluLT5nICogc2c7CisgICAgZmxvYXQgYiA9IGluLT5iICogc2I7CisgICAgZmxvYXQgbG9jYWxNaW4sIGxvY2FsTWF4LCBhdmc7CisgICAgbG9jYWxNaW4gPSBmbWluKGcsYik7CisgICAgbG9jYWxNaW4gPSBmbWluKHIsbG9jYWxNaW4pOworICAgIGxvY2FsTWF4ID0gZm1heChnLGIpOworICAgIGxvY2FsTWF4ID0gZm1heChyLGxvY2FsTWF4KTsKKyAgICBhdmcgPSAobG9jYWxNaW4rbG9jYWxNYXgpICogMC41ZjsKKyAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSByc0NsYW1wKGF2ZywgMCwgMjU1KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvY29sb3JjdWJlLnJzIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9jb2xvcmN1YmUucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkNmFjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvY29sb3JjdWJlLnJzCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaXAucnNoIgorI3ByYWdtYSByc19mcF9yZWxheGVkCisKKworc3RhdGljIHJzX2FsbG9jYXRpb24gZ0N1YmU7CitzdGF0aWMgaW50NCBnRGltczsKK3N0YXRpYyBpbnQ0IGdDb29yZE11bDsKKworCit2b2lkIHNldEN1YmUocnNfYWxsb2NhdGlvbiBjKSB7CisgICAgZ0N1YmUgPSBjOworICAgIGdEaW1zLnggPSByc0FsbG9jYXRpb25HZXREaW1YKGdDdWJlKTsKKyAgICBnRGltcy55ID0gcnNBbGxvY2F0aW9uR2V0RGltWShnQ3ViZSk7CisgICAgZ0RpbXMueiA9IHJzQWxsb2NhdGlvbkdldERpbVooZ0N1YmUpOworICAgIGdEaW1zLncgPSAwOworCisgICAgZmxvYXQ0IG0gPSAoZmxvYXQ0KSgxLmYgLyAyNTUuZikgKiBjb252ZXJ0X2Zsb2F0NChnRGltcyAtIDEpOworICAgIGdDb29yZE11bCA9IGNvbnZlcnRfaW50NChtICogKGZsb2F0NCkweDEwMDAwKTsKKworICAgIHJzRGVidWcoImRpbXMiLCBnRGltcyk7CisgICAgcnNEZWJ1ZygiZ0Nvb3JkTXVsIiwgZ0Nvb3JkTXVsKTsKK30KKwordm9pZCByb290KGNvbnN0IHVjaGFyNCAqaW4sIHVjaGFyNCAqb3V0LCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgLy9yc0RlYnVnKCJyb290IiwgaW4pOworCisgICAgaW50NCBiYXNlQ29vcmQgPSBjb252ZXJ0X2ludDQoKmluKSAqIGdDb29yZE11bDsKKyAgICBpbnQ0IGNvb3JkMSA9IGJhc2VDb29yZCA+PiAoaW50NCkxNjsKKyAgICBpbnQ0IGNvb3JkMiA9IG1pbihjb29yZDEgKyAxLCBnRGltcyAtIDEpOworCisgICAgaW50NCB3ZWlnaHQyID0gYmFzZUNvb3JkICYgMHhmZmZmOworICAgIGludDQgd2VpZ2h0MSA9IChpbnQ0KTB4MTAwMDAgLSB3ZWlnaHQyOworCisgICAgdWludDQgdjAwMCA9IGNvbnZlcnRfdWludDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdDdWJlLCBjb29yZDEueCwgY29vcmQxLnksIGNvb3JkMS56KSk7CisgICAgdWludDQgdjEwMCA9IGNvbnZlcnRfdWludDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdDdWJlLCBjb29yZDIueCwgY29vcmQxLnksIGNvb3JkMS56KSk7CisgICAgdWludDQgdjAxMCA9IGNvbnZlcnRfdWludDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdDdWJlLCBjb29yZDEueCwgY29vcmQyLnksIGNvb3JkMS56KSk7CisgICAgdWludDQgdjExMCA9IGNvbnZlcnRfdWludDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdDdWJlLCBjb29yZDIueCwgY29vcmQyLnksIGNvb3JkMS56KSk7CisgICAgdWludDQgdjAwMSA9IGNvbnZlcnRfdWludDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdDdWJlLCBjb29yZDEueCwgY29vcmQxLnksIGNvb3JkMi56KSk7CisgICAgdWludDQgdjEwMSA9IGNvbnZlcnRfdWludDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdDdWJlLCBjb29yZDIueCwgY29vcmQxLnksIGNvb3JkMi56KSk7CisgICAgdWludDQgdjAxMSA9IGNvbnZlcnRfdWludDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdDdWJlLCBjb29yZDEueCwgY29vcmQyLnksIGNvb3JkMi56KSk7CisgICAgdWludDQgdjExMSA9IGNvbnZlcnRfdWludDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdDdWJlLCBjb29yZDIueCwgY29vcmQyLnksIGNvb3JkMi56KSk7CisKKyAgICB1aW50NCB5ejAwID0gKCh2MDAwICogd2VpZ2h0MS54KSArICh2MTAwICogd2VpZ2h0Mi54KSkgPj4gKHVpbnQ0KTg7CisgICAgdWludDQgeXoxMCA9ICgodjAxMCAqIHdlaWdodDEueCkgKyAodjExMCAqIHdlaWdodDIueCkpID4+ICh1aW50NCk4OworICAgIHVpbnQ0IHl6MDEgPSAoKHYwMDEgKiB3ZWlnaHQxLngpICsgKHYxMDEgKiB3ZWlnaHQyLngpKSA+PiAodWludDQpODsKKyAgICB1aW50NCB5ejExID0gKCh2MDExICogd2VpZ2h0MS54KSArICh2MTExICogd2VpZ2h0Mi54KSkgPj4gKHVpbnQ0KTg7CisKKyAgICB1aW50NCB6MCA9ICgoeXowMCAqIHdlaWdodDEueSkgKyAoeXoxMCAqIHdlaWdodDIueSkpID4+ICh1aW50NCkxNjsKKyAgICB1aW50NCB6MSA9ICgoeXowMSAqIHdlaWdodDEueSkgKyAoeXoxMSAqIHdlaWdodDIueSkpID4+ICh1aW50NCkxNjsKKworICAgIHVpbnQ0IHYgPSAoKHowICogd2VpZ2h0MS56KSArICh6MSAqIHdlaWdodDIueikpID4+ICh1aW50NCkxNjsKKyAgICB1aW50NCB2MiA9ICh2ICsgMHg3ZikgPj4gKHVpbnQ0KTg7CisKKyAgICAqb3V0ID0gY29udmVydF91Y2hhcjQodjIpOworICAgIG91dC0+YSA9IDB4ZmY7CisKKyAgICAjaWYgMAorICAgIGlmIChpbi0+ciAhPSBvdXQtPnIpIHsKKyAgICAgICAgcnNEZWJ1ZygiZHIiLCBpbi0+ciAtIG91dC0+cik7CisgICAgICAgIC8vcnNEZWJ1ZygiaW4iLCBjb252ZXJ0X2ludDQoKmluKSk7CisgICAgICAgIC8vcnNEZWJ1ZygiY29vcmQxIiwgY29vcmQxKTsKKyAgICAgICAgLy9yc0RlYnVnKCJjb29yZDIiLCBjb29yZDIpOworICAgICAgICAvL3JzRGVidWcoIndlaWdodDEiLCB3ZWlnaHQxKTsKKyAgICAgICAgLy9yc0RlYnVnKCJ3ZWlnaHQyIiwgd2VpZ2h0Mik7CisgICAgICAgIC8vcnNEZWJ1ZygieXowMCIsIHl6MDApOworICAgICAgICAvL3JzRGVidWcoInowIiwgejApOworICAgICAgICAvL3JzRGVidWcoInYiLCB2KTsKKyAgICAgICAgLy9yc0RlYnVnKCJ2MiIsIHYyKTsKKyAgICAgICAgLy9yc0RlYnVnKCJvdXQiLCBjb252ZXJ0X2ludDQoKm91dCkpOworICAgIH0KKyAgICAjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9jb2xvcm1hdHJpeC5mcyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvY29sb3JtYXRyaXguZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmYjI0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvY29sb3JtYXRyaXguZnMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpcC5yc2giCisKK3N0YXRpYyByc19tYXRyaXg0eDQgTWF0OworCit2b2lkIGluaXQoKSB7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkoJk1hdCk7Cit9CisKK3ZvaWQgc2V0TWF0cml4KHJzX21hdHJpeDR4NCBtKSB7CisgICAgTWF0ID0gbTsKK30KKwordWNoYXI0IF9fYXR0cmlidXRlX18oKGtlcm5lbCkpIHJvb3QodWNoYXI0IGluKSB7CisgICAgZmxvYXQ0IGYgPSBjb252ZXJ0X2Zsb2F0NChpbik7CisgICAgZiA9IHJzTWF0cml4TXVsdGlwbHkoJk1hdCwgZik7CisgICAgZiA9IGNsYW1wKGYsIDAuZiwgMjU1LmYpOworICAgIHJldHVybiBjb252ZXJ0X3VjaGFyNChmKTsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9jb250cmFzdC5ycyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvY29udHJhc3QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3NDNkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvY29udHJhc3QucnMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpcC5yc2giCisKK3N0YXRpYyBmbG9hdCBicmlnaHRNID0gMC5mOworc3RhdGljIGZsb2F0IGJyaWdodEMgPSAwLmY7CisKK3ZvaWQgc2V0QnJpZ2h0KGZsb2F0IHYpIHsKKyAgICBicmlnaHRNID0gcG93KDIuZiwgdiAvIDEwMC5mKTsKKyAgICBicmlnaHRDID0gMTI3LmYgLSBicmlnaHRNICogMTI3LmY7Cit9CisKK3ZvaWQgY29udHJhc3QoY29uc3QgdWNoYXI0ICppbiwgdWNoYXI0ICpvdXQpCit7CisjaWYgMAorICAgIG91dC0+ciA9IHJzQ2xhbXAoKGludCkoYnJpZ2h0TSAqIGluLT5yICsgYnJpZ2h0QyksIDAsIDI1NSk7CisgICAgb3V0LT5nID0gcnNDbGFtcCgoaW50KShicmlnaHRNICogaW4tPmcgKyBicmlnaHRDKSwgMCwgMjU1KTsKKyAgICBvdXQtPmIgPSByc0NsYW1wKChpbnQpKGJyaWdodE0gKiBpbi0+YiArIGJyaWdodEMpLCAwLCAyNTUpOworI2Vsc2UKKyAgICBmbG9hdDMgdiA9IGNvbnZlcnRfZmxvYXQzKGluLT5yZ2IpICogYnJpZ2h0TSArIGJyaWdodEM7CisgICAgb3V0LT5yZ2IgPSBjb252ZXJ0X3VjaGFyMyhjbGFtcCh2LCAwLmYsIDI1NS5mKSk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvY29udm9sdmU1eDUuZnMgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2NvbnZvbHZlNXg1LmZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMmE1OTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2NvbnZvbHZlNXg1LmZzCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaXAucnNoIgorCitpbnQzMl90IGdXaWR0aDsKK2ludDMyX3QgZ0hlaWdodDsKK3JzX2FsbG9jYXRpb24gZ0luOworCitmbG9hdCBnQ29lZmZzWzI1XTsKKwordWNoYXI0IF9fYXR0cmlidXRlX18oKGtlcm5lbCkpIHJvb3QodWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHVpbnQzMl90IHgwID0gbWF4KChpbnQzMl90KXgtMiwgMCk7CisgICAgdWludDMyX3QgeDEgPSBtYXgoKGludDMyX3QpeC0xLCAwKTsKKyAgICB1aW50MzJfdCB4MiA9IHg7CisgICAgdWludDMyX3QgeDMgPSBtaW4oKGludDMyX3QpeCsxLCBnV2lkdGgtMSk7CisgICAgdWludDMyX3QgeDQgPSBtaW4oKGludDMyX3QpeCsyLCBnV2lkdGgtMSk7CisKKyAgICB1aW50MzJfdCB5MCA9IG1heCgoaW50MzJfdCl5LTIsIDApOworICAgIHVpbnQzMl90IHkxID0gbWF4KChpbnQzMl90KXktMSwgMCk7CisgICAgdWludDMyX3QgeTIgPSB5OworICAgIHVpbnQzMl90IHkzID0gbWluKChpbnQzMl90KXkrMSwgZ0hlaWdodC0xKTsKKyAgICB1aW50MzJfdCB5NCA9IG1pbigoaW50MzJfdCl5KzIsIGdIZWlnaHQtMSk7CisKKyAgICBmbG9hdDQgcDAgPSBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MCwgeTApKSAqIGdDb2VmZnNbMF0KKyAgICAgICAgICAgICAgKyBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MSwgeTApKSAqIGdDb2VmZnNbMV0KKyAgICAgICAgICAgICAgKyBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MiwgeTApKSAqIGdDb2VmZnNbMl0KKyAgICAgICAgICAgICAgKyBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MywgeTApKSAqIGdDb2VmZnNbM10KKyAgICAgICAgICAgICAgKyBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4NCwgeTApKSAqIGdDb2VmZnNbNF07CisKKyAgICBmbG9hdDQgcDEgPSBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MCwgeTEpKSAqIGdDb2VmZnNbNV0KKyAgICAgICAgICAgICAgKyBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MSwgeTEpKSAqIGdDb2VmZnNbNl0KKyAgICAgICAgICAgICAgKyBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MiwgeTEpKSAqIGdDb2VmZnNbN10KKyAgICAgICAgICAgICAgKyBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MywgeTEpKSAqIGdDb2VmZnNbOF0KKyAgICAgICAgICAgICAgKyBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4NCwgeTEpKSAqIGdDb2VmZnNbOV07CisKKyAgICBmbG9hdDQgcDIgPSBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MCwgeTIpKSAqIGdDb2VmZnNbMTBdCisgICAgICAgICAgICAgICsgY29udmVydF9mbG9hdDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdJbiwgeDEsIHkyKSkgKiBnQ29lZmZzWzExXQorICAgICAgICAgICAgICArIGNvbnZlcnRfZmxvYXQ0KHJzR2V0RWxlbWVudEF0X3VjaGFyNChnSW4sIHgyLCB5MikpICogZ0NvZWZmc1sxMl0KKyAgICAgICAgICAgICAgKyBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MywgeTIpKSAqIGdDb2VmZnNbMTNdCisgICAgICAgICAgICAgICsgY29udmVydF9mbG9hdDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdJbiwgeDQsIHkyKSkgKiBnQ29lZmZzWzE0XTsKKworICAgIGZsb2F0NCBwMyA9IGNvbnZlcnRfZmxvYXQ0KHJzR2V0RWxlbWVudEF0X3VjaGFyNChnSW4sIHgwLCB5MykpICogZ0NvZWZmc1sxNV0KKyAgICAgICAgICAgICAgKyBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MSwgeTMpKSAqIGdDb2VmZnNbMTZdCisgICAgICAgICAgICAgICsgY29udmVydF9mbG9hdDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdJbiwgeDIsIHkzKSkgKiBnQ29lZmZzWzE3XQorICAgICAgICAgICAgICArIGNvbnZlcnRfZmxvYXQ0KHJzR2V0RWxlbWVudEF0X3VjaGFyNChnSW4sIHgzLCB5MykpICogZ0NvZWZmc1sxOF0KKyAgICAgICAgICAgICAgKyBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4NCwgeTMpKSAqIGdDb2VmZnNbMTldOworCisgICAgZmxvYXQ0IHA0ID0gY29udmVydF9mbG9hdDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdJbiwgeDAsIHk0KSkgKiBnQ29lZmZzWzIwXQorICAgICAgICAgICAgICArIGNvbnZlcnRfZmxvYXQ0KHJzR2V0RWxlbWVudEF0X3VjaGFyNChnSW4sIHgxLCB5NCkpICogZ0NvZWZmc1syMV0KKyAgICAgICAgICAgICAgKyBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MiwgeTQpKSAqIGdDb2VmZnNbMjJdCisgICAgICAgICAgICAgICsgY29udmVydF9mbG9hdDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdJbiwgeDMsIHk0KSkgKiBnQ29lZmZzWzIzXQorICAgICAgICAgICAgICArIGNvbnZlcnRfZmxvYXQ0KHJzR2V0RWxlbWVudEF0X3VjaGFyNChnSW4sIHg0LCB5NCkpICogZ0NvZWZmc1syNF07CisKKyAgICBwMCA9IGNsYW1wKHAwICsgcDEgKyBwMiArIHAzICsgcDQsIDAuZiwgMjU1LmYpOworICAgIHJldHVybiBjb252ZXJ0X3VjaGFyNChwMCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9jb3B5LmZzIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9jb3B5LmZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OTU4NzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2NvcHkuZnMKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpcC5yc2giCisKK3VjaGFyNCBfX2F0dHJpYnV0ZV9fKChrZXJuZWwpKSByb290KHVjaGFyNCB2X2luKSB7CisgICAgcmV0dXJuIHZfaW47Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9leHBvc3VyZS5ycyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvZXhwb3N1cmUucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwNWNiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvZXhwb3N1cmUucnMKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpcC5yc2giCisKK3N0YXRpYyBmbG9hdCBicmlnaHQgPSAwLmY7CisKK3ZvaWQgc2V0QnJpZ2h0KGZsb2F0IHYpIHsKKyAgICBicmlnaHQgPSAyNTUuZiAvICgyNTUuZiAtIHYpOworfQorCit2b2lkIGV4cG9zdXJlKGNvbnN0IHVjaGFyNCAqaW4sIHVjaGFyNCAqb3V0KQoreworICAgIG91dC0+ciA9IHJzQ2xhbXAoKGludCkoYnJpZ2h0ICogaW4tPnIpLCAwLCAyNTUpOworICAgIG91dC0+ZyA9IHJzQ2xhbXAoKGludCkoYnJpZ2h0ICogaW4tPmcpLCAwLCAyNTUpOworICAgIG91dC0+YiA9IHJzQ2xhbXAoKGludCkoYnJpZ2h0ICogaW4tPmIpLCAwLCAyNTUpOworfQorCmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2Zpc2hleWUucnNoIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9maXNoZXllLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWFjYjdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9maXNoZXllLnJzaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcnNfYWxsb2NhdGlvbiBpbl9hbGxvYzsKK3JzX3NhbXBsZXIgc2FtcGxlcjsKKworc3RhdGljIGZsb2F0MiBjZW50ZXIsIG5lZ19jZW50ZXIsIGludl9kaW1lbnNpb25zLCBheGlzX3NjYWxlOworc3RhdGljIGZsb2F0IGFscGhhLCByYWRpdXMyLCBmYWN0b3I7CisKK3ZvaWQgaW5pdF9maWx0ZXIodWludDMyX3QgZGltX3gsIHVpbnQzMl90IGRpbV95LCBmbG9hdCBjZW50ZXJfeCwgZmxvYXQgY2VudGVyX3ksIGZsb2F0IGspIHsKKyAgICBjZW50ZXIueCA9IGNlbnRlcl94OworICAgIGNlbnRlci55ID0gY2VudGVyX3k7CisgICAgbmVnX2NlbnRlciA9IC1jZW50ZXI7CisgICAgaW52X2RpbWVuc2lvbnMueCA9IDEuZiAvIChmbG9hdClkaW1feDsKKyAgICBpbnZfZGltZW5zaW9ucy55ID0gMS5mIC8gKGZsb2F0KWRpbV95OworICAgIGFscGhhID0gayAqIDIuMGYgKyAwLjc1ZjsKKworICAgIGF4aXNfc2NhbGUgPSAoZmxvYXQyKTEuZjsKKyAgICBpZiAoZGltX3ggPiBkaW1feSkKKyAgICAgICAgYXhpc19zY2FsZS55ID0gKGZsb2F0KWRpbV95IC8gKGZsb2F0KWRpbV94OworICAgIGVsc2UKKyAgICAgICAgYXhpc19zY2FsZS54ID0gKGZsb2F0KWRpbV94IC8gKGZsb2F0KWRpbV95OworICAgIAorICAgIGNvbnN0IGZsb2F0IGJvdW5kMiA9IDAuMjVmICogKGF4aXNfc2NhbGUueCpheGlzX3NjYWxlLnggKyBheGlzX3NjYWxlLnkqYXhpc19zY2FsZS55KTsKKyAgICBjb25zdCBmbG9hdCBib3VuZCA9IHNxcnQoYm91bmQyKTsKKyAgICBjb25zdCBmbG9hdCByYWRpdXMgPSAxLjE1ZiAqIGJvdW5kOworICAgIHJhZGl1czIgPSByYWRpdXMqcmFkaXVzOworICAgIGNvbnN0IGZsb2F0IG1heF9yYWRpYW4gPSBNX1BJXzIgLSBhdGFuKGFscGhhIC8gYm91bmQgKiBzcXJ0KHJhZGl1czIgLSBib3VuZDIpKTsKKyAgICBmYWN0b3IgPSBib3VuZCAvIG1heF9yYWRpYW47Cit9CisKK3VjaGFyNCBfX2F0dHJpYnV0ZV9fKChrZXJuZWwpKSByb290KHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICAvLyBDb252ZXJ0IHggYW5kIHkgdG8gZmxvYXRpbmcgcG9pbnQgY29vcmRpbmF0ZXMgd2l0aCBjZW50ZXIgYXMgb3JpZ2luCisgICAgY29uc3QgZmxvYXQyIGluQ29vcmQgPSB7KGZsb2F0KXgsIChmbG9hdCl5fTsKKyAgICBjb25zdCBmbG9hdDIgY29vcmQgPSBtYWQoaW5Db29yZCwgaW52X2RpbWVuc2lvbnMsIG5lZ19jZW50ZXIpOworICAgIGNvbnN0IGZsb2F0MiBzY2FsZWRDb29yZCA9IGF4aXNfc2NhbGUgKiBjb29yZDsKKyAgICBjb25zdCBmbG9hdCBkaXN0MiA9IHNjYWxlZENvb3JkLngqc2NhbGVkQ29vcmQueCArIHNjYWxlZENvb3JkLnkqc2NhbGVkQ29vcmQueTsKKyAgICBjb25zdCBmbG9hdCBpbnZfZGlzdCA9IHJzcXJ0KGRpc3QyKTsKKyAgICBjb25zdCBmbG9hdCByYWRpYW4gPSBNX1BJXzIgLSBhdGFuKChhbHBoYSAqIHNxcnQocmFkaXVzMiAtIGRpc3QyKSkgKiBpbnZfZGlzdCk7CisgICAgY29uc3QgZmxvYXQgc2NhbGFyID0gcmFkaWFuICogZmFjdG9yICogaW52X2Rpc3Q7CisgICAgY29uc3QgZmxvYXQyIG5ld19jb29yZCA9IG1hZChjb29yZCwgc2NhbGFyLCBjZW50ZXIpOworICAgIGNvbnN0IGZsb2F0NCBmb3V0ID0gcnNTYW1wbGUoaW5fYWxsb2MsIHNhbXBsZXIsIG5ld19jb29yZCk7CisgICAgcmV0dXJuIHJzUGFja0NvbG9yVG84ODg4KGZvdXQpOworfQorCmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2Zpc2hleWVfYXBwcm94LnJzaCBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvZmlzaGV5ZV9hcHByb3gucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZjBhM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2Zpc2hleWVfYXBwcm94LnJzaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcnNfYWxsb2NhdGlvbiBpbl9hbGxvYzsKK3JzX3NhbXBsZXIgc2FtcGxlcjsKKworc3RhdGljIGZsb2F0MiBjZW50ZXIsIG5lZ19jZW50ZXIsIGludl9kaW1lbnNpb25zLCBheGlzX3NjYWxlOworc3RhdGljIGZsb2F0IGFscGhhLCByYWRpdXMyLCBmYWN0b3I7CisKK3ZvaWQgaW5pdF9maWx0ZXIodWludDMyX3QgZGltX3gsIHVpbnQzMl90IGRpbV95LCBmbG9hdCBjZW50ZXJfeCwgZmxvYXQgY2VudGVyX3ksIGZsb2F0IGspIHsKKyAgICBjZW50ZXIueCA9IGNlbnRlcl94OworICAgIGNlbnRlci55ID0gY2VudGVyX3k7CisgICAgbmVnX2NlbnRlciA9IC1jZW50ZXI7CisgICAgaW52X2RpbWVuc2lvbnMueCA9IDEuZiAvIChmbG9hdClkaW1feDsKKyAgICBpbnZfZGltZW5zaW9ucy55ID0gMS5mIC8gKGZsb2F0KWRpbV95OworICAgIGFscGhhID0gayAqIDIuMGYgKyAwLjc1ZjsKKworICAgIGF4aXNfc2NhbGUgPSAoZmxvYXQyKTEuZjsKKyAgICBpZiAoZGltX3ggPiBkaW1feSkKKyAgICAgICAgYXhpc19zY2FsZS55ID0gKGZsb2F0KWRpbV95IC8gKGZsb2F0KWRpbV94OworICAgIGVsc2UKKyAgICAgICAgYXhpc19zY2FsZS54ID0gKGZsb2F0KWRpbV94IC8gKGZsb2F0KWRpbV95OworCisgICAgY29uc3QgZmxvYXQgYm91bmQyID0gMC4yNWYgKiAoYXhpc19zY2FsZS54KmF4aXNfc2NhbGUueCArIGF4aXNfc2NhbGUueSpheGlzX3NjYWxlLnkpOworICAgIGNvbnN0IGZsb2F0IGJvdW5kID0gc3FydChib3VuZDIpOworICAgIGNvbnN0IGZsb2F0IHJhZGl1cyA9IDEuMTVmICogYm91bmQ7CisgICAgcmFkaXVzMiA9IHJhZGl1cypyYWRpdXM7CisgICAgY29uc3QgZmxvYXQgbWF4X3JhZGlhbiA9IE1fUElfMiAtIGF0YW4oYWxwaGEgLyBib3VuZCAqIHNxcnQocmFkaXVzMiAtIGJvdW5kMikpOworICAgIGZhY3RvciA9IGJvdW5kIC8gbWF4X3JhZGlhbjsKK30KKwordWNoYXI0IF9fYXR0cmlidXRlX18oKGtlcm5lbCkpIHJvb3QodWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIC8vIENvbnZlcnQgeCBhbmQgeSB0byBmbG9hdGluZyBwb2ludCBjb29yZGluYXRlcyB3aXRoIGNlbnRlciBhcyBvcmlnaW4KKyAgICBjb25zdCBmbG9hdDIgaW5Db29yZCA9IHsoZmxvYXQpeCwgKGZsb2F0KXl9OworICAgIGNvbnN0IGZsb2F0MiBjb29yZCA9IG1hZChpbkNvb3JkLCBpbnZfZGltZW5zaW9ucywgbmVnX2NlbnRlcik7CisgICAgY29uc3QgZmxvYXQyIHNjYWxlZENvb3JkID0gYXhpc19zY2FsZSAqIGNvb3JkOworICAgIGNvbnN0IGZsb2F0IGRpc3QyID0gc2NhbGVkQ29vcmQueCpzY2FsZWRDb29yZC54ICsgc2NhbGVkQ29vcmQueSpzY2FsZWRDb29yZC55OworICAgIGNvbnN0IGZsb2F0IGludl9kaXN0ID0gaGFsZl9yc3FydChkaXN0Mik7CisgICAgY29uc3QgZmxvYXQgcmFkaWFuID0gTV9QSV8yIC0gYXRhbigoYWxwaGEgKiBoYWxmX3NxcnQocmFkaXVzMiAtIGRpc3QyKSkgKiBpbnZfZGlzdCk7CisgICAgY29uc3QgZmxvYXQgc2NhbGFyID0gcmFkaWFuICogZmFjdG9yICogaW52X2Rpc3Q7CisgICAgY29uc3QgZmxvYXQyIG5ld19jb29yZCA9IG1hZChjb29yZCwgc2NhbGFyLCBjZW50ZXIpOworICAgIGNvbnN0IGZsb2F0NCBmb3V0ID0gcnNTYW1wbGUoaW5fYWxsb2MsIHNhbXBsZXIsIG5ld19jb29yZCk7CisgICAgcmV0dXJuIHJzUGFja0NvbG9yVG84ODg4KGZvdXQpOworfQorCmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2Zpc2hleWVfYXBwcm94X2Z1bGwucnMgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2Zpc2hleWVfYXBwcm94X2Z1bGwucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2OWZmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvZmlzaGV5ZV9hcHByb3hfZnVsbC5ycwpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImlwLnJzaCIKKworI2luY2x1ZGUgImZpc2hleWVfYXBwcm94LnJzaCIKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9maXNoZXllX2FwcHJveF9yZWxheGVkLmZzIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9maXNoZXllX2FwcHJveF9yZWxheGVkLmZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNjlmZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2Zpc2hleWVfYXBwcm94X3JlbGF4ZWQuZnMKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpcC5yc2giCisKKyNpbmNsdWRlICJmaXNoZXllX2FwcHJveC5yc2giCisKZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvZmlzaGV5ZV9mdWxsLnJzIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9maXNoZXllX2Z1bGwucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4NmI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvZmlzaGV5ZV9mdWxsLnJzCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaXAucnNoIgorCisjaW5jbHVkZSAiZmlzaGV5ZS5yc2giCisKZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvZmlzaGV5ZV9yZWxheGVkLmZzIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9maXNoZXllX3JlbGF4ZWQuZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4NmI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvZmlzaGV5ZV9yZWxheGVkLmZzCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaXAucnNoIgorCisjaW5jbHVkZSAiZmlzaGV5ZS5yc2giCisKZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvZ3JhaW4uZnMgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2dyYWluLmZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjJjZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2dyYWluLmZzCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaXAucnNoIgorCit1Y2hhciBfX2F0dHJpYnV0ZV9fKChrZXJuZWwpKSBnZW5SYW5kKCkgeworICAgIHJldHVybiAodWNoYXIpcnNSYW5kKDB4ZmYpOworfQorCisvKgorICogQ29udm9sdXRpb24gbWF0cml4IG9mIGRpc3RhbmNlIDIgd2l0aCBmaXhlZCBwb2ludCBvZiAna1NoaWZ0Qml0cycgYml0cworICogc2hpZnRlZC4gVGh1cyB0aGUgc3VtIG9mIHRoaXMgbWF0cml4IHNob3VsZCBiZSAna1NoaWZ0VmFsdWUnLiBFbnRyaWVzIG9mCisgKiBzbWFsbCB2YWx1ZXMgYXJlIG5vdCBjYWxjdWxhdGVkIHRvIGdhaW4gZWZmaWNpZW5jeS4KKyAqIFRoZSBvcmRlciBvdCBwaXhlbHMgcmVwcmVzZW50ZWQgaW4gdGhpcyBtYXRyaXggaXM6CisgKiAgMSAgMiAgMworICogIDQgIDAgIDUKKyAqICA2ICA3ICA4CisgKiAgYW5kIHRoZSBtYXRyaXggc2hvdWxkIGJlOiB7MjMwLCA1NiwgMTE0LCA1NiwgMTE0LCAxMTQsIDU2LCAxMTQsIDU2fS4KKyAqICBIb3dldmVyLCBzaW5jZSBtb3N0IG9mIHRoZSB2YWx1cyBhcmUgaWRlbnRpY2FsLCB3ZSBvbmx5IHVzZSB0aGUgZmlyc3QgdGhyZWUKKyAqICBlbnRyaWVzIGFuZCB0aGUgZW50cmllcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwaXhlbHMgaXM6CisgKiAgMSAgMiAgMQorICogIDIgIDAgIDIKKyAqICAxICAyICAxCisgKi8KKworaW50MzJfdCBnV01hc2s7CitpbnQzMl90IGdITWFzazsKKworcnNfYWxsb2NhdGlvbiBnQmxlbmRTb3VyY2U7Cit1Y2hhciBfX2F0dHJpYnV0ZV9fKChrZXJuZWwpKSBibGVuZDkodWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHVpbnQzMl90IHgxID0gKHgtMSkgJiBnV01hc2s7CisgICAgdWludDMyX3QgeDIgPSAoeCsxKSAmIGdXTWFzazsKKyAgICB1aW50MzJfdCB5MSA9ICh5LTEpICYgZ0hNYXNrOworICAgIHVpbnQzMl90IHkyID0gKHkrMSkgJiBnSE1hc2s7CisKKyAgICB1aW50IHAwMCA9IDU2ICogIHJzR2V0RWxlbWVudEF0X3VjaGFyKGdCbGVuZFNvdXJjZSwgeDEsIHkxKTsKKyAgICB1aW50IHAwMSA9IDExNCAqIHJzR2V0RWxlbWVudEF0X3VjaGFyKGdCbGVuZFNvdXJjZSwgeCwgeTEpOworICAgIHVpbnQgcDAyID0gNTYgKiAgcnNHZXRFbGVtZW50QXRfdWNoYXIoZ0JsZW5kU291cmNlLCB4MiwgeTEpOworICAgIHVpbnQgcDEwID0gMTE0ICogcnNHZXRFbGVtZW50QXRfdWNoYXIoZ0JsZW5kU291cmNlLCB4MSwgeSk7CisgICAgdWludCBwMTEgPSAyMzAgKiByc0dldEVsZW1lbnRBdF91Y2hhcihnQmxlbmRTb3VyY2UsIHgsIHkpOworICAgIHVpbnQgcDEyID0gMTE0ICogcnNHZXRFbGVtZW50QXRfdWNoYXIoZ0JsZW5kU291cmNlLCB4MiwgeSk7CisgICAgdWludCBwMjAgPSA1NiAqICByc0dldEVsZW1lbnRBdF91Y2hhcihnQmxlbmRTb3VyY2UsIHgxLCB5Mik7CisgICAgdWludCBwMjEgPSAxMTQgKiByc0dldEVsZW1lbnRBdF91Y2hhcihnQmxlbmRTb3VyY2UsIHgsIHkyKTsKKyAgICB1aW50IHAyMiA9IDU2ICogIHJzR2V0RWxlbWVudEF0X3VjaGFyKGdCbGVuZFNvdXJjZSwgeDIsIHkyKTsKKworICAgIHAwMCArPSBwMDE7CisgICAgcDAyICs9IHAxMDsKKyAgICBwMTEgKz0gcDEyOworICAgIHAyMCArPSBwMjE7CisKKyAgICBwMjIgKz0gcDAwOworICAgIHAwMiArPSBwMTE7CisKKyAgICBwMjAgKz0gcDIyOworICAgIHAyMCArPSBwMDI7CisKKyAgICBwMjAgPSBtaW4ocDIwID4+IDEwLCAodWludCkyNTUpOworICAgIHJldHVybiAodWNoYXIpcDIwOworfQorCitmbG9hdCBnTm9pc2VTdHJlbmd0aDsKKworcnNfYWxsb2NhdGlvbiBnTm9pc2U7Cit1Y2hhcjQgX19hdHRyaWJ1dGVfXygoa2VybmVsKSkgcm9vdCh1Y2hhcjQgaW4sIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICBmbG9hdDQgaXAgPSBjb252ZXJ0X2Zsb2F0NChpbik7CisgICAgZmxvYXQgcG5vaXNlID0gKGZsb2F0KSByc0dldEVsZW1lbnRBdF91Y2hhcihnTm9pc2UsIHggJiBnV01hc2ssIHkgJiBnSE1hc2spOworCisgICAgZmxvYXQgZW5lcmd5X2xldmVsID0gaXAuciArIGlwLmcgKyBpcC5iOworICAgIGZsb2F0IGVuZXJneV9tYXNrID0gKDI4LmYgLSBzcXJ0KGVuZXJneV9sZXZlbCkpICogMC4wMzU3MWY7CisgICAgcG5vaXNlID0gKHBub2lzZSAtIDEyOC5mKSAqIGVuZXJneV9tYXNrOworCisgICAgaXAgKz0gcG5vaXNlICogZ05vaXNlU3RyZW5ndGg7CisgICAgaXAgPSBjbGFtcChpcCwgMC5mLCAyNTUuZik7CisKKyAgICB1Y2hhcjQgcCA9IGNvbnZlcnRfdWNoYXI0KGlwKTsKKyAgICBwLmEgPSAweGZmOworICAgIHJldHVybiBwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9ncmV5c2NhbGUuZnMgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2dyZXlzY2FsZS5mcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTEzMDcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9ncmV5c2NhbGUuZnMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpcC5yc2giCisKK2NvbnN0IHN0YXRpYyBmbG9hdDMgZ01vbm9NdWx0ID0gezAuMjk5ZiwgMC41ODdmLCAwLjExNGZ9OworCit1Y2hhcjQgX19hdHRyaWJ1dGVfXygoa2VybmVsKSkgcm9vdCh1Y2hhcjQgdl9pbikgeworICAgIGZsb2F0NCBmNCA9IHJzVW5wYWNrQ29sb3I4ODg4KHZfaW4pOworCisgICAgZmxvYXQzIG1vbm8gPSBkb3QoZjQucmdiLCBnTW9ub011bHQpOworICAgIHJldHVybiByc1BhY2tDb2xvclRvODg4OChtb25vKTsKK30KKwordWNoYXIgX19hdHRyaWJ1dGVfXygoa2VybmVsKSkgdG9VOCh1Y2hhcjQgdl9pbikgeworICAgIGZsb2F0NCBmNCA9IGNvbnZlcnRfZmxvYXQ0KHZfaW4pOworICAgIHJldHVybiAodWNoYXIpZG90KGY0LnJnYiwgZ01vbm9NdWx0KTsKK30KKwordWNoYXI0IF9fYXR0cmlidXRlX18oKGtlcm5lbCkpIHRvVThfNCh1Y2hhciB2X2luKSB7CisgICAgcmV0dXJuICh1Y2hhcjQpdl9pbjsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9pcC5yc2ggYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2lwLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGUyMTNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9pcC5yc2gKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgdmVyc2lvbigxKQorI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy5pbWFnZTIpCisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9pcDJfY29udm9sdmUzeDMucnMgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2lwMl9jb252b2x2ZTN4My5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzdlODZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9pcDJfY29udm9sdmUzeDMucnMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpcC5yc2giCisKK2ludDMyX3QgZ1dpZHRoOworaW50MzJfdCBnSGVpZ2h0OworcnNfYWxsb2NhdGlvbiBnSW47CisKK2Zsb2F0IGdDb2VmZnNbOV07CisKK3VjaGFyNCBfX2F0dHJpYnV0ZV9fKChrZXJuZWwpKSByb290KHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICB1aW50MzJfdCB4MSA9IG1pbigoaW50MzJfdCl4KzEsIGdXaWR0aC0xKTsKKyAgICB1aW50MzJfdCB4MiA9IG1heCgoaW50MzJfdCl4LTEsIDApOworICAgIHVpbnQzMl90IHkxID0gbWluKChpbnQzMl90KXkrMSwgZ0hlaWdodC0xKTsKKyAgICB1aW50MzJfdCB5MiA9IG1heCgoaW50MzJfdCl5LTEsIDApOworCisgICAgZmxvYXQ0IHAwMCA9IGNvbnZlcnRfZmxvYXQ0KHJzR2V0RWxlbWVudEF0X3VjaGFyNChnSW4sIHgxLCB5MSkpOworICAgIGZsb2F0NCBwMDEgPSBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4LCB5MSkpOworICAgIGZsb2F0NCBwMDIgPSBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MiwgeTEpKTsKKyAgICBmbG9hdDQgcDEwID0gY29udmVydF9mbG9hdDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdJbiwgeDEsIHkpKTsKKyAgICBmbG9hdDQgcDExID0gY29udmVydF9mbG9hdDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdJbiwgeCwgeSkpOworICAgIGZsb2F0NCBwMTIgPSBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MiwgeSkpOworICAgIGZsb2F0NCBwMjAgPSBjb252ZXJ0X2Zsb2F0NChyc0dldEVsZW1lbnRBdF91Y2hhcjQoZ0luLCB4MSwgeTIpKTsKKyAgICBmbG9hdDQgcDIxID0gY29udmVydF9mbG9hdDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdJbiwgeCwgeTIpKTsKKyAgICBmbG9hdDQgcDIyID0gY29udmVydF9mbG9hdDQocnNHZXRFbGVtZW50QXRfdWNoYXI0KGdJbiwgeDIsIHkyKSk7CisgICAgcDAwICo9IGdDb2VmZnNbMF07CisgICAgcDAxICo9IGdDb2VmZnNbMV07CisgICAgcDAyICo9IGdDb2VmZnNbMl07CisgICAgcDEwICo9IGdDb2VmZnNbM107CisgICAgcDExICo9IGdDb2VmZnNbNF07CisgICAgcDEyICo9IGdDb2VmZnNbNV07CisgICAgcDIwICo9IGdDb2VmZnNbNl07CisgICAgcDIxICo9IGdDb2VmZnNbN107CisgICAgcDIyICo9IGdDb2VmZnNbOF07CisKKyAgICBwMDAgKz0gcDAxOworICAgIHAwMiArPSBwMTA7CisgICAgcDExICs9IHAxMjsKKyAgICBwMjAgKz0gcDIxOworCisgICAgcDIyICs9IHAwMDsKKyAgICBwMDIgKz0gcDExOworCisgICAgcDIwICs9IHAyMjsKKyAgICBwMjAgKz0gcDAyOworCisgICAgcDIwID0gY2xhbXAocDIwLCAwLmYsIDI1NS5mKTsKKyAgICByZXR1cm4gY29udmVydF91Y2hhcjQocDIwKTsKK30KKworCmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2xldmVscy5yc2ggYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2xldmVscy5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI4OTkwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvbGV2ZWxzLnJzaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworZmxvYXQgaW5CbGFjazsKK2Zsb2F0IG91dEJsYWNrOworZmxvYXQgaW5XTWluSW5COworZmxvYXQgb3V0V01pbk91dEI7CitmbG9hdCBvdmVySW5XTWluSW5COworcnNfbWF0cml4M3gzIGNvbG9yTWF0OworCit1Y2hhcjQgX19hdHRyaWJ1dGVfXygoa2VybmVsKSkgcm9vdCh1Y2hhcjQgaW4sIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICB1Y2hhcjQgb3V0OworICAgIGZsb2F0MyBwaXhlbCA9IGNvbnZlcnRfZmxvYXQ0KGluKS5yZ2I7CisgICAgcGl4ZWwgPSByc01hdHJpeE11bHRpcGx5KCZjb2xvck1hdCwgcGl4ZWwpOworICAgIHBpeGVsID0gY2xhbXAocGl4ZWwsIDAuZiwgMjU1LmYpOworICAgIHBpeGVsID0gKHBpeGVsIC0gaW5CbGFjaykgKiBvdmVySW5XTWluSW5COworICAgIHBpeGVsID0gcGl4ZWwgKiBvdXRXTWluT3V0QiArIG91dEJsYWNrOworICAgIHBpeGVsID0gY2xhbXAocGl4ZWwsIDAuZiwgMjU1LmYpOworICAgIG91dC54eXogPSBjb252ZXJ0X3VjaGFyMyhwaXhlbCk7CisgICAgb3V0LncgPSAweGZmOworICAgIHJldHVybiBvdXQ7Cit9CisKK3VjaGFyNCBfX2F0dHJpYnV0ZV9fKChrZXJuZWwpKSByb290NCh1Y2hhcjQgaW4sIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICBmbG9hdDQgcGl4ZWwgPSBjb252ZXJ0X2Zsb2F0NChpbik7CisgICAgcGl4ZWwucmdiID0gcnNNYXRyaXhNdWx0aXBseSgmY29sb3JNYXQsIHBpeGVsLnJnYik7CisgICAgcGl4ZWwgPSBjbGFtcChwaXhlbCwgMC5mLCAyNTUuZik7CisgICAgcGl4ZWwgPSAocGl4ZWwgLSBpbkJsYWNrKSAqIG92ZXJJbldNaW5JbkI7CisgICAgcGl4ZWwgPSBwaXhlbCAqIG91dFdNaW5PdXRCICsgb3V0QmxhY2s7CisgICAgcGl4ZWwgPSBjbGFtcChwaXhlbCwgMC5mLCAyNTUuZik7CisgICAgcmV0dXJuIGNvbnZlcnRfdWNoYXI0KHBpeGVsKTsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9sZXZlbHNfZnVsbC5ycyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvbGV2ZWxzX2Z1bGwucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1OTZiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvbGV2ZWxzX2Z1bGwucnMKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpcC5yc2giCisKKyNpbmNsdWRlICJsZXZlbHMucnNoIgorCmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL2xldmVsc19yZWxheGVkLmZzIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9sZXZlbHNfcmVsYXhlZC5mcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODU5NmJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9sZXZlbHNfcmVsYXhlZC5mcwpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImlwLnJzaCIKKworI2luY2x1ZGUgImxldmVscy5yc2giCisKZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvbWFuZGVsYnJvdC5ycyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvbWFuZGVsYnJvdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTBiZDAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy9tYW5kZWxicm90LnJzCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiaXAucnNoIgorCit1aW50MzJfdCBnTWF4SXRlcmF0aW9uID0gNTAwOwordWludDMyX3QgZ0RpbVggPSAxMDI0OwordWludDMyX3QgZ0RpbVkgPSAxMDI0OworCitmbG9hdCBsb3dlckJvdW5kWCA9IC0yLmY7CitmbG9hdCBsb3dlckJvdW5kWSA9IC0yLmY7CitmbG9hdCBzY2FsZUZhY3RvciA9IDQuZjsKKwordWNoYXI0IF9fYXR0cmlidXRlX18oKGtlcm5lbCkpIHJvb3QodWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICBmbG9hdDIgcDsKKyAgcC54ID0gbG93ZXJCb3VuZFggKyAoKGZsb2F0KXggLyBnRGltWCkgKiBzY2FsZUZhY3RvcjsKKyAgcC55ID0gbG93ZXJCb3VuZFkgKyAoKGZsb2F0KXkgLyBnRGltWSkgKiBzY2FsZUZhY3RvcjsKKworICBmbG9hdDIgdCA9IDA7CisgIGZsb2F0MiB0MiA9IHQgKiB0OworICBpbnQgaXRlciA9IDA7CisgIHdoaWxlKCh0Mi54ICsgdDIueSA8IDQuZikgJiYgKGl0ZXIgPCBnTWF4SXRlcmF0aW9uKSkgeworICAgIGZsb2F0IHh0ZW1wID0gdDIueCAtIHQyLnkgKyBwLng7CisgICAgdC55ID0gMiAqIHQueCAqIHQueSArIHAueTsKKyAgICB0LnggPSB4dGVtcDsKKyAgICBpdGVyKys7CisgICAgdDIgPSB0ICogdDsKKyAgfQorCisgIGlmKGl0ZXIgPj0gZ01heEl0ZXJhdGlvbikgeworICAgIC8vIHdyaXRlIGEgbm9uLXRyYW5zcGFyZW50IGJsYWNrIHBpeGVsCisgICAgcmV0dXJuICh1Y2hhcjQpezAsIDAsIDAsIDB4ZmZ9OworICB9IGVsc2UgeworICAgIGZsb2F0IG1pMyA9IGdNYXhJdGVyYXRpb24gLyAzLmY7CisgICAgaWYgKGl0ZXIgPD0gKGdNYXhJdGVyYXRpb24gLyAzKSkKKyAgICAgIHJldHVybiAodWNoYXI0KXsweGZmICogKGl0ZXIgLyBtaTMpLCAwLCAwLCAweGZmfTsKKyAgICBlbHNlIGlmIChpdGVyIDw9ICgoKGdNYXhJdGVyYXRpb24gLyAzKSAqIDIpKSkKKyAgICAgIHJldHVybiAodWNoYXI0KXsweGZmIC0gKDB4ZmYgKiAoKGl0ZXIgLSBtaTMpIC8gbWkzKSksCisgICAgICAgICAgICAgICAgICAgICAgKDB4ZmYgKiAoKGl0ZXIgLSBtaTMpIC8gbWkzKSksIDAsIDB4ZmZ9OworICAgIGVsc2UKKyAgICAgIHJldHVybiAodWNoYXI0KXswLCAweGZmIC0gKDB4ZmYgKiAoKGl0ZXIgLSAobWkzICogMikpIC8gbWkzKSksCisgICAgICAgICAgICAgICAgICAgICAgKDB4ZmYgKiAoKGl0ZXIgLSAobWkzICogMikpIC8gbWkzKSksIDB4ZmZ9OworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL3NoYWRvd3MucnMgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL3NoYWRvd3MucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjMTQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvc2hhZG93cy5ycwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpcC5yc2giCisvLyNwcmFnbWEgcnNfZnBfcmVsYXhlZAorCitzdGF0aWMgZG91YmxlIHNoYWRvd0ZpbHRlck1hcFtdID0geworICAgIC0wLjAwNTkxLCAgMC4wMDAxLAorICAgICAxLjE2NDg4LCAgMC4wMTY2OCwKKyAgICAtMC4xODAyNywgLTAuMDY3OTEsCisgICAgLTAuMTI2MjUsICAwLjA5MDAxLAorICAgICAwLjE1MDY1LCAtMC4wMzg5NworfTsKKworc3RhdGljIGRvdWJsZSBwb2x5W10gPSB7CisgICAgMC4sIDAuLAorICAgIDAuLCAwLiwKKyAgICAwLgorfTsKKworc3RhdGljIGNvbnN0IGludCBBQklUUyA9IDQ7CitzdGF0aWMgY29uc3QgaW50IEhTQ0FMRSA9IDI1NjsKK3N0YXRpYyBjb25zdCBpbnQgazE9MjU1IDw8IEFCSVRTOworc3RhdGljIGNvbnN0IGludCBrMj1IU0NBTEUgPDwgQUJJVFM7CisKK3N0YXRpYyBkb3VibGUgZmFzdGV2YWxQb2x5KGRvdWJsZSAqcG9seSxpbnQgbiwgZG91YmxlIHgpeworCisgICAgZG91YmxlIGYgPXg7CisgICAgZG91YmxlIHN1bSA9IHBvbHlbMF0rcG9seVsxXSpmOworICAgIGludCBpOworICAgIGZvciAoaSA9IDI7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZio9eDsKKyAgICAgICAgc3VtICs9IHBvbHlbaV0qZjsKKyAgICB9CisgICAgcmV0dXJuIHN1bTsKK30KKworc3RhdGljIHVzaG9ydDMgcmdiMmhzdiggdWNoYXI0IHJnYikKK3sKKyAgICBpbnQgaU1pbixpTWF4LGNocm9tYTsKKworICAgIGludCByaSA9IHJnYi5yOworICAgIGludCBnaSA9IHJnYi5nOworICAgIGludCBiaSA9IHJnYi5iOworICAgIHNob3J0IHJ2LHJzLHJoOworCisgICAgaWYgKHJpID4gZ2kpIHsKKyAgICAgICAgaU1heCA9IG1heCAocmksIGJpKTsKKyAgICAgICAgaU1pbiA9IG1pbiAoZ2ksIGJpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpTWF4ID0gbWF4IChnaSwgYmkpOworICAgICAgICBpTWluID0gbWluIChyaSwgYmkpOworICAgIH0KKworICAgIGNocm9tYSA9IGlNYXggLSBpTWluOworICAgIC8vIHNldCB2YWx1ZQorICAgIHJ2ID0gKHNob3J0KSggaU1heCA8PCBBQklUUyk7CisKKyAgICAvLyBzZXQgc2F0dXJhdGlvbgorICAgIGlmIChydiA9PSAwKQorICAgICAgICBycyA9IDA7CisgICAgZWxzZQorICAgICAgICBycyA9IChzaG9ydCkoKGsxKmNocm9tYSkvaU1heCk7CisKKyAgICAvLyBzZXQgaHVlCisgICAgaWYgKHJzID09IDApCisgICAgICAgIHJoID0gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCByaSA9PSBpTWF4ICkgeworICAgICAgICAgICAgcmggID0gKHNob3J0KSggKGsyKig2KmNocm9tYStnaSAtIGJpKSkvKDYqY2hyb21hKSk7CisgICAgICAgICAgICBpZiAocmggPj0gazIpIHJoIC09IGsyOworICAgICAgICB9IGVsc2UgaWYgKGdpICA9PSBpTWF4KQorICAgICAgICAgICAgcmggID0gKHNob3J0KSggKGsyKigyKmNocm9tYStiaSAtIHJpICkpLyg2KmNocm9tYSkpOworICAgICAgICBlbHNlIC8vIChiaSA9PSBpTWF4ICkKKyAgICAgICAgICAgICAgICAgICAgcmggID0gKHNob3J0KSggKGsyKig0KmNocm9tYStyaSAtIGdpICkpLyg2KmNocm9tYSkpOworICAgIH0KKworICAgIHVzaG9ydDMgb3V0OworICAgIG91dC54ID0gcnY7CisgICAgb3V0LnkgPSByczsKKyAgICBvdXQueiA9IHJoOworICAgIHJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyB1Y2hhcjQgaHN2MnJnYih1c2hvcnQzIGhzdikKK3sKKyAgICBpbnQgQUJJVFMgPSA0OworICAgIGludCBIU0NBTEUgPSAyNTY7CisgICAgaW50IG07CisgICAgaW50IEgsWCxpaCxpcyxpdjsKKyAgICBpbnQgazE9MjU1PDxBQklUUzsKKyAgICBpbnQgazI9SFNDQUxFPDxBQklUUzsKKyAgICBpbnQgazM9MTw8KEFCSVRTLTEpOworICAgIGludCBycj0wOworICAgIGludCByZz0wOworICAgIGludCByYj0wOworICAgIHNob3J0IGN2ID0gaHN2Lng7CisgICAgc2hvcnQgY3MgPSBoc3YueTsKKyAgICBzaG9ydCBjaCA9IGhzdi56OworCisgICAgLy8gc2V0IGNocm9tYSBhbmQgbWluIGNvbXBvbmVudCB2YWx1ZSBtCisgICAgLy9jaHJvbWEgPSAoIGN2ICogY3MgKS9rMTsKKyAgICAvL20gPSBjdiAtIGNocm9tYTsKKyAgICBtID0gKChpbnQpY3YqKGsxIC0gKGludCljcyApKS9rMTsKKworICAgIC8vIGNocm9tYSAgPT0gMCA8LT4gY3MgPT0gMCAtLT4gbT1jdgorICAgIGlmIChjcyA9PSAwKSB7CisgICAgICAgIHJiID0gKCByZyA9ICggcnIgPSggY3YgPj4gQUJJVFMpICkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGloPShpbnQpY2g7CisgICAgICAgIGlzPShpbnQpY3M7CisgICAgICAgIGl2PShpbnQpY3Y7CisKKyAgICAgICAgSCA9ICg2KmloKS9rMjsKKyAgICAgICAgWCA9ICgoaXYqaXMpL2syKSooazItIGFicyg2KmloLSAyKihIPj4xKSprMiAtIGsyKSkgOworCisgICAgICAgIC8vIHJlbW92aW5nIGFkZGl0aW9uYWwgYml0cyAtLT4gdW5pdDgKKyAgICAgICAgWD0oIChYK2l2KihrMSAtIGlzICkpL2sxICsgazMgKSA+PiBBQklUUzsKKyAgICAgICAgbT1tID4+IEFCSVRTOworCisgICAgICAgIC8vICggY2hyb21hICsgbSApIC0tPiBjdiA7CisgICAgICAgIGN2PShzaG9ydCkgKGN2ID4+IEFCSVRTKTsKKyAgICAgICAgc3dpdGNoIChIKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJyID0gY3Y7CisgICAgICAgICAgICByZyA9IFg7CisgICAgICAgICAgICByYiA9IG07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcnIgPSBYOworICAgICAgICAgICAgcmcgPSBjdjsKKyAgICAgICAgICAgIHJiID0gbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICByciA9IG07CisgICAgICAgICAgICByZyA9IGN2OworICAgICAgICAgICAgcmIgPSBYOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHJyID0gbTsKKyAgICAgICAgICAgIHJnID0gWDsKKyAgICAgICAgICAgIHJiID0gY3Y7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgcnIgPSBYOworICAgICAgICAgICAgcmcgPSBtOworICAgICAgICAgICAgcmIgPSBjdjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICByciA9IGN2OworICAgICAgICAgICAgcmcgPSBtIDsKKyAgICAgICAgICAgIHJiID0gWDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgdWNoYXI0IHJnYjsKKworICAgIHJnYi5yID0gIHJyOworICAgIHJnYi5nID0gIHJnOworICAgIHJnYi5iID0gIHJiOworCisgICAgcmV0dXJuIHJnYjsKK30KKwordm9pZCBwcmVwYXJlU2hhZG93cyhmbG9hdCBzY2FsZSkgeworICAgIGRvdWJsZSBzID0gKHNjYWxlPj0wKT9zY2FsZTpzY2FsZS81OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIHBvbHlbaV0gPSBmYXN0ZXZhbFBvbHkoc2hhZG93RmlsdGVyTWFwK2kqMiwyICwgcyk7CisgICAgfQorfQorCit2b2lkIHNoYWRvd3NLZXJuZWwoY29uc3QgdWNoYXI0ICppbiwgdWNoYXI0ICpvdXQpIHsKKyAgICB1c2hvcnQzIGhzdiA9IHJnYjJoc3YoKmluKTsKKyAgICBkb3VibGUgdiA9IChmYXN0ZXZhbFBvbHkocG9seSw1LGhzdi54LzQwODAuKSo0MDgwKTsKKyAgICBpZiAodj40MDgwKSB2ID0gNDA4MDsKKyAgICBoc3YueCA9ICh1bnNpZ25lZCBzaG9ydCkgKCh2PjApP3Y6MCk7CisgICAgKm91dCA9IGhzdjJyZ2IoaHN2KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvdGhyZXNob2xkLmZzIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy90aHJlc2hvbGQuZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyYzJlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvdGhyZXNob2xkLmZzCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImlwLnJzaCIKKworCitpbnQgaGVpZ2h0OworaW50IHdpZHRoOworc3RhdGljIGludCByYWRpdXM7CisKK3JzX2FsbG9jYXRpb24gSW5QaXhlbDsKK3JzX2FsbG9jYXRpb24gU2NyYXRjaFBpeGVsMTsKK3JzX2FsbG9jYXRpb24gU2NyYXRjaFBpeGVsMjsKKworY29uc3QgaW50IE1BWF9SQURJVVMgPSAyNTsKKworLy8gU3RvcmUgb3VyIGNvZWZmaWNpZW50cyBoZXJlCitzdGF0aWMgZmxvYXQgZ2F1c3NpYW5bTUFYX1JBRElVUyAqIDIgKyAxXTsKKwordm9pZCBzZXRSYWRpdXMoaW50IHJhZCkgeworICAgIHJhZGl1cyA9IHJhZDsKKyAgICAvLyBDb21wdXRlIGdhdXNzaWFuIHdlaWdodHMgZm9yIHRoZSBibHVyCisgICAgLy8gZSBpcyB0aGUgZXVsZXIncyBudW1iZXIKKyAgICBmbG9hdCBlID0gMi43MTgyODE4Mjg0NTkwNDVmOworICAgIGZsb2F0IHBpID0gMy4xNDE1OTI2NTM1ODk3OTMyZjsKKyAgICAvLyBnKHgpID0gKCAxIC8gc3FydCggMiAqIHBpICkgKiBzaWdtYSkgKiBlIF4gKCAteF4yIC8gMiAqIHNpZ21hXjIgKQorICAgIC8vIHggaXMgb2YgdGhlIGZvcm0gWy1yYWRpdXMgLi4gMCAuLiByYWRpdXNdCisgICAgLy8gYW5kIHNpZ21hIHZhcmllcyB3aXRoIHJhZGl1cy4KKyAgICAvLyBCYXNlZCBvbiBzb21lIGV4cGVyaW1lbnRhbCByYWRpdXMgdmFsdWVzIGFuZCBzaWdtYSdzCisgICAgLy8gd2UgYXBwcm94aW1hdGVseSBmaXQgc2lnbWEgPSBmKHJhZGl1cykgYXMKKyAgICAvLyBzaWdtYSA9IHJhZGl1cyAqIDAuNCAgKyAwLjYKKyAgICAvLyBUaGUgbGFyZ2VyIHRoZSByYWRpdXMgZ2V0cywgdGhlIG1vcmUgb3VyIGdhdXNzaWFuIGJsdXIKKyAgICAvLyB3aWxsIHJlc2VtYmxlIGEgYm94IGJsdXIgc2luY2Ugd2l0aCBsYXJnZSBzaWdtYQorICAgIC8vIHRoZSBnYXVzc2lhbiBjdXJ2ZSBiZWdpbnMgdG8gbG9zZSBpdHMgc2hhcGUKKyAgICBmbG9hdCBzaWdtYSA9IDAuNGYgKiAoZmxvYXQpcmFkaXVzICsgMC42ZjsKKworICAgIC8vIE5vdyBjb21wdXRlIHRoZSBjb2VmZmljaW50cworICAgIC8vIFdlIHdpbGwgc3RvcmUgc29tZSByZWR1bmRhbnQgdmFsdWVzIHRvIHNhdmUgc29tZSBtYXRoIGR1cmluZworICAgIC8vIHRoZSBibHVyIGNhbGN1bGF0aW9ucworICAgIC8vIHByZWNvbXB1dGUgc29tZSB2YWx1ZXMKKyAgICBmbG9hdCBjb2VmZjEgPSAxLjBmIC8gKHNxcnQoIDIuMGYgKiBwaSApICogc2lnbWEpOworICAgIGZsb2F0IGNvZWZmMiA9IC0gMS4wZiAvICgyLjBmICogc2lnbWEgKiBzaWdtYSk7CisKKyAgICBmbG9hdCBub3JtYWxpemVGYWN0b3IgPSAwLjBmOworICAgIGZsb2F0IGZsb2F0UiA9IDAuMGY7CisgICAgZm9yIChpbnQgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICBnYXVzc2lhbltyICsgcmFkaXVzXSA9IGNvZWZmMSAqIHBvdyhlLCBmbG9hdFIgKiBmbG9hdFIgKiBjb2VmZjIpOworICAgICAgICBub3JtYWxpemVGYWN0b3IgKz0gZ2F1c3NpYW5bciArIHJhZGl1c107CisgICAgfQorCisgICAgLy9Ob3cgd2UgbmVlZCB0byBub3JtYWxpemUgdGhlIHdlaWdodHMgYmVjYXVzZSBhbGwgb3VyIGNvZWZmaWNpZW50cyBuZWVkIHRvIGFkZCB1cCB0byBvbmUKKyAgICBub3JtYWxpemVGYWN0b3IgPSAxLjBmIC8gbm9ybWFsaXplRmFjdG9yOworICAgIGZvciAoaW50IHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICBmbG9hdFIgPSAoZmxvYXQpcjsKKyAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gKj0gbm9ybWFsaXplRmFjdG9yOworICAgIH0KK30KKworZmxvYXQ0IF9fYXR0cmlidXRlX18oKGtlcm5lbCkpIGNvcHlJbih1Y2hhcjQgaW4pIHsKKyAgICByZXR1cm4gY29udmVydF9mbG9hdDQoaW4pOworfQorCit1Y2hhcjQgX19hdHRyaWJ1dGVfXygoa2VybmVsKSkgdmVydCh1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgZmxvYXQzIGJsdXJyZWRQaXhlbCA9IDA7CisgICAgaW50IGdpID0gMDsKKyAgICB1Y2hhcjQgb3V0OworICAgIGlmICgoeSA+IHJhZGl1cykgJiYgKHkgPCAoaGVpZ2h0IC0gcmFkaXVzKSkpIHsKKyAgICAgICAgZm9yIChpbnQgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICBmbG9hdDQgaSA9IHJzR2V0RWxlbWVudEF0X2Zsb2F0NChTY3JhdGNoUGl4ZWwyLCB4LCB5ICsgcik7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gaS54eXogKiBnYXVzc2lhbltnaSsrXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgaW50IHZhbGlkSCA9IHJzQ2xhbXAoKGludCl5ICsgciwgKGludCkwLCAoaW50KShoZWlnaHQgLSAxKSk7CisgICAgICAgICAgICBmbG9hdDQgaSA9IHJzR2V0RWxlbWVudEF0X2Zsb2F0NChTY3JhdGNoUGl4ZWwyLCB4LCB2YWxpZEgpOworICAgICAgICAgICAgYmx1cnJlZFBpeGVsICs9IGkueHl6ICogZ2F1c3NpYW5bZ2krK107CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQueHl6ID0gY29udmVydF91Y2hhcjMoY2xhbXAoYmx1cnJlZFBpeGVsLCAwLmYsIDI1NS5mKSk7CisgICAgb3V0LncgPSAweGZmOworICAgIHJldHVybiBvdXQ7Cit9CisKK2Zsb2F0NCBfX2F0dHJpYnV0ZV9fKChrZXJuZWwpKSBob3J6KHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICBmbG9hdDQgYmx1cnJlZFBpeGVsID0gMDsKKyAgICBpbnQgZ2kgPSAwOworICAgIGlmICgoeCA+IHJhZGl1cykgJiYgKHggPCAod2lkdGggLSByYWRpdXMpKSkgeworICAgICAgICBmb3IgKGludCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGZsb2F0NCBpID0gcnNHZXRFbGVtZW50QXRfZmxvYXQ0KFNjcmF0Y2hQaXhlbDEsIHggKyByLCB5KTsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBpICogZ2F1c3NpYW5bZ2krK107CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIC8vIFN0ZXBwaW5nIGxlZnQgYW5kIHJpZ2h0IGF3YXkgZnJvbSB0aGUgcGl4ZWwKKyAgICAgICAgICAgIGludCB2YWxpZFggPSByc0NsYW1wKChpbnQpeCArIHIsIChpbnQpMCwgKGludCkod2lkdGggLSAxKSk7CisgICAgICAgICAgICBmbG9hdDQgaSA9IHJzR2V0RWxlbWVudEF0X2Zsb2F0NChTY3JhdGNoUGl4ZWwxLCB2YWxpZFgsIHkpOworICAgICAgICAgICAgYmx1cnJlZFBpeGVsICs9IGkgKiBnYXVzc2lhbltnaSsrXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBibHVycmVkUGl4ZWw7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvdmlicmFuY2UucnMgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL3ZpYnJhbmNlLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNGRlNTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL3ZpYnJhbmNlLnJzCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaXAucnNoIgorCitmbG9hdCB2aWJyYW5jZSA9IDAuZjsKKworc3RhdGljIGNvbnN0IGZsb2F0IFJmID0gMC4yOTk5ZjsKK3N0YXRpYyBjb25zdCBmbG9hdCBHZiA9IDAuNTg3ZjsKK3N0YXRpYyBjb25zdCBmbG9hdCBCZiA9IDAuMTE0ZjsKKworc3RhdGljIGZsb2F0IFMgID0gMC5mOworc3RhdGljIGZsb2F0IE1TID0gMC5mOworc3RhdGljIGZsb2F0IFJ0ID0gMC5mOworc3RhdGljIGZsb2F0IEd0ID0gMC5mOworc3RhdGljIGZsb2F0IEJ0ID0gMC5mOworc3RhdGljIGZsb2F0IFZpYiA9IDAuZjsKKwordm9pZCB2aWJyYW5jZUtlcm5lbChjb25zdCB1Y2hhcjQgKmluLCB1Y2hhcjQgKm91dCkgeworCisgICAgZmxvYXQgUiwgRywgQjsKKworICAgIGludCByID0gaW4tPnI7CisgICAgaW50IGcgPSBpbi0+ZzsKKyAgICBpbnQgYiA9IGluLT5iOworICAgIGZsb2F0IHJlZCA9IChyLW1heChnLCBiKSkvMjU2LmY7CisgICAgZmxvYXQgc3ggPSAoZmxvYXQpKFZpYi8oMStuYXRpdmVfZXhwKC1yZWQqMykpKTsKKyAgICBTID0gc3grMTsKKyAgICBNUyA9IDEuMGYgLSBTOworICAgIFJ0ID0gUmYgKiBNUzsKKyAgICBHdCA9IEdmICogTVM7CisgICAgQnQgPSBCZiAqIE1TOworICAgIGludCB0ID0gKHIgKyBnKSAvIDI7CisgICAgUiA9IHI7CisgICAgRyA9IGc7CisgICAgQiA9IGI7CisKKyAgICBmbG9hdCBSYyA9IFIgKiAoUnQgKyBTKSArIEcgKiBHdCArIEIgKiBCdDsKKyAgICBmbG9hdCBHYyA9IFIgKiBSdCArIEcgKiAoR3QgKyBTKSArIEIgKiBCdDsKKyAgICBmbG9hdCBCYyA9IFIgKiBSdCArIEcgKiBHdCArIEIgKiAoQnQgKyBTKTsKKworICAgIG91dC0+ciA9IHJzQ2xhbXAoUmMsIDAsIDI1NSk7CisgICAgb3V0LT5nID0gcnNDbGFtcChHYywgMCwgMjU1KTsKKyAgICBvdXQtPmIgPSByc0NsYW1wKEJjLCAwLCAyNTUpOworCit9CisKK3ZvaWQgcHJlcGFyZVZpYnJhbmNlKCkgeworCisgICAgVmliID0gdmlicmFuY2UvMTAwLmY7CisgICAgUyAgPSBWaWIgKyAxOworICAgIE1TID0gMS4wZiAtIFM7CisgICAgUnQgPSBSZiAqIE1TOworICAgIEd0ID0gR2YgKiBNUzsKKyAgICBCdCA9IEJmICogTVM7CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvdmlnbmV0dGUucnNoIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy92aWduZXR0ZS5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRjYTFmMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvdmlnbmV0dGUucnNoCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitzdGF0aWMgZmxvYXQyIG5lZ19jZW50ZXIsIGF4aXNfc2NhbGUsIGludl9kaW1lbnNpb25zOworc3RhdGljIGZsb2F0IHNsb3BlZF9uZWdfcmFuZ2UsIHNsb3BlZF9pbnZfbWF4X2Rpc3QsIHNoYWRlLCBvcHBfc2hhZGU7CisKK3ZvaWQgaW5pdF92aWduZXR0ZSh1aW50MzJfdCBkaW1feCwgdWludDMyX3QgZGltX3ksIGZsb2F0IGNlbnRlcl94LCBmbG9hdCBjZW50ZXJfeSwKKyAgICAgICAgZmxvYXQgZGVzaXJlZF9zY2FsZSwgZmxvYXQgZGVzaXJlZF9zaGFkZSwgZmxvYXQgZGVzaXJlZF9zbG9wZSkgeworCisgICAgbmVnX2NlbnRlci54ID0gLWNlbnRlcl94OworICAgIG5lZ19jZW50ZXIueSA9IC1jZW50ZXJfeTsKKyAgICBpbnZfZGltZW5zaW9ucy54ID0gMS5mIC8gKGZsb2F0KWRpbV94OworICAgIGludl9kaW1lbnNpb25zLnkgPSAxLmYgLyAoZmxvYXQpZGltX3k7CisKKyAgICBheGlzX3NjYWxlID0gKGZsb2F0MikxLmY7CisgICAgaWYgKGRpbV94ID4gZGltX3kpCisgICAgICAgIGF4aXNfc2NhbGUueSA9IChmbG9hdClkaW1feSAvIChmbG9hdClkaW1feDsKKyAgICBlbHNlCisgICAgICAgIGF4aXNfc2NhbGUueCA9IChmbG9hdClkaW1feCAvIChmbG9hdClkaW1feTsKKworICAgIGNvbnN0IGZsb2F0IG1heF9kaXN0ID0gMC41ZiAqIGxlbmd0aChheGlzX3NjYWxlKTsKKyAgICBzbG9wZWRfaW52X21heF9kaXN0ID0gZGVzaXJlZF9zbG9wZSAqIDEuZi9tYXhfZGlzdDsKKworICAgIC8vIFJhbmdlIG5lZWRzIHRvIGJlIGJldHdlZW4gMS4zIHRvIDAuNi4gV2hlbiBzY2FsZSBpcyB6ZXJvIHRoZW4gcmFuZ2UgaXMKKyAgICAvLyAxLjMgd2hpY2ggbWVhbnMgbm8gdmlnbmV0dGUgYXQgYWxsIGJlY2F1c2UgdGhlIGx1bWlub3VzaXR5IGRpZmZlcmVuY2UgaXMKKyAgICAvLyBsZXNzIHRoYW4gMS8yNTYuICBFeHBlY3QgaW5wdXQgc2NhbGUgdG8gYmUgYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAgICBjb25zdCBmbG9hdCBuZWdfcmFuZ2UgPSAwLjdmKnNxcnQoZGVzaXJlZF9zY2FsZSkgLSAxLjNmOworICAgIHNsb3BlZF9uZWdfcmFuZ2UgPSBleHAobmVnX3JhbmdlICogZGVzaXJlZF9zbG9wZSk7CisKKyAgICBzaGFkZSA9IGRlc2lyZWRfc2hhZGU7CisgICAgb3BwX3NoYWRlID0gMS5mIC0gZGVzaXJlZF9zaGFkZTsKK30KKwordWNoYXI0IF9fYXR0cmlidXRlX18oKGtlcm5lbCkpIHJvb3QodWNoYXI0IGluLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgLy8gQ29udmVydCB4IGFuZCB5IHRvIGZsb2F0aW5nIHBvaW50IGNvb3JkaW5hdGVzIHdpdGggY2VudGVyIGFzIG9yaWdpbgorICAgIGNvbnN0IGZsb2F0NCBmaW4gPSBjb252ZXJ0X2Zsb2F0NChpbik7CisgICAgY29uc3QgZmxvYXQyIGluQ29vcmQgPSB7KGZsb2F0KXgsIChmbG9hdCl5fTsKKyAgICBjb25zdCBmbG9hdDIgY29vcmQgPSBtYWQoaW5Db29yZCwgaW52X2RpbWVuc2lvbnMsIG5lZ19jZW50ZXIpOworICAgIGNvbnN0IGZsb2F0IHNsb3BlZF9kaXN0X3JhdGlvID0gbGVuZ3RoKGF4aXNfc2NhbGUgKiBjb29yZCkgICogc2xvcGVkX2ludl9tYXhfZGlzdDsKKyAgICBjb25zdCBmbG9hdCBsdW1lbiA9IG9wcF9zaGFkZSArIHNoYWRlIC8gKCAxLjBmICsgc2xvcGVkX25lZ19yYW5nZSAqIGV4cChzbG9wZWRfZGlzdF9yYXRpbykgKTsKKyAgICBmbG9hdDQgZm91dDsKKyAgICBmb3V0LnJnYiA9IGZpbi5yZ2IgKiBsdW1lbjsKKyAgICBmb3V0LncgPSBmaW4udzsKKyAgICByZXR1cm4gY29udmVydF91Y2hhcjQoZm91dCk7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvdmlnbmV0dGVfYXBwcm94LnJzaCBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvdmlnbmV0dGVfYXBwcm94LnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjY4NjIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy92aWduZXR0ZV9hcHByb3gucnNoCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitzdGF0aWMgZmxvYXQyIG5lZ19jZW50ZXIsIGF4aXNfc2NhbGUsIGludl9kaW1lbnNpb25zOworc3RhdGljIGZsb2F0IHNsb3BlZF9uZWdfcmFuZ2UsIHNsb3BlZF9pbnZfbWF4X2Rpc3QsIHNoYWRlLCBvcHBfc2hhZGU7CisKK3ZvaWQgaW5pdF92aWduZXR0ZSh1aW50MzJfdCBkaW1feCwgdWludDMyX3QgZGltX3ksIGZsb2F0IGNlbnRlcl94LCBmbG9hdCBjZW50ZXJfeSwKKyAgICAgICAgZmxvYXQgZGVzaXJlZF9zY2FsZSwgZmxvYXQgZGVzaXJlZF9zaGFkZSwgZmxvYXQgZGVzaXJlZF9zbG9wZSkgeworCisgICAgbmVnX2NlbnRlci54ID0gLWNlbnRlcl94OworICAgIG5lZ19jZW50ZXIueSA9IC1jZW50ZXJfeTsKKyAgICBpbnZfZGltZW5zaW9ucy54ID0gMS5mIC8gKGZsb2F0KWRpbV94OworICAgIGludl9kaW1lbnNpb25zLnkgPSAxLmYgLyAoZmxvYXQpZGltX3k7CisKKyAgICBheGlzX3NjYWxlID0gKGZsb2F0MikxLmY7CisgICAgaWYgKGRpbV94ID4gZGltX3kpCisgICAgICAgIGF4aXNfc2NhbGUueSA9IChmbG9hdClkaW1feSAvIChmbG9hdClkaW1feDsKKyAgICBlbHNlCisgICAgICAgIGF4aXNfc2NhbGUueCA9IChmbG9hdClkaW1feCAvIChmbG9hdClkaW1feTsKKworICAgIGNvbnN0IGZsb2F0IG1heF9kaXN0ID0gMC41ZiAqIGxlbmd0aChheGlzX3NjYWxlKTsKKyAgICBzbG9wZWRfaW52X21heF9kaXN0ID0gZGVzaXJlZF9zbG9wZSAqIDEuZi9tYXhfZGlzdDsKKworICAgIC8vIFJhbmdlIG5lZWRzIHRvIGJlIGJldHdlZW4gMS4zIHRvIDAuNi4gV2hlbiBzY2FsZSBpcyB6ZXJvIHRoZW4gcmFuZ2UgaXMKKyAgICAvLyAxLjMgd2hpY2ggbWVhbnMgbm8gdmlnbmV0dGUgYXQgYWxsIGJlY2F1c2UgdGhlIGx1bWlub3VzaXR5IGRpZmZlcmVuY2UgaXMKKyAgICAvLyBsZXNzIHRoYW4gMS8yNTYuICBFeHBlY3QgaW5wdXQgc2NhbGUgdG8gYmUgYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAgICBjb25zdCBmbG9hdCBuZWdfcmFuZ2UgPSAwLjdmKnNxcnQoZGVzaXJlZF9zY2FsZSkgLSAxLjNmOworICAgIHNsb3BlZF9uZWdfcmFuZ2UgPSBleHAobmVnX3JhbmdlICogZGVzaXJlZF9zbG9wZSk7CisKKyAgICBzaGFkZSA9IGRlc2lyZWRfc2hhZGU7CisgICAgb3BwX3NoYWRlID0gMS5mIC0gZGVzaXJlZF9zaGFkZTsKK30KKwordWNoYXI0IF9fYXR0cmlidXRlX18oKGtlcm5lbCkpIHJvb3QodWNoYXI0IGluLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgLy8gQ29udmVydCB4IGFuZCB5IHRvIGZsb2F0aW5nIHBvaW50IGNvb3JkaW5hdGVzIHdpdGggY2VudGVyIGFzIG9yaWdpbgorICAgIGNvbnN0IGZsb2F0NCBmaW4gPSBjb252ZXJ0X2Zsb2F0NChpbik7CisgICAgY29uc3QgZmxvYXQyIGluQ29vcmQgPSB7KGZsb2F0KXgsIChmbG9hdCl5fTsKKyAgICBjb25zdCBmbG9hdDIgY29vcmQgPSBtYWQoaW5Db29yZCwgaW52X2RpbWVuc2lvbnMsIG5lZ19jZW50ZXIpOworICAgIGNvbnN0IGZsb2F0IHNsb3BlZF9kaXN0X3JhdGlvID0gZmFzdF9sZW5ndGgoYXhpc19zY2FsZSAqIGNvb3JkKSAgKiBzbG9wZWRfaW52X21heF9kaXN0OworICAgIGNvbnN0IGZsb2F0IGx1bWVuID0gb3BwX3NoYWRlICsgc2hhZGUgKiBoYWxmX3JlY2lwKDEuZiArIHNsb3BlZF9uZWdfcmFuZ2UgKiBuYXRpdmVfZXhwKHNsb3BlZF9kaXN0X3JhdGlvKSk7CisgICAgZmxvYXQ0IGZvdXQ7CisgICAgZm91dC5yZ2IgPSBmaW4ucmdiICogbHVtZW47CisgICAgZm91dC53ID0gZmluLnc7CisgICAgcmV0dXJuIGNvbnZlcnRfdWNoYXI0KGZvdXQpOworfQorCmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL3ZpZ25ldHRlX2FwcHJveF9mdWxsLnJzIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy92aWduZXR0ZV9hcHByb3hfZnVsbC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGNiYmM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy92aWduZXR0ZV9hcHByb3hfZnVsbC5ycwpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImlwLnJzaCIKKworI2luY2x1ZGUgInZpZ25ldHRlX2FwcHJveC5yc2giCisKZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvdmlnbmV0dGVfYXBwcm94X3JlbGF4ZWQuZnMgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL3ZpZ25ldHRlX2FwcHJveF9yZWxheGVkLmZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwY2JiYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL3ZpZ25ldHRlX2FwcHJveF9yZWxheGVkLmZzCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaXAucnNoIgorCisjaW5jbHVkZSAidmlnbmV0dGVfYXBwcm94LnJzaCIKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy92aWduZXR0ZV9mdWxsLnJzIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy92aWduZXR0ZV9mdWxsLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMDJjNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL3ZpZ25ldHRlX2Z1bGwucnMKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpcC5yc2giCisKKyNpbmNsdWRlICJ2aWduZXR0ZS5yc2giCisKZGlmZiAtLWdpdCBhL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvdmlnbmV0dGVfcmVsYXhlZC5mcyBiL3Rlc3RzL3JzU3VwcG9ydE1vZGUvc3JjL21haW4vcnMvdmlnbmV0dGVfcmVsYXhlZC5mcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjAyYzVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy92aWduZXR0ZV9yZWxheGVkLmZzCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaXAucnNoIgorCisjaW5jbHVkZSAidmlnbmV0dGUucnNoIgorCmRpZmYgLS1naXQgYS90ZXN0cy9yc1N1cHBvcnRNb2RlL3NyYy9tYWluL3JzL3diYWxhbmNlLnJzIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy93YmFsYW5jZS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjUwNjcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnNTdXBwb3J0TW9kZS9zcmMvbWFpbi9ycy93YmFsYW5jZS5ycwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpcC5yc2giCisvLyNwcmFnbWEgcnNfZnBfcmVsYXhlZAorCitzdGF0aWMgaW50IGhpc3RSWzI1Nl0gPSB7MH0sIGhpc3RHWzI1Nl0gPSB7MH0sIGhpc3RCWzI1Nl0gPSB7MH07CisKK3JzX2FsbG9jYXRpb24gaGlzdG9ncmFtU291cmNlOwordWludDMyX3QgaGlzdG9ncmFtSGVpZ2h0OwordWludDMyX3QgaGlzdG9ncmFtV2lkdGg7CisKK3N0YXRpYyBmbG9hdCBzY2FsZVI7CitzdGF0aWMgZmxvYXQgc2NhbGVHOworc3RhdGljIGZsb2F0IHNjYWxlQjsKKworc3RhdGljIHVjaGFyNCBlc3RpbWF0ZVdoaXRlKCkgeworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBoaXN0UltpXSA9IDA7IGhpc3RHW2ldID0gMDsgaGlzdEJbaV0gPSAwOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBoaXN0b2dyYW1IZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgaGlzdG9ncmFtV2lkdGg7IGorKykgeworICAgICAgICAgICAgdWNoYXI0IGluID0gcnNHZXRFbGVtZW50QXRfdWNoYXI0KGhpc3RvZ3JhbVNvdXJjZSwgaiwgaSk7CisgICAgICAgICAgICBoaXN0Ultpbi5yXSsrOworICAgICAgICAgICAgaGlzdEdbaW4uZ10rKzsKKyAgICAgICAgICAgIGhpc3RCW2luLmJdKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgbWluX3IgPSAtMSwgbWluX2cgPSAtMSwgbWluX2IgPSAtMTsKKyAgICBpbnQgbWF4X3IgPSAgMCwgbWF4X2cgPSAgMCwgbWF4X2IgPSAgMDsKKyAgICBpbnQgc3VtX3IgPSAgMCwgc3VtX2cgPSAgMCwgc3VtX2IgPSAgMDsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMjU1OyBpKyspIHsKKyAgICAgICAgaW50IHIgPSBoaXN0UltpXTsKKyAgICAgICAgaW50IGcgPSBoaXN0R1tpXTsKKyAgICAgICAgaW50IGIgPSBoaXN0QltpXTsKKyAgICAgICAgc3VtX3IgKz0gcjsKKyAgICAgICAgc3VtX2cgKz0gZzsKKyAgICAgICAgc3VtX2IgKz0gYjsKKworICAgICAgICBpZiAocj4wKXsKKyAgICAgICAgICAgIGlmIChtaW5fciA8IDApIG1pbl9yID0gaTsKKyAgICAgICAgICAgIG1heF9yID0gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZz4wKXsKKyAgICAgICAgICAgIGlmIChtaW5fZyA8IDApIG1pbl9nID0gaTsKKyAgICAgICAgICAgIG1heF9nID0gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYj4wKXsKKyAgICAgICAgICAgIGlmIChtaW5fYiA8IDApIG1pbl9iID0gaTsKKyAgICAgICAgICAgIG1heF9iID0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBzdW0xNXIgPSAwLCBzdW0xNWcgPSAwLCBzdW0xNWIgPSAwOworICAgIGludCBjb3VudDE1ciA9IDAsIGNvdW50MTVnID0gMCwgY291bnQxNWIgPSAwOworICAgIGludCB0bXBfciA9IDAsIHRtcF9nID0gMCwgdG1wX2IgPSAwOworCisgICAgZm9yIChpbnQgaSA9IDI1NDsgaSA+MDsgaS0tKSB7CisgICAgICAgIGludCByID0gaGlzdFJbaV07CisgICAgICAgIGludCBnID0gaGlzdEdbaV07CisgICAgICAgIGludCBiID0gaGlzdEJbaV07CisgICAgICAgIHRtcF9yICs9IHI7CisgICAgICAgIHRtcF9nICs9IGc7CisgICAgICAgIHRtcF9iICs9IGI7CisKKyAgICAgICAgaWYgKCh0bXBfciA+IHN1bV9yLzIwKSAmJiAodG1wX3IgPCBzdW1fci81KSkgeworICAgICAgICAgICAgc3VtMTVyICs9IHIqaTsKKyAgICAgICAgICAgIGNvdW50MTVyICs9IHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0bXBfZyA+IHN1bV9nLzIwKSAmJiAodG1wX2cgPCBzdW1fZy81KSkgeworICAgICAgICAgICAgc3VtMTVnICs9IGcqaTsKKyAgICAgICAgICAgIGNvdW50MTVnICs9IGc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0bXBfYiA+IHN1bV9iLzIwKSAmJiAodG1wX2IgPCBzdW1fYi81KSkgeworICAgICAgICAgICAgc3VtMTViICs9IGIqaTsKKyAgICAgICAgICAgIGNvdW50MTViICs9IGI7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHVjaGFyNCBvdXQ7CisKKyAgICBpZiAoKGNvdW50MTVyPjApICYmIChjb3VudDE1Zz4wKSAmJiAoY291bnQxNWI+MCkgKXsKKyAgICAgICAgb3V0LnIgPSBzdW0xNXIvY291bnQxNXI7CisgICAgICAgIG91dC5nID0gc3VtMTVnL2NvdW50MTVnOworICAgICAgICBvdXQuYiA9IHN1bTE1Yi9jb3VudDE1YjsKKyAgICB9ZWxzZSB7CisgICAgICAgIG91dC5yID0gb3V0LmcgPSBvdXQuYiA9IDI1NTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworCit9CisKK3ZvaWQgcHJlcGFyZVdoaXRlQmFsYW5jZSgpIHsKKyAgICB1Y2hhcjQgZXN0aW1hdGlvbiA9IGVzdGltYXRlV2hpdGUoKTsKKyAgICBpbnQgbWluaW11bSA9IG1pbihlc3RpbWF0aW9uLnIsIG1pbihlc3RpbWF0aW9uLmcsIGVzdGltYXRpb24uYikpOworICAgIGludCBtYXhpbXVtID0gbWF4KGVzdGltYXRpb24uciwgbWF4KGVzdGltYXRpb24uZywgZXN0aW1hdGlvbi5iKSk7CisgICAgZmxvYXQgYXZnID0gKG1pbmltdW0gKyBtYXhpbXVtKSAvIDIuZjsKKworICAgIHNjYWxlUiA9ICBhdmcvZXN0aW1hdGlvbi5yOworICAgIHNjYWxlRyA9ICBhdmcvZXN0aW1hdGlvbi5nOworICAgIHNjYWxlQiA9ICBhdmcvZXN0aW1hdGlvbi5iOworCit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNvbnRyYXN0Q2xhbXAoaW50IGMpCit7CisgICAgaW50IE4gPSAyNTU7CisgICAgYyAmPSB+KGMgPj4gMzEpOworICAgIGMgLT0gTjsKKyAgICBjICY9IChjID4+IDMxKTsKKyAgICBjICs9IE47CisgICAgcmV0dXJuICAodW5zaWduZWQgY2hhcikgYzsKK30KKwordm9pZCB3aGl0ZUJhbGFuY2VLZXJuZWwoY29uc3QgdWNoYXI0ICppbiwgdWNoYXI0ICpvdXQpIHsKKyAgICBmbG9hdCBSYyA9ICBpbi0+cipzY2FsZVI7CisgICAgZmxvYXQgR2MgPSAgaW4tPmcqc2NhbGVHOworICAgIGZsb2F0IEJjID0gIGluLT5iKnNjYWxlQjsKKworICAgIG91dC0+ciA9IGNvbnRyYXN0Q2xhbXAoUmMpOworICAgIG91dC0+ZyA9IGNvbnRyYXN0Q2xhbXAoR2MpOworICAgIG91dC0+YiA9IGNvbnRyYXN0Q2xhbXAoQmMpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2FtZU5hbWVkTGlicy9idWlsZC5ncmFkbGUgYi90ZXN0cy9zYW1lTmFtZWRMaWJzL2J1aWxkLmdyYWRsZQppbmRleCBmMjEwZmNmLi5lZjNkMGFhIDEwMDY0NAotLS0gYS90ZXN0cy9zYW1lTmFtZWRMaWJzL2J1aWxkLmdyYWRsZQorKysgYi90ZXN0cy9zYW1lTmFtZWRMaWJzL2J1aWxkLmdyYWRsZQpAQCAtMyw3ICszLDcgQEAKICAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNS4wLVNOQVBTSE9UJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3RpY3RhY3RvZS9idWlsZC5ncmFkbGUgYi90ZXN0cy90aWN0YWN0b2UvYnVpbGQuZ3JhZGxlCmluZGV4IDYyYTQ0MDUuLmI4OTlmOWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3RpY3RhY3RvZS9idWlsZC5ncmFkbGUKKysrIGIvdGVzdHMvdGljdGFjdG9lL2J1aWxkLmdyYWRsZQpAQCAtMyw2ICszLDYgQEAKICAgICAgICAgbWF2ZW4geyB1cmwgJy4uLy4uLy4uLy4uL291dC9ob3N0L2dyYWRsZS9yZXBvJyB9CiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjAuNS4wLVNOQVBTSE9UJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTowLjcuMC1TTkFQU0hPVCcKICAgICB9CiB9Cg==